牛頓迭代法 Newton s Method

2021-07-24 00:01:22 字數 2270 閱讀 5276

簡介

牛頓迭代法(簡稱牛頓法)由英國著名的數學家牛頓爵士最早提出。但是,這一方法在牛頓生前並未公開發表。

牛頓法的作用是使用迭代的方法來求解函式方程的根。簡單地說,牛頓法就是不斷求取切線的過程。

對於形如f(x)=0的方程,首先任意估算乙個解x0,再把該估計值代入原方程中。由於一般不會正好選擇到正確的解,所以有f(x)=a。這時計算函式在x0處的斜率,和這條斜率與x軸的交點x1。

f(x)=0中精確解的意義是,當取得解的時候,函式值為零(即f(x)的精確解是函式的零點)。因此,x1比x0更加接近精確的解。只要不斷以此方法更新x,就可以取得無限接近的精確的解。

但是,有可能會遇到牛頓迭代法無法收斂的情況。比如函式有多個零點,或者函式不連續的時候。

牛頓法舉例

下面介紹使用牛頓迭代法求方根的例子。牛頓迭代法是已知的實現求方根最快的方法之一,只需要迭代幾次後就能得到相當精確的結果。

首先設x的m次方根為a。

下面程式使用牛頓法求解平方根。

[cpp]view plain

copy

const

float

eps = 0.00001;   

intsqrt(

double

x) while

(abs(result - lastvalue) > eps);  

return

(double

)result;  

}  

更快的方法

文獻2提到了比上述程式更快的求解平方根的非典型牛頓迭代法。介紹如下。

2023年12月,美國id software公司發布了名為「雷神之鎚iii」的電子遊戲。它是第乙個支援軟體加速的遊戲,取得了極大成功。(由於影響力過大,文化部於2023年將它列入了非法遊戲名單)

雷神之鎚iii並不是id software公司的第一次成功。早在2023年開始,這家公司就以「毀滅戰士」系列遊戲名聞天下。2023年,「毀滅戰士」的安裝數超過了當年微軟的windows 95。據傳比爾蓋茨才曾經考慮買下id software。(id software公司後來被推出過「上古卷軸」系列的bethesda公司買下)

id software所取得的成功很大程度上要歸功於它的創始人約翰·卡馬克。馬克爾也是乙個著名的程式設計師,他是id software遊戲引擎的主要負責人。 回到剛才提到的雷神之鎚,馬克爾是開源軟體的積極推動者,他於2023年公布了雷神之鎚iii的源**。至此人們得以通過研究這款遊戲引擎的原始檔來檢視它成功的秘密。

在其中乙個名字為q_math.c的檔案中發現了如下**段。

[cpp]view plain

copy

float

q_rsqrt( 

float

number )   

這段**的作用就是求number的平方根,並且返回它的倒數。

經過測試,它的效率比上述牛頓法程式要快幾十倍。也比c++標準庫的sqrt()函式要快好幾倍。此段**有乙個奇怪的句子:

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

這句話的注釋是「what the ****?」,翻譯過來就是「我靠?」

任何受過程式訓練的人看到這句大概都會在想,這句話到底在搞什麼鳥?

之所以會出現這種奇怪的注釋,要麼是此段程式的作者(可能是馬克爾)根本不知道該如何解釋清楚,或者是維護這段程式的程式設計師完全看不懂這句話,所以有點兒抓毛。而實際上,它的作用(再加上y = y * ( threehalfs - ( x2 * y * y ) )這句牛頓迭代)就是求平方根。

至於是為什麼,本博主也不知道。

以雷神之鎚iii程式為藍本可以寫出比sqrt()更強大的求平方根函式:

[cpp]view plain

copy

intsqrt(

float

x)   

參考文獻:

1.wikipedia.org

2.

牛頓迭代法

創新工廠的筆試題 不用庫函式sqrt 求乙個整型數n的開方,要求精度達到0.001即可。在這裡首先介紹一下牛頓迭代法 假設乙個方程為 f x 0 那麼假設其解為x0,則用泰勒級數展開之後可得 f x f x0 f x0 x x0 0 其中x為其近似解。根據上式推導出 x x0 f x0 f x0 這...

牛頓迭代法

目前接觸到的牛頓迭代法主要應用於兩個方面 1 方程求根問題 2 最優化問題。1 求解方程。並不是所有的方程都有求根公式,或者求根公式很複雜,導致求解困難。利用牛頓法,可以迭代求解。原理是利用泰勒公式,在x0處展開,且展開到一階,即f x f x0 x x0 f x0 求解方程f x 0,即f x0 ...

牛頓迭代法

欲求某方程 f x 0 的根,按照以下步驟進行求解 令x0 1 也可以選擇其他值 i 0,1,2 1 求出 f xi 和 導數f xi 2 令 x i 1 xi f xi f xi 3 將 x i 1 帶入方程 f x 計算方程值,當方程值與目標值的誤差小於預定值時,退出演算法輸出 x i 1 即為...