01
设 r 是f(x) = 0的根,选取 x 0 x_0 x0 作为r的初始近似值,过点 ( x 0 , f ( x 0 ) ) (x_0,f(x_0)) (x0,f(x0)) 做曲线 y = f ( x ) y = f(x) y=f(x) 的切线L,L的方程为 y = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) y = f(x_0)+f'(x_0)(x-x_0) y=f(x0)+f′(x0)(x−x0),求出L与x轴交点的横坐标 x 1 = x 0 − f ( x 0 ) / f ′ ( x 0 ) x_1 = x_0-f(x_0)/f'(x_0) x1=x0−f(x0)/f′(x0), 称 x 1 x_1 x1是 r r r的一次近似。
过点 ( x 1 , f ( x 1 ) ) (x_1,f(x_1)) (x1,f(x1))做曲线 y = f ( x ) y=f(x) y=f(x)定位切线,并求该切线与x轴交点的横坐标,也就是当 y = 0 y=0 y=0时, x 2 = x 1 − f ( x 1 ) / f ′ ( x 1 ) x_2=x_1-f(x_1)/f'(x_1) x2=x1−f(x1)/f′(x1),称为r的二次近似值
重复以上过程,得r的近似值序列,其中, x n + 1 = x n − f ( x n ) / f ′ ( x n ) x_n+1 = x_n-f(x_n)/f'(x_n) xn+1=xn−f(xn)/f′(xn)是r的n+1次近似根,这个式子也称作牛顿迭代公式。
已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个邻近区域内,那么牛顿法必定收敛。
02 Python实现
def newton(x0, niter,threshold, f, f_grade):
iter = 0
while niter>0:
x1 = x0 - f(x0)/f_grade(x0)
if f(x1)<threshold:
break
x0 = x1
iter +=1
print(str(iter)+"x="+str(x1))
niter-=1
return x1
s = newton(50, 100, 1e-10, lambda x:x*x-11*x+10, lambda x: 2*x - 11)
print('solve = '+ str(s))
结果为:
1x=27.97752808988764
2x=17.189213932471937
3x=12.210790103826884
4x=10.364159272422459
5x=10.013631541265838
6x=10.000020584192082
7x=10.000000000047079
solve = 10.0
方程为
f
(
x
)
=
x
2
−
11
×
x
+
10
f(x)= x^2-11×x+10
f(x)=x2−11×x+10
依次求导后公式为:
f
′
(
x
)
=
2
×
x
−
11
f'(x) = 2×x - 11
f′(x)=2×x−11
r = 10
致谢:公众号