牛頓迭代法是用來求函式零點的一種方法,求得的結果為數值解,速度較快。
如圖所示,從\(x_n\)開始迭代,過\((x_n, f(x_n))\)點作曲線\(f(x)\)的切線(圖中的紅色虛線),該切線的方程為
\(y-f(x_n)=f'(x_n)(x-x_n)\)
令y等於0,此時x的值即為\(x_\)的值
\(0-f(x_n)=f'(x_n)(x_-x_n)\)
化簡可得
\(x_=x_n-\frac\)
這就是牛頓迭代法的迭代公式,迭代次數越多則精度越高。
那麼如何知道迭代若干次後的結果的誤差呢?
如圖所示
假設迭代過程中\(x_n\)的值始終保持在\([a, b]\)的範圍內,零點為\(\xi\),即\(f(\xi)=0\)。那麼根據中值定理
\(f(x_n)-f(\xi)=f'(\eta)(x_n-\xi), \eta介於x_n和\xi之間\)
可以得出
\(x_n-\xi=\frac\)
如果取m為區間\([a, b]\)內\(f'(x)\)的最小值,即\(m=\min_ f'(x)\),那麼可以得到結果誤差的上界
\(\left | x_n-\xi \right | \le \frac\)
這就完成了誤差分析。
若要對m開平方,首先應該構造乙個函式,這個函式的零點是\(\sqrt m\),然後選取乙個初始值,開始對這個函式進行迭代,在結果滿足精度要求時停止迭代。
顯然可以建構函式為\(f(x)=x^2-m\),它的零點滿足上述要求。它的導數為\(f'(x)=2x\),那麼迭代公式為
\(x_=x_n-\frac=x_n-\frac=\frac(x_n+\frac)\)
假設\(m\ge1\),那麼可以令迭代區間為\([1, m]\),顯然建構函式在這個區間內單調遞增,因此
\(m=\min_ f'(x)=f'(1)=2\)
所以結果的誤差為
\(\left|x_n-\sqrt \right|\le \frac=\frac\)
下面來實際演練一下,以計算\(\sqrt 2\)為例。
首先選取乙個初始值,該值最好選取與估計值相差不大的數,比如選取\(x_0=2\)。
下面是迭代過程
\(x_0=2, 誤差\le 1\)
\(x_1=\frac}=\frac=1.5, 誤差\le \frac=0.125\)
\(x_2=\frac+\frac}}=\frac=1.4166\cdots, 誤差\le \frac=0.003472\cdots\)
\(x_3=\frac+\frac}}=\frac=1.41421\cdots, 誤差\le \frac=0.000003\cdots\)
\(x_4=\frac+\frac}}=\frac=1.41421356237\cdots, 誤差\le \frac=0.000000000002\cdots\)
僅迭代了4次,精度就已經到了\(10^\),可見這個演算法的速度還是比較快的。 (計算過程為保證精度所以避免除法運算,而使用分數運算,只有在停止迭代時才進行一次除法運算。這也為手算提供了可能性。閒得無聊可以算算打發時間(bushi)。)
基於牛頓法的開平方實現
牛頓法是求解最優問題的一種常用方法。本文主要在實現使用牛頓法進行開平方操作,使用python實現。在開平方求解中,更多的可以參考這篇文章。牛頓法是一種最優化求解方法,在迭代過程中求取到最接近解的值,類似的還有梯度下降等等。這裡主要講解我對該方法的推導,有錯誤之處麻煩指出。首先針對開根號求解,可用以下...
牛頓迭代法求解
牛頓迭代法又稱為牛頓 拉弗森方法,是牛頓在17世紀提出的一種在實數和複數域上近似求解方程的方法。牛頓迭代法的操作簡單來說就是通過不斷取切線,然後通過切線再不斷逼近相應的解,廢話不多說,我們來看例子。例如如下曲線 y x 2 1 我們在其上面任取一點,不妨取點 a 2,3 以該點做切線,切線方程為 y...
牛頓迭代法求平方根
sqrt 方法 public static double sqrt double c 什麼是牛頓迭代法 多數方程不存在求根公式,牛頓提出了一種用迭代來求方程近似根的方法。思路就是不斷取切線,用線性方程的根逼近非線性方程f x 0的根x 過程簡介 過點 xk,f xk 作函式的切線,切線方程是 切線與...