牛顿迭代法概述
牛顿迭代法(Newton’s method)又称为牛顿-拉弗森方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。
牛顿迭代公式
设rrr是f(x)=0f(x)=0f(x)=0的根,选取x0x_0x0作为rrr的初始近似值。
过点(x0,f(x0))(x_0, f(x_0))(x0,f(x0))做曲线y=f(x)y=f(x)y=f(x)的切线L1L_1L1,L1:y=f(x0)+f′(x0)(x−x0)L_1:y = f(x_0)+f'(x_0)(x-x_0)L1:y=f(x0)+f′(x0)(x−x0),则L1L_1L1与xxx轴交点的横坐标x1=x0−f(x0)f′(x0)x_1 = x_0 - \frac{f(x_0)}{f'(x_0)}x1=x0−f′(x0)f(x0),称x1x_1x1为rrr的一次近似值。
过点(x1,f(x1))(x_1, f(x_1))(x1,f(x1))做曲线y=f(x)y=f(x)y=f(x)的切线L2L_2L2,L2:y=f(x1)+f′(x1)(x−x1)L_2:y = f(x_1)+f'(x_1)(x-x_1)L2:y=f(x1)+f′(x1)(x−x1),则L2L_2L2与xxx轴交点的横坐标x2=x1−f(x1)f′(x1)x_2=x_1-\frac{f(x_1)}{f'(x_1)}x2=x1−f′(x1)f(x1),称x2x_2x2为rrr的二次近似值。
重复以上过程,得rrr的近似值序列,其中,xn+1=xn−f(xn)f′(xn)x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}xn+1=xn−f′(xn)f(xn)称为rrr的n+1n+1n+1次近似值,上式称为牛顿迭代公式。
举个例子
题目
用牛顿迭代法求出2\sqrt{2}2的二次正近似值(初始近似值x0=2x_0=2x0=2)。
解答
x=2⇒x2−2=0x=\sqrt{2}\Rightarrow x^2-2=0x=2⇒x2−2=0
f(x)=x2−2f(x)=x^2-2f(x)=x2−2
f′(x)=2xf'(x)=2xf′(x)=2x
设rrr是f(x)=0f(x)=0f(x)=0的正根,x0=2x_0=2x0=2作为rrr的初始近似值。
f(x)f(x)f(x)过点A(2,f(2))⇒A(2,2)A(2,f(2))\Rightarrow A(2,2)A(2,f(2))⇒A(2,2)。
过点AAA作曲线y=f(x)y=f(x)y=f(x)的切线L1L_1L1:
L1:y=f(x0)+f′(x0)(x−x0)L_1:y = f(x_0)+f'(x_0)(x-x_0)L1:y=f(x0)+f′(x0)(x−x0)
y=2+2⋅2⋅(x−2)y=2+2\cdot2\cdot(x-2)y=2+2⋅2⋅(x−2)
y=4x−6y=4x-6y=4x−6
则L1L_1L1与xxx轴交点的横坐标x1x_1x1:
0=4x1−60=4x_1-60=4x1−6
x1=32x_1=\frac{3}{2}x1=23
或者直接用牛顿迭代公式:
x1=x0−f(x0)f′(x0)=2−22−22⋅2=2−12=32x_1=x_0-\frac{f(x_0)}{f'(x_0)}=2-\frac{2^2-2}{2\cdot2}=2-\frac{1}{2}=\frac{3}{2}x1=x0−f′(x0)f(x0)=2−2⋅222−2=2−21=23
x1x_1x1为rrr的一次近似值。
f(x)f(x)f(x)过点B(32,f(32))⇒B(32,14)B(\frac{3}{2}, f(\frac{3}{2}))\Rightarrow B(\frac{3}{2},\frac{1}{4})B(23,f(23))⇒B(23,41)。
过点BBB作曲线y=f(x)y=f(x)y=f(x)的切线L2L_2L2:
L2:y=f(x1)+f′(x1)(x−x1)L_2:y = f(x_1)+f'(x_1)(x-x_1)L2:y=f(x1)+f′(x1)(x−x1)
y=14+2⋅32⋅(x−32)y=\frac{1}{4}+2\cdot\frac{3}{2}\cdot(x-\frac{3}{2})y=41+2⋅23⋅(x−23)
y=3x−174y=3x-\frac{17}{4}y=3x−417
则L2L_2L2与xxx轴交点的横坐标x2x_2x2:
0=3x2−1740=3x_2-\frac{17}{4}0=3x2−417
x2=1712=1.41666666˙x_2=\frac{17}{12}=1.4166666\dot{6}x2=1217=1.41666666˙
或者直接用牛顿迭代公式:
x2=x1−f(x1)f′(x1)=32−(32)2−22⋅32=32−112=1712x_2=x_1-\frac{f(x_1)}{f'(x_1)}=\frac{3}{2}-\frac{(\frac{3}{2})^2-2}{2\cdot \frac{3}{2}}=\frac{3}{2}-\frac{1}{12}=\frac{17}{12}x2=x1−f′(x1)f(x1)=23−2⋅23(23)2−2=23−121=1217
x2x_2x2为rrr的二次近似值。
综上所述,2\sqrt{2}2的二次正近似值为1712=1.41666666˙\frac{17}{12}=1.4166666\dot{6}1217=1.41666666˙。
用牛顿迭代法求平方根的Java程序实现
假设你想用程序实现求出aaa的正平方根。
已知三个公式:
- 牛顿迭代公式 xn+1=xn−f(xn)f′(xn)x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}xn+1=xn−f′(xn)f(xn)
- f(x)=x2−af(x)=x^2-af(x)=x2−a
- f′(x)=2xf'(x)=2xf′(x)=2x
由三个公式可得:
xn+1=xn−xn2−a2xnx_{n+1}=x_n-\frac{x_n^2-a}{2x_n}xn+1=xn−2xnxn2−a
xn+1=xn2+a2xnx_{n+1}=\frac{x_n^2+a}{2x_n}xn+1=2xnxn2+a
xn+1=xn+axn2x_{n+1}=\frac{x_n+\frac{a}{x_n}}{2}xn+1=2xn+xna
因此,容易编写出以下程序:
public class Sqrt {public static void main(String[] args) {System.out.println(sqrt(2));}private static double sqrt(double a) {if (num < 0)throw new IllegalArgumentException();double err = 1E-15;double cur = a;while (Math.abs(a - cur * cur) > err)//精度越来越高cur = (cur + a / cur) / 2;return cur;}
}
参考资料
- 牛顿迭代法_百度百科
- 如何通俗易懂地讲解牛顿迭代法求开方?数值分析? - 知乎
- 牛顿迭代法快速寻找平方根
- 牛顿求根法