牛顿法开方原理及代码

来源:互联网 发布:淘宝延长收货三天 编辑:程序博客网 时间:2024/06/09 17:10

牛顿法(Newton’s method)又称为牛顿-拉弗森方法(Newton-Raphson method) (为了简便下文称之为NR法), 它是一种在实数域和复数域上近似求解方程的方法.
下面是维基百科上的演示图片.

牛顿法演示

在计算机入门的时候往往会讲解使用二分法求解一个正数的平方根. 通过不断的猜测, 检查, 改进再猜测来取到一个最接近结果的值. 实质是求
f(g)=g2a的正根. 当g的值使得函数结果无限趋近于0, 此时g就是平方根的近似值. 其中a代表我们要求根的数.

NR法在求近似根方面比二分法的效率更高, 假设我们下一次的猜测值是gn+1, 已经猜测的值是gn, 那么 gn+1 的值应该是函数 f(g)=g2ag=gn 处的切线与x轴的交点的x值.

(gn,f(gn)) 处切线的方程是

y=kx+b

f(g)=g2a 求导得
f(g)=2g

可知
k=2gn

(gn,f(gn)) 代入 y=2gnx+b

b=f(gn)2g2n

所以切线方程为
y=2gnx+f(gn)2g2n

y=0时求出的x值就是gn+1, 所以得到
gn+1=gnf(gn)2gi

使用这样的计算策略, 可以让我们的猜测值在更少的迭代次数内到达我们认可的数值.
下面是python代码

def squareRootNR(x, epsilon):    assert x>=0, 'x must be non negtive not'+str(x)    assert epsilon>0,'epsilon must be positive not'+str(epsilon)    x=float(x)    guess=x    diff=guess**2-x    ctr=1    while abs(diff)>epsilon and ctr<=100:        guess=guess-diff/(2*guess)        diff=guess**2-x        ctr+=1    assert ctr<=100 ,'the times of iteration is too much'    print 'NR method: guess: %f iteration: %d' %(guess, ctr)    return guess
0 0