方程求根的迭代法

浮半名生發表於2024-12-07

初次釋出於我的個人文件。(每次都是個人文件優先發布哦)

本文想簡要介紹一下如何用計算機是如何用迭代法計算方程和方程組的根的。

不動點迭代

在高中階段你可能學習過這樣的叫蛛網圖的東西:

蛛網圖

蛛網圖迭代的極限就是函式的不動點。

所謂不動點迭代就是利用了這樣的性質。

一般地,我們想求解方程f(x)=0,如果我們可以將這個方程轉化為x=g(x),那麼g(X)的不動點就是f(x)的零點。

而g(x)的不動點又是蛛網圖迭代的極限。

如果用代數語言表示的話,就是迭代公式

$$x_{k+1}=g(x_k)$$

這就是不動點迭代求方程的根的方法。

當然,如果要更嚴謹化的說明的話,就是下面的壓縮映像原理:

設g(x)在[a,b]上具有連續的一階導數,且滿足以下條件:

1.$\forall x \in [a,b],g(x) \in [a,b]$

2.$\exist 0 \le L <1,s.t. \forall x\in [a,b],|g'(x)|\le L$

則迭代過程

$x_{k+1}=g(x_k)$收斂,且有誤差估計式:

$|x^*-x_k|\le \frac{L^k}{1-L}|x_1-x_0|$

從誤差估計式看,k越大估計值$x_k$會離準確值$x^*$越來越近。

這就足以為不動點迭代法背書了。

牛頓迭代法

將不動點迭代進一步推廣就能得到牛頓迭代法。

前面我們知道,我們想求解方程f(x)=0,如果我們可以將這個方程轉化為x=g(x),然後用迭代公式$x_{k+1}=g(x_k)$求解。

但是我們不知道如何把方程轉化為x=g(x),牛頓迭代法就是解決了這個問題。

思路其實也非常簡單,我們知道微分有dy=f'(x)dx,於是$f(x)-f(x_k) \approx f'(x_k)(x-x_k)$。

從而$f(x)=f(x_k)+f'(x_k)(x-x_k)=0$

那麼$x=x_k-\frac{f(x_k)}{f'(x_k)}$,完成啦!

我們把f(x)=0轉化為了x=g(x)的形式了,從而再使用不動點迭代得到f(X)根的迭代公式:

$x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)}$

這就是牛頓迭代法。

弦截法

對於某些函式其導數不便於求解,所以我們可以用差商替代導數,這就是弦截法了。

用$f'(x) \approx \frac{f(x_k)-f(x_0)}{x_k-x_0}$代入牛頓迭代法,就是弦截法了。

如果用$f'(x) \approx \frac{f(x_k)-f(x_{k-1})}{x_k-x_{k-1}}$代入牛頓迭代法,就是快速弦截法了。

雅可比迭代法

對於線性方程組,方法其實是類似的。

線性方程組AX=b如果我們可以將其化為X=BX+f,那麼用不動點迭代就有迭代公式

$X_{k+1}=BX_k+f$

這是我們線性方程組迭代法的基石。

它的誤差:

$e_{k+1}=|x*-x_{k+1}|=|BX+f-(BX_{k}+f)|=B|X^-X_k|=Be_k$

從而,$e_k=B^ke_0$

那麼如果$B^k$能收斂於0的話該迭代法就收斂了,可以演算得到這等價於B的譜半徑(最大特徵值)小於1。

但是還是一樣的,不動點迭代法說的輕巧,但是你怎麼把AX=b轉化成X=BX+f呢?

其中的一種方法就是雅可比迭代法了。

對方程組AX=b,我們將A分解為對角陣D,下三角矩陣L,上三角矩陣U使得

A=D-L-U。

(值得一提的是,這個分解是相當容易的,D就是A的對角元,L取A的下三角去掉主對角線,U取A的上三角去掉主對角線即可)

那麼AX=b就是

(D-L-U)X=b

然後移項得

DX=(L+U)X+b

從而$X=D{-1}(L+U)X+Db$

完事了,已經變成X=BX+f的形式了,所以就有迭代公式

$X_{k+1}=D{-1}(L+U)X_k+Db$

這就是雅可比迭代法了。

但是這個方法可以稍微變一下,我們移項的時候不一定要把L和U全部移走,這就是高斯-賽德爾迭代法了。

高斯-賽德爾迭代法

還是安裝雅可比迭代的步驟我們得到,(D-L-U)X=b移項但是隻移U得到

(D-L)X=UX+b

然後得到$X=(D-L){-1}UX+(D-L)b$

於是就有迭代公式$X_{k+1}=(D-L){-1}UX_k+(D-L)b$

但是我們一般不會這麼使用,而是再等式兩邊再乘以D-L得到

$(D-L)X_{k+1}=UX_k+b$

從而$DX_{k+1}=LX_{k+1}+UX_k+b$

所以$X_{k+1}=D{-1}LX_{k+1}+DUX_k+D^{-1}B$

這才是我們一般最愛用的高斯-賽德爾迭代公式。

相關文章