計算方法實驗(四):牛頓迭代法

Newton迭代法數學原理

求非線性方程f(x)=0f(x) = 0的根xx^{*},牛頓迭代法計算公式

x0=α x_{0} = \alpha

xn+1=xnf(xn)f(xn) x_{n + 1} = x_{n} - \frac{f(x_{n})}{f^{'}(x_{n})}

n=0,1, n = 0,1,\cdots

一般地,牛頓迭代法具有局部收斂性,爲保證迭代收斂,要求,對充分小的δ>0\delta > 0αO(x,δ)\alpha \in O(x^{*},\delta)。如果f(x)C2[a,b]f(x) \in C^{2}\lbrack a,b\rbrackf(x)=0f(x^{*}) = 0f(x)0f^{'}(x^{*}) \neq 0,那麼,對充分小的δ>0\delta > 0,當αO(x,δ)\alpha \in O(x^{*},\delta)時,由牛頓迭代法計算出的{xn}\{ x_{n}\}收斂於xx^{*},且收斂速度是2階的;如果f(x)Cm[a,b]f(x) \in C^{m}\lbrack a,b\rbrackf(x)=f(x)==f(m1)(x)=0f(x^{*}) = f^{'}(x^{*}) = \cdots = f^{(m - 1)}(x^{*}) = 0f(m)(x)0(m>1)f^{(m)}(x^{*}) \neq 0(m > 1),那麼,對充分小的δ>0\delta > 0,當αO(x,δ)\alpha \in O(x^{*},\delta)時,由牛頓迭代法計算出的{xn}\{ x_{n}\}收斂於xx^{*},且收斂速度是1階的;

問題

利用牛頓迭代法求f(x)=0f(x) = 0的根

輸入:初值α\alpha,精度ε1,ε2\varepsilon_{1},\varepsilon_{2},最大迭代次數NN

輸 出:方程f(x)=0f(x) = 0xx^{*}的近似值或計算失敗標誌

程序流程

核心代碼

#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;

double x, e1, e2;
int n;

double f(double x) { return cos(x) - x; }
double df(double x) { return -sin(x) - 1; }

int main() {
    scanf("%lf%lf%lf%d", &x, &e1, &e2, &n);
    for (int i = 1; i <= n; i++) {
        double F = f(x), DF = df(x);
        if (fabs(F) < e1) {
            printf("%lf", x);
            return 0;
        }
        if (fabs(DF) < e2) {
            printf("Failed");
            return 0;
        }
        double x1 = x - F / DF;
        double tol = fabs(x - x1);
        if (tol < e1) {
            printf("%lf", x1);
            return 0;
        }
        x = x1;
    }
    printf("Failed");
    return 0;
}

詳細報告

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章