关于牛顿迭代求根的笔记

关于牛顿迭代求根的笔记

=============

牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。

1.数学原理

设r是 的根,选取作为r的初始近似值,过点 做曲线的切线L,L的方程为,求出L与x轴交点的横坐标,称x1为r的一次近似值。过点做曲线的切线,并求该切线与x轴交点的横坐标,称 为r的二次近似值。重复以上过程,得r的近似值序列,其中, 称为r的次近似值,上式称为牛顿迭代公式。
用牛顿迭代法解非线性方程,是把非线性方程线性化的一种近似方法。把 在点 的某邻域内展开成泰勒级数 ,取其线性部分(即泰勒展开的前两项),并令其等于0,即,以此作为非线性方程的近似方程,若 ,则其解为 , 这样,得到牛顿迭代法的一个迭代关系式:
已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。

应用牛顿-拉弗森方法,要注意以下问题:

  • 函数在整个定义域内最好是二阶可导的
  • 起始点对求根计算影响重大,因为牛顿法是局部应用,可以增加一些别的判断手段进行试错

2.简单代码应用

python

#用牛顿-拉夫逊方法寻找k的平方根
#寻找x,满足x**2 - raw_input()输入值在epsilon和0之间
epsilon = 0.01
k = raw_input('please input the number:')
guess = k /2.0
while abs(guess*guess - k)>=epsilon:
    guess = guess - (((guess**2) - k)/(2*guess))
print 'Square root of', k, 'is about', guess

3.扩展代码应用

id Software创始人约翰·卡马克,即id Software游戏引擎的主要负责人。于2005年公布了雷神之锤III的源代码。在其中一个名字为q_math.c的文件中发现了如下代码段。

c

float Q_rsqrt( float number ) {   
    long i; float x2, y; const float threehalfs = 1.5F;  
    x2 = number * 0.5F;   
    y = number;   
    i = * ( long * ) &y; // evil floating point bit level hacking   
    i = 0x5f3759df - ( i >> 1 ); // what the fuck?   
    y = * ( float * ) &i;   
    y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration   
    // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed  
    #ifndef Q3_VM #  
    ifdef __linux__ assert( !isnan(y) ); // bk010122 - FPE?  
    #endif  
    #endif return y;   
}  

这段代码的作用就是求number的平方根,并且返回它的倒数。
经过测试,它的效率比上述牛顿法程序要快几十倍。也比c++标准库的sqrt()函数要快好几倍。此段代码有一个奇怪的句子:

i = 0x5f3759df - ( i >> 1 ); // what the fuck?
而实际上,它的作用(再加上y = y * ( threehalfs - ( x2 * y * y ) )这句牛顿迭代)就是求平方根。

普渡大学的数学家Chris Lomont看了以后也觉得很有趣,决定要研究一下卡马克弄出来的这个猜测值有什么奥秘。Lomont也是个牛人,在精心研究之后从理论上也推导出一个最佳猜测值,和卡马克的数字非常接近, 0x5f37642f。Lomont计算出结果以后非常满意,于是拿自己计算出的起始值和卡马克的神秘数字做比赛,看看谁的数字能够更快更精确的求得平方根。结果居然还是卡马克赢了…
最后Lomont怒了,采用暴力方法一个数字一个数字试过来,终于找到一个比卡马克数字要好上那么一丁点的数字,虽然实际上这两个数字所产生的结果非常近似,这个暴力得出的数字是0x5f375a86
作者:李小浩
链接:https://www.zhihu.com/question/27455969/answer/94454251
来源:知乎

最后是相关文献:
《Fast Inverse Square Root》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值