分类 数学 下的文章

牛顿迭代法

如果求 f(x) = 0, 求根
那么就有x(n+1) = x(n) - (f(x(n))) / f'(x(n)),可以由几何意义理解

如求根号2
则可以设 f(x) = x^2 - 2
f'(x) = 2x
x(n+1) = x(n) - (x(n)^2 - 2) / (2x(n))

cpp代码


#include <bits/stdc++.h>

float newton_iter(float x, float(*f)(float), float(*f_)(float), float eps = 1e-6){
    float xn = x; // 初始化
    float gx;
    int i = 0;
    printf("x(%d) = %f\n", i++, xn);
    while (std::abs(gx = f(xn)) > eps)    {
        float xn_1 = xn - gx / f_(xn);
        xn = xn_1;
        printf("x(%d) = %f\n", i++, xn);
    }
    return xn;
}

int main(){
    auto f = [](float x)->float{
        return x * x - 2;
    };
    auto f_ = [](float x)->float{
        return 2*x;
    };
    std::cout << newton_iter(2, f, f_) << std::endl;
    return 0;
}