最近的工作中,在求運算元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 即為...