牛頓迭代法

2022-04-28 23:12:15 字數 2525 閱讀 7208

最近的工作中,在求運算元softamx時需要使用牛頓迭代法,記錄下。

牛頓迭代法的具體內容可以參考 牛頓迭代法的維基百科頁面。

觀察本文上面的,憑藉我們的直覺可以發現,如果在函式\(f(x)\)的根附近的點\(x_n\)上畫一條切線,這條切線與\(x\)軸的交點\(x_\)比\(x_n\)更加接近方程的根。如果在\(x_\)這個點繼續使用上一次的方法,再畫一條切線,可以想見新的切線與\(x\)軸的交點肯定比\(x_\)更接近根,如此迭代就會越來越逼近方程的根。下面這幅圖表示的更清晰

所以,據此可以推導出如下的方程,

\[\frac - x_n} = f'(x_n)

\]進一步化簡可以得到,

\[x_=x_-)})}}

\]這就是牛頓迭代法的基本公式。

但是牛頓迭代法不一定總是有效,已有證明牛頓迭代法的二次收斂必須滿足以下條件:

所以使用牛頓迭代法,首先需要選擇離方程的根足夠近的起點,而且這個起點的切線斜率不能為0。

牛頓迭代法的另一種推導方式是使用泰勒展開式

\[f(x)=f(x_0)+f^\prime(x_0)(x-x_0)+\fracf^(x_0)(x-x_0)^2+\dots + \fracf^(x_0)(x-x_0)^n + o(x-x_0)^n

\]使用一階展開近似可以得到

\[f(x)=f(x_0)+f^\prime(x_0)(x-x_0)

\]化簡就可以得到之前的方程(2)。

使用牛頓迭代法可以求函式的極值,通過迭代的方法求方程\(f(x)\)的極值。根據微積分原理,令\(f'(x) = 0\)的\(x\)就是函式的極值所在,同樣利用泰勒公式展開到二階,有

\[f(x)=f(x_0)+f^\prime(x_0)(x-x_0)+\fracf^(x_0)(x-x_0)^2

\]兩邊同時對\(x\)求導數,並令其為0,我們就能得到

\[f^\prime(x_0)+f^(x_0)(x-x_0) = 0

\]同樣可以得到

\[x=x_0-)})}}

\]這就是牛頓迭代法求極值的理論依據。

假設計算機中有求倒數的指令\(y = rec(x) = 1/x\),但是精度不高,如何通過牛頓迭代法提高精度?

可以這麼想,假設我們的輸入是\(a\),那麼我們對輸入求倒數就等價於求方程\(a = 1/x\)的根,也就是求方程\(f(x) = 1/x -a\)的根,那麼根據牛頓迭代法,如果我們找到乙個初值\(x_0\),就可以按照如下的方程來迭代

\[x_ = x_n - \frac=2x_n - ax_^2

\]而剛好這個初值就是指令使用一次之後的結果(相比隨意找乙個數字,這個值離根更近),即\(x_0 = 1/a = rec(a)\)。

下面我們使用牛頓迭代法用c++的**求解乙個數的立方根,假定這個數是\(a\),該問題等價於求方程\(x^3 = a\)的根,也就是求方程\(f(x) = x^3 - a\)的根。根據牛頓迭代法,可以按照如下的步驟求根

確定迭代的終止條件,我們假設假定\(|x_n^3 - a |< 0.00001\)即停止該迭代;

確定初始點,即選擇合適的\(x_0\)。很明顯如果\(a = 0\),方程的根就是0,我們選取1作為初始點;

確認迭代方程,根據方程(2),我們的迭代方程是

\[x_ = \frac+\frac

\]於是,我們的程式如下所示

#include #include using namespace std;

int main()

cout << "final x is "<< x1 << " and result is "<< x1*x1*x1 << endl;

return 0;

}

使用這個程式求解-34.5的立方根結果如下

1 : actual data -- -1271.41, result -- 1236.91

2 : actual data -- -392.257, result -- 357.757

3 : actual data -- -132.242, result -- 97.7418

4 : actual data -- -56.6032, result -- 22.1032

5 : actual data -- -37.2522, result -- 2.75222

6 : actual data -- -34.5672, result -- 0.0672223

7 : actual data -- -34.5, result -- 4.35659e-05

8 : actual data -- -34.5, result -- 1.83391e-11

final x is -3.25542 and result is -34.5

可以看出通過8輪迭代就找到了-34.5的近似根-3.25542。

牛頓迭代法

創新工廠的筆試題 不用庫函式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 即為...