牛顿迭代法(Newton's Method)

article/2025/9/15 2:04:41

简介

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




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

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

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

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


牛顿法举例


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

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


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

const float EPS = 0.00001; 
int sqrt(double x) { if(x == 0) return 0; double result = x; /*Use double to avoid possible overflow*/ double lastValue; do{ lastValue = result; result = result / 2.0f + x / 2.0f / result; }while(abs(result - lastValue) > EPS);return (double)result;}


更快的方法


文献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的文件中发现了如下代码段。

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? 

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

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

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

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

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

int sqrt(float x) { if(x == 0) return 0; float result = x; float xhalf = 0.5f*result; int i = *(int*)&result; i = 0x5f375a86- (i>>1); // what the fuck? result = *(float*)&i; result = result*(1.5f-xhalf*result*result); // Newton step, repeating increases accuracy result = result*(1.5f-xhalf*result*result); return 1.0f/result; 
}


参考文献:
1.wikipedia.org
2.http://www.2cto.com/kf/201206/137256.html



http://chatgpt.dhexx.cn/article/MPjCJyQK.shtml

相关文章

如何通俗易懂地讲解牛顿迭代法?

五次及以上多项式方程没有根式解(就是没有像二次方程那样的万能公式),这个是被伽罗瓦用群论做出的最著名的结论。 但是,没有王屠夫难道非得吃带毛猪?工作生活中还是有诸多求解高次方程的真实需求(比如行星…

使用“牛顿迭代法”求解方程

使用牛顿迭代法求解方程 尽管通过因式分解和利用求根公式可以很方便的得出多项式方程的根,但大多数时候这个多项式的次数都很高,计算将变得非常复杂,因此,我们必须转向一些近似解法。 牛顿迭代法是其中最好的方法之一。从根本上说…

牛顿迭代法求解方程

说明:该篇博客源于博主的早些时候的一个csdn博客中的一篇,由于近期使用到了,所以再次作一总结。原文地址 概述 牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newto…

方程求根的迭代法——牛顿迭代法

用牛顿法解方程xe(x) -10 程序流程图如下&#xff1a; //方程求根的迭代法——牛顿迭代法 /*************Analysis********** *1.初值x0,精度e,迭代次数N *2.牛顿法解方程f(x)x*e**x-1 *3.取初值为0.5 ********************************/ #include<iostream> #include&…

牛顿迭代法

转自 LeetCode 解答 一篇解释得很细的文章 牛顿迭代法是一种可以用来快速求解函数零点的方法。 以 LeetCode 上的一题为例&#xff1a;模拟 int sqrt(x) 函数&#xff0c;返回的开方值向下取整。 为了叙述方便&#xff0c;我们用 C 表示待求出平方根的那个整数。显然&#xff…

牛顿迭代法(Newton’s Method)迭代求根的Python程序

迭代法的作用 许多复杂的求解问题&#xff0c;都可以转换成方程f(x)0的求解问题。这一系列的解叫做方程的根。对于非线性方程的求解&#xff0c;在自变量范围内往往有多个解&#xff0c;我们将此变化区域分为多个小的子区间&#xff0c;对每个区间进行分别求解。我们在求解过程…

用牛顿迭代法求方程的根

用牛顿迭代法求方程的根&#xff08;C语言&#xff09; 题目要求&#xff1a;牛顿迭代法是一种重要的基本的求方程根的方法。现有方程为axˆ3bxˆ2cxd0&#xff0c;系数a&#xff0c;b&#xff0c;c&#xff0c;d的值一次为1&#xff0c;2&#xff0c;3&#xff0c;4&#xff…

【源码】牛顿迭代法求根的matlab实现

牛顿迭代法求根的matlab实现 本篇是在课程学习中自己编程实现的牛顿迭代法计算非线性方程或者超越方程近似根的算法&#xff0c;写一下&#xff0c;后边便于复习和期末课程设计引用。 牛顿迭代法本质上是一种特殊的不动点迭代&#xff0c;只不过它的迭代函数的构造比较特殊&am…

牛顿迭代法求方程的根

牛顿迭代法&#xff08;牛顿-拉弗森方法&#xff09; 五次及以上多项式方程没有根式解&#xff08;就是没有像二次方程那样的万能公式&#xff09;&#xff0c;这个是被伽罗瓦用群论做出的最著名的结论。没有根式解不意味着方程解不出来&#xff0c;数学家也提供了很多方法&am…

非线性方程求根——牛顿迭代法

一、牛顿法 1.实质&#xff1a;牛顿法实质上是一种线性方法&#xff0c;其基本思想是将非线性方程f(x)0逐步归结为某种线性方程来解。 2.牛顿法公式&#xff1a; 已知方程f(x)0有近似解xk,假设&#xff0c;将f(x)在点xk泰勒展开&#xff0c;有则方程f(x)0可近似表示为&#…

C语言每日一练——第154天:牛顿迭代法求方程根

&#x1f31f; 前言 Wassup guys&#xff0c;我是Edison &#x1f60e; 今天是C语言每日一练&#xff0c;第154天&#xff01; Let’s get it&#xff01; 文章目录 1. 问题描述2. 题目分析3. 算法设计4. 确定程序框架5. 迭代法求方程根6. 代码实现 1. 问题描述 编写用牛顿迭…

前端骨架屏终极方案——骨架图

骨架图代替骨架屏。用图片代替骨架屏&#xff01;&#xff01;&#xff01; 主要还没尝试过自动生成方案&#xff0c;手工写感觉太麻烦&#xff08;美工已经操起了板砖。。。&#xff09; 最简单的实现方式&#xff0c;拿页面的UI效果图&#xff08;或者直接手机截屏&#xf…

element ui修改骨架屏形状

这是element ui的原本形状 这个形状虽然也可以 但有些情况和东西的加载显然不太适合这个形态 确实我们可以这样写 如果你是vue2 则 <div><el-skeleton animated><template slot"template"><el-skeleton-item style "width: 100vw;he…

你不可能知道的骨架屏玩法!

〇 前言 这篇是作者在公司做了活动架构升级后&#xff0c;产出的主文的前导第二篇&#xff0c;考虑到本文相对独立&#xff0c;因此抽离出单独成文。姐妹兄弟篇&#xff0c;《你可能不知道的动态组件玩法????》。 可能文“对不起”题&#xff0c;知道的大佬别进来了????…

vue加载组件骨架屏el-skeleton使用

做项目遇到的问题&#xff1a;在两个兄弟组件中&#xff0c;点击其中一个组件的一个元素&#xff0c;如button&#xff0c;会触发其兄弟组件的刷新&#xff0c; 我的做法&#xff1a;在watch中监测某字段&#xff0c;更改了之后直接在watch中发送后端请求&#xff0c;如下&…

在vue项目中使用骨架屏

现在的应用开发&#xff0c;基本上都是前后端分离的&#xff0c;前端主流框架有SPA、MPA等&#xff0c;那么解决页面渲染、白屏时间成为首要关注的点 webpack可以按需加载&#xff0c;减小首屏需要加载代码的体积&#xff1b; 使用CDN技术、静态代码等缓存技术&#xff0c;可…

使用 Vite 插件自动化实现骨架屏

大厂技术 高级前端 Node进阶 点击上方 程序员成长指北&#xff0c;关注公众号 回复1&#xff0c;加入高级Node交流群 作者&#xff1a;橙红年代 原文&#xff1a;https://juejin.cn/post/7152406737100734495 骨架屏在SPA应用中有两个显著提升用户体验的作用 避免页面初始化加…

骨架屏技术讲解以及如何在Vue中实现骨架屏

骨架屏技术讲解以及如何在Vue中实现骨架屏 写在前面骨架屏是什么如何实现&#xff08;原理分析&#xff09;一个生动的例子 实现方式&#xff08;具体实现&#xff09;方案一、在模版中来实现骨架屏方案二、使用一个Base64的图片来作为骨架屏方案三、使用 .vue 文件来完成骨架屏…

正确使用uniapp搭配微信开发者工具自带的骨架屏功能,生成骨架屏

重点&#xff1a;把index.skeleton.wxml和index.skeleton.wxss文件中的&#xff08;is““和data-event-opts””&#xff09;的整个属性删掉 一、描述&#xff1a;解决使用uniapp开发微信小程序生成骨架屏 很多人都知道微信开发者工具自带生成骨架屏的功能&#xff0c;但是却不…

vue骨架屏介绍

骨架屏可以理解为是当数据还未加载进来前&#xff0c;页面的一个空白版本&#xff0c;一个简单的关键渲染路径。可以看一下下面Facebook的骨架屏实现&#xff0c;可以看到在页面完全渲染完成之前&#xff0c;用户会看到一个样式简单&#xff0c;描绘了当前页面的大致框架的骨架…