1. 程式人生 > 其它 >IIS 10.0 無法安裝 URL rewrite重寫模組 2.0解決辦法

IIS 10.0 無法安裝 URL rewrite重寫模組 2.0解決辦法

牛頓迭代法

求近似解

概念

牛頓法又稱為牛頓-拉弗森方法,它是一種在實數域和複數域上近似求解方程的方法。方法使用函式\(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} \]

(1) 牛頓法

優化演算法

除了經常被提起的梯度下降法,牛頓法也是機器學習中用的比較多的一種優化演算法,牛頓法的速度很快,而且能高度逼近最優值。

求解優化函式\(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)就是牛頓迭代更新公式。