跳转至

牛顿迭代法

引入

牛顿迭代法,又叫牛顿-拉夫逊(拉弗森)方法,是牛顿在\(17\)世纪提出的,求解在值域范围内连续单调函数 \(f(x)\) 近似零点的算法,即求方程 \(f(x)=0\) 的近似解。

算法思路

初始时我们从 \(f(x) = 0\)的一个近似解 \(x_0\) 开始。我们做 \(f(x)\)\((x_0,f(x_0))\)处的切线,将切线与 \(x\) 轴交点定为 \(x_1\),这个 \(x_1\) 就是一个比 \(x_0\) 更精确的点,我们照这个过程一直迭代下去,直到找到符号精度的解即可。

根据上面的思路我们可以写出递推公式,我们首先设当前近似解为 \(x_i\) ,那么可以写出下面的式子:

\[ f'(x_i)=\frac{f(x_i)}{x_i-x_{i+1}} \]
Image title

这样我们可以写出递推下一个近似解的关系式:

\[ x_{i+1}=x_i-\frac{f(x_i)}{f'(x_i)} \]

有了递推式代码写起来就容易了,只要一直用上式迭代,直到达到精度要求,就退出循环即可。

下面以求解平方根为例:

constexpr double eps = 1e-10;
double Newton_sqrt(double n)
{
    double x = 1;
    while(1)
    {
        double next_x = (x + n / x) / 2;
        if(abs(next_x - x) < eps)break;
        x = next_x;
    }
    return x;
}

参考文章:

Oi-Wiki