计算方法实验(四):牛顿迭代法

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;
}

详细报告

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