牛頓迭代法
求近似解
概念
牛頓法又稱為牛頓-拉弗森方法,它是一種在實數域和復數域上近似求解方程的方法。方法使用函數\(f(x)\)的泰勒級數的前面幾項來尋找方程\(f(x)=0\)的根。
注意:牛頓法只能逼近解,不能計算精確解。
原理
利用泰勒公式,在\(x_0\)處展開,展開到一階,即:
\[f(x)=f(x_0)-f^{'}(x_0)(x-x_0) \tag{1} \]
令\(f(x)=0\),就是我們要找的方程的解,即:
\[x_1=x_0-\frac{f(x_0)}{f^{'}(x_0)} \tag{2} \]
同理,在\(x_1\)處展開,則:
\[x_2=x_1-\frac{f(x_1)}{f^{'}(x_1)} \tag{3} \]
依次計算,最終的根將無線逼近方程的解:
\[x_{n+1}=x_n-\frac{f(x_n)}{f^{'}(x_n)} \tag{4} \]
開二次方
要求常數\(a\)的近似解,我們可以構造函數,\(f(x)=x^2-a\),\(f^{'}(x)=2x\),則原來的牛頓迭代式為:
\[\Rightarrow x_{n+1}=x_n-\frac{x^2_n-a}{2x_n}=\frac{1}{2}(x_n+a/x_n) \tag{5} \]
給方程一個迭代初始值,\(x_0=a\),然后依次迭代求得方程近似解。
注意:初始化為負數可能會出現負數。
代碼
public static double static sqrt(double a){
if(a<0) return Double.NAN;
double e=1e-7;
double t=a;
while(Math.abs(t*t-a)>e)
{
t=(a/t+t)/2.0;
}
return t;
}
拓展
牛頓法開\(k\)次方,構造函數\(f(x)=x^k-a\),\(f^{'}(x)=kx^{k-1}\),則牛頓迭代式為:
\[x_{n+1}=x_n-\frac{x^k_n-a}{kx^{k-1}_n}=\frac{k-1}{k}x_n+\frac{a}{kx^{k-1}_n} \tag{6} \]
優化算法
除了經常被提起的梯度下降法,牛頓法也是機器學習中用的比較多的一種優化算法,牛頓法的速度很快,而且能高度逼近最優值。
求解優化函數\(f(x)\),轉化為求\(f^{'}(x)=0\)的解。
對\(x_k\)點進行泰勒展開,具體展開到二階:
\[f(x)=f(x_k)+f^{'}(x_k)(x-x_k)+ \frac{1}{2}f^{''}(x_k)(x-x_k)^2 \tag{7} \]
函數兩邊同時對\(x\)求導,並令\(f^{'}(x)\):
\[f^{'}(x)=f^{'}(x_k)+f^{''}(x_k)(x-x_k)=0 \tag{8} \]
\[\Rightarrow x=x_k-\frac{f^{'}(x_k)}{f^{''}(x_k)} \tag{9} \]
公式(9)
就是牛頓迭代更新公式。