牛顿迭代法(Newton's Method)

简介

牛顿迭代法(简称牛顿法)由英国著名的数学家牛顿爵士最早提出。但是,这一方法在牛顿生前并未公开发表。

牛顿法的作用是使用迭代的方法来求解函数方程的根。简单地说,牛顿法就是不断求取切线的过程。

对于形如f(x)=0的方程,首先任意估算一个解x0,再把该估计值代入原方程中。由于一般不会正好选择到正确的解,所以有f(x)=a。这时计算函数在x0处的斜率,和这条斜率与x轴的交点x1。

f(x)=0中精确解的意义是,当取得解的时候,函数值为零(即f(x)的精确解是函数的零点)。因此,x1比x0更加接近精确的解。只要不断以此方法更新x,就可以取得无限接近的精确的解。

但是,有可能会遇到牛顿迭代法无法收敛的情况。比如函数有多个零点,或者函数不连续的时候。

牛顿法举例

下面介绍使用牛顿迭代法求方根的例子。牛顿迭代法是已知的实现求方根最快的方法之一,只需要迭代几次后就能得到相当精确的结果。

首先设x的m次方根为a。

下面程序使用牛顿法求解平方根。

  1. const float EPS = 0.00001;
  2. int sqrt(double x) {
  3. if(x == ) return ;
  4. double result = x; /*Use double to avoid possible overflow*/
  5. double lastValue;
  6. do{
  7. lastValue = result;
  8. result = result / 2.0f + x / 2.0f / result;
  9. }while(abs(result - lastValue) > EPS);
  10. return (double)result;
  11. }

更快的方法

文献2提到了比上述程序更快的求解平方根的非典型牛顿迭代法。介绍如下。

1999年12月,美国id Software公司发布了名为“雷神之锤III”的电子游戏。它是第一个支持软件加速的游戏,取得了极大成功。(由于影响力过大,文化部于2004年将它列入了非法游戏名单)

雷神之锤III并不是id Software公司的第一次成功。早在1993年开始,这家公司就以“毁灭战士”系列游戏名闻天下。1995年,“毁灭战士”的安装数超过了当年微软的windows 95。据传比尔盖茨才曾经考虑买下id software。(id software公司后来被推出过“上古卷轴”系列的Bethesda公司买下)

id Software所取得的成功很大程度上要归功于它的创始人约翰·卡马克。马克尔也是一个著名的程序员,他是id Software游戏引擎的主要负责人。 回到刚才提到的雷神之锤,马克尔是开源软件的积极推动者,他于2005年公布了雷神之锤III的源代码。至此人们得以通过研究这款游戏引擎的源文件来查看它成功的秘密。

在其中一个名字为q_math.c的文件中发现了如下代码段。

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

这段代码的作用就是求number的平方根,并且返回它的倒数。

经过测试,它的效率比上述牛顿法程序要快几十倍。也比c++标准库的sqrt()函数要快好几倍。此段代码有一个奇怪的句子:

i = 0x5f3759df - ( i >> 1 ); // what the fuck?

这句话的注释是“what the fuck?”,翻译过来就是“我靠?”

任何受过程序训练的人看到这句大概都会在想,这句话到底在搞什么鸟?

之所以会出现这种奇怪的注释,要么是此段程序的作者(可能是马克尔)根本不知道该如何解释清楚,或者是维护这段程序的程序员完全看不懂这句话,所以有点儿抓毛。而实际上,它的作用(再加上y
= y * ( threehalfs - ( x2 * y * y ) )这句牛顿迭代)就是求平方根。

至于是为什么,本博主也不知道。

以雷神之锤III程序为蓝本可以写出比sqrt()更强大的求平方根函数:

  1. int sqrt(float x) {
  2. if(x == ) return ;
  3. float result = x;
  4. float xhalf = 0.5f*result;
  5. int i = *(int*)&result;
  6. i = 0x5f375a86- (i>>); // what the fuck?
  7. result = *(float*)&i;
  8. result = result*(1.5f-xhalf*result*result); // Newton step, repeating increases accuracy
  9. result = result*(1.5f-xhalf*result*result);
  10. return 1.0f/result;
  11. }

参考文献:

1.wikipedia.org

2.http://www.2cto.com/kf/201206/137256.html

牛顿迭代法(Newton's Method)的更多相关文章

  1. 牛顿迭代法(Newton's Method)

    牛顿迭代法(Newton's Method) 简介 牛顿迭代法(简称牛顿法)由英国著名的数学家牛顿爵士最早提出.牛顿法的作用是使用迭代的方法来求解函数方程的根.简单地说,牛顿法就是不断求取切线的过程. ...

  2. 牛顿迭代法(Newton's Method)

    牛顿迭代法(简称牛顿法)由英国著名的数学家牛顿爵士最早提出.可是,这 一方法在牛顿生前并未公开发表(讨厌的数学家们还是鼓捣出来了) 牛顿法的作用是使用迭代的方法来求解函数方程的根. 简单地说,牛顿法就 ...

  3. 牛顿迭代法(Newton's method)

    关键词:牛顿法.牛顿迭代法.牛顿切线法.牛顿-拉弗森方法 参考:牛顿迭代法-百度百科.牛顿切线法-百度文库数学学院.牛顿切线法数值分析.非线性方程(组)的数值解法.Latex入门 https://bl ...

  4. 牛顿方法(Newton's Method)

    在讲义<线性回归.梯度下降>和<逻辑回归>中我们提到可以用梯度下降或梯度上升的方式求解θ.在本文中将讲解另一种求解θ的方法:牛顿方法(Newton's method). 牛顿方 ...

  5. Atitit 迭代法  “二分法”和“牛顿迭代法 attilax总结

    Atitit 迭代法  "二分法"和"牛顿迭代法 attilax总结 1.1. ."二分法"和"牛顿迭代法"属于近似迭代法1 1. ...

  6. Newton's Method

    在求最优解时,前面很多地方都用梯度下降(Gradient Descent)的方法,但由于最优步长很难确定,可能会出现总是在最优解附近徘徊的情况,致使最优解的搜索过程很缓慢.牛顿法(Newton's M ...

  7. 牛顿法(Newton's Method)

    Newton's Method 在求最优解时,前面很多地方都用梯度下降(Gradient Descent)的方法,但由于最优步长很难确定,可能会出现总是在最优解附近徘徊的情况,致使最优解的搜索过程很缓 ...

  8. Java实现牛顿迭代法求解平方根、立方根

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

  9. 【cs229-Lecture4】Newton’s method

    之前我们在求Logistic回归时,用的是梯度上升算法,也就是要使得似然函数最大化,利用梯度上升算法,不断的迭代.这节课引出牛顿方法,它的作用和梯度上升算法的一样的,不同的是牛顿方法所需的迭代次数更少 ...

随机推荐

  1. HTML <div> 和<span>

    HTML <div> 和<span> HTML 可以通过 <div> 和 <span>将元素组合起来. HTML 区块元素 大多数 HTML 元素被定义 ...

  2. UED大全

    http://www.baiduux.com/  百度UFOhttp://ued.sohu.com/  搜狐UEDhttp://ued.taobao.com/  淘宝UEDhttp://www.ued ...

  3. LazyInitializationException--由于session关闭引发的异常

    1,页面中进行person.department.departmentName的读取 2,Action 中只读取了person,事务作用在Service的方法中 3,后台会有org.hibernate ...

  4. H.264转码加速:NVENC大战Quick Sync

    GPU加速技术对普通消费者最直观的影响就是视频转码应用上了,NVIDIA..AMD以及Intel都有自己的加速技术,而在新一代CPU和GPU架构上,三方都有更新的技术方案.<br>< ...

  5. Chrome 插件集锦

    原文出处:CN_Simo 子曾曰:"工欲善其事,必先利其器.居是邦也."--语出<论语·卫灵公>:其后一百多年,荀子也在其<劝学>中倡言道:"吾尝 ...

  6. JS如何实现点击页面其他地方隐藏菜单?

    方法一: $("#a").on("click", function(e){  $("#menu").show();    $(documen ...

  7. MySQL的my-innodb-heavy-4G.ini配置文件的翻译

    我根据MySQL配置文件的英文文档说明,在根据自己所学的知识,使用有道词典对不懂的单词进行了查询,一个一个翻译出来的.有的专业术语翻译的不好,我使用了英文进行标注,例如主机(master)和副机(sl ...

  8. vue.js 常用语法总结(一)

    作者:曾萍,目前就职于京东商城. 概述 2016年已经结束了.你是否会思考一下,自己在过去的一年里是否错过一些重要的东西?不用担心,我们正在回顾那些流行的趋势.通过比较过去12个月里Github所增加 ...

  9. 笔记之《用python写网络爬虫》

    1 .3 背景调研 robots. txt Robots协议(也称为爬虫协议.机器人协议等)的全称是"网络爬虫排除标准"(Robots Exclusion Protocol),网站 ...

  10. 今日头条- iOS客户端 启动速度优化实践

    版权声明 作者:今日头条iOS团队 原文:https://techblog.toutiao.com/2017/01/17/iosspeed/ 应用启动时间,直接影响用户对一款应用的判断和使用体验.头条 ...