01 牛顿迭代公式

01

设 r 是f(x) = 0的根,选取 x 0 x_0 作为r的初始近似值,过点 ( x 0 , f ( x 0 ) ) (x_0,f(x_0)) 做曲线 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) ,求出L与x轴交点的横坐标 x 1 = x 0 f ( x 0 ) / f ( x 0 ) x_1 = x_0-f(x_0)/f'(x_0) , 称 x 1 x_1 r r 一次近似

过点 ( x 1 , f ( x 1 ) ) (x_1,f(x_1)) 做曲线 y = f ( x ) y=f(x) 定位切线,并求该切线与x轴交点的横坐标,也就是当 y = 0 y=0 时, x 2 = x 1 f ( x 1 ) / f ( x 1 ) x_2=x_1-f(x_1)/f'(x_1) ,称为r的二次近似值

重复以上过程,得r的近似值序列,其中, x n + 1 = x n f ( x n ) / f ( x n ) x_n+1 = x_n-f(x_n)/f'(x_n) 是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 ) = 2 × x 11 f&#x27;(x) = 2×x - 11
r = 10

致谢:公众号

猜你喜欢

转载自blog.csdn.net/dz4543/article/details/85269498
01
#01