牛顿迭代法(Newton's method),也叫牛顿-拉夫逊法,是一种求方程f(x) = 0的近似解的数学方法,它的核心思想是:用切线去近似函数,把切线与x轴的交点作为下一次的近似根。

假设我们要解方程f(x) = 0,在方程上取一点(x0, f(x0)),那么这一点上的切线斜率为:

f'(x0)

切线方程为:

y - f(x0) = f'(x0) (x - x0)

我们需要切线方程与X轴的交点,所以令y = 0,可以得到:

0 - f(x0) = f'(x0) (x - x0)

所以可以解出X:

x = x0 - f(x0) / f'(x0)

不断重复这个过程,让新得到的x代入f(x)并求切线以及切线与x轴的交点。我们可以归纳出牛顿迭代公式如下:

xn+1 = xn - f(xn) / f'(xn)


我们以求解√5的值为例,配合图像去深入理解牛顿迭代法。

首先,要求解√5的值,我们就是在解方程x2 = 5,也就是求解x2 - 5 = 0

绘制f(x) = x2 - 5的图像:

f(x)的导数为:f'(x) = 2x

我们在图像上随机地取一个点A(3.047, 4.28421)

似乎有点太随机了,小数位好多。不过不用担心,计算过程交给计算器了,实际应用可以取一个距离√5最近的整数。

在A点的切线斜率为:2 * 3.047 = 6.094

在A点的切线表达式为:y - 4.28421 = 6.094(x - 3.047)

绘制A点的切线:

可以看到,第一条切线与x轴的交点为(2.34398, 0)

绘制x = 2.34394,得到f(2.34398) = 0.49424,点B(2.34398, 0.49424)

在点B的斜率为4.68796,在B点处的切线表达式为y - 0.49424 = 4.68796(x - 2.34398),绘制切线。

第二条切线与X轴的交点为(2.23855, 0)

可以发现,每当我们进行一次迭代,切线与x轴的交点都会向函数的零点接近一步,我们可以反复进行这个过程,直到精度符合要求。


上文中推导出了牛顿迭代法的通用公式:

xn+1 = xn - f(xn) / f'(xn)

在求解任意正实数的平方根案例中,f(xn) = x2n - a,f'(xn) = 2xn,所以该公式在本案例中可以化简为:

xn+1 = (xn + a / xn) / 2

接下来给出牛顿迭代法计算正实数平方根的Python3语言实现:

def sqrt_newton(n):
    eps = 1e-15
    x = 1
    while True:
        nx = (x + n / x) / 2
        if abs(x - nx) < eps:
            break
        x = nx
    return x

以上就是本文的全部内容,如有谬误欢迎在评论区指正。