數值分析:線性方程組迭代求解

前言

常用的線性方程組的直接法求解方法有LU分解、高斯消去、列主元消去法等,但是這些直接法最大的缺點就是對系數矩陣要求太高!導致直接解法的通用性受限。反觀近似求解,迭代形式簡單、程序方便寫、創造收斂格式就可以迭代達到任意精度!看過本文后,相信以后你會選擇用迭代法。

本文所有方法對應的matlab程序

迭代方法

常用的迭代方法有3種:雅克比迭代、高斯-賽德爾迭代、(超)松弛迭代。3者的關系是:雅克比迭代 → 賽德爾迭代 → 松弛迭代。所以3者的思路是一樣的,這是迭代格式不一樣而已。

注意:本文所討論方程組都是n個方程n個未知數,即系數矩陣為正方形

雅克比迭代

對于下面的n個方程n個未知數的正方形線性方程組:

\begin{cases} a_{11}x_1 + a_{12}x_2 + a_{13}x_3 + \cdots + a_{1n}x_n = b_1 & \\ a_{21}x_1 + a_{22}x_2 + a_{23}x_3 + \cdots + a_{2n}x_n = b_2 & \\ \quad \quad \quad\quad\quad\quad\quad\quad\cdots \cdots & \\ a_{n1}x_1 + a_{n2}x_2 + a_{n3}x_3 + \cdots + a_{nn}x_n = b_n & \end{cases}

如果系數矩陣A可逆,且對角元素\color{red}{a_{ii}≠0},根據克拉默法則正方形方程組唯一解!現將方程改寫如下,即把第i行的x_i未知數單提到方程左邊:

\begin{cases} x_1 = \frac{1}{a_{11}}(\quad - a_{12}x_2 - a_{13}x_3 - \cdots - a_{1n}x_n + b_1) & \\ x_2 = \frac{1}{a_{22}}(a_{21}x_1- \quad - a_{23}x_3 - \cdots - a_{2n}x_n + b_2) & \\ \quad \quad \quad\quad\quad\quad\quad\quad\quad \cdots \cdots & \\ x_n = \frac{1}{a_{nn}}(a_{n1}x_1 - a_{n2}x_2 - \cdots - a_{n,n-1}x_{n-1} - \quad + b_n) & \end{cases}

上式改成迭代格式很簡單:

\begin{cases} x_1^{(k+1)} = \frac{1}{a_{11}}(\quad - a_{12}x_2^{(k)} - a_{13}x_3^{(k)} - \cdots - a_{1n}x_n^{(k)} + b_1) & \\ x_2^{(k+1)} = \frac{1}{a_{22}}(a_{21}x_1^{(k)}- \quad - a_{23}x_3^{(k)} - \cdots - a_{2n}x_n^{(k)} + b_2) & \\ \quad \quad \quad\quad\quad\quad\quad\quad\quad \cdots \cdots & \\ x_n^{(k+1)} = \frac{1}{a_{nn}}(a_{n1}x_1^{(k)} - a_{n2}x_2^{(k)} - \cdots - a_{n,n-1}x_{n-1}^{(k)} - \quad + b_n) & \end{cases}

或者把第i行的x_i在右邊空的地方填上,前面再補一個可得另一迭代格式:√

\begin{cases} x_1^{(k+1)} = x_1^{(k)} - \frac{1}{a_{11}}( a_{11}x_1^{(k)} + a_{12}x_2^{(k)} + a_{13}x_3^{(k)} + \cdots + a_{1n}x_n^{(k)} - b_1) & \\ x_2^{(k+1)} = x_2^{(k)} - \frac{1}{\color{blue}{a_{22}}}( a_{21}x_1^{(k)} + a_{22}x_2^{(k)} + a_{23}x_3^{(k)} + \cdots + a_{2n}x_n^{(k)} - b_2) & \\ \quad \quad \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad \cdots \cdots & \\ x_n^{(k+1)} = x_n^{(k)} - \frac{1}{\color{blue}{a_{nn}}}( a_{n1}x_1^{(k)} + a_{n2}x_2^{(k)} + a_{n3}x_3^{(k)} + \cdots + a_{nn}x_n^{(k)} - b_n) & \end{cases}

得到上面的迭代格式,其實任務已完成!但為了好編程,還是用矩陣表示為好,設:

x^{(k)} = (x_1^{(k)}, x_2^{(k)}, x_3^{(k)}, \cdots, x_n^{(k)})^T

b = (b_1, b_2, b_3, \cdots, b_n)^T

D = \left( \begin{matrix} a_{11} & 0 & 0 & \cdots & 0 \\ 0 & a_{22} & 0 & \cdots & 0 \\ 0 & 0 & a_{33} & \cdots & 0 \\ \vdots & \vdots & \vdots & & \vdots \\ 0 & 0 & 0 & \cdots & a_{nn} \end{matrix} \right)

隨意給定一組初始值x^{0},可得到3種完全等價矩陣迭代格式

\begin{cases} x^{(k+1)} = x^{(k)} - D^{-1}(Ax^{(k)} - b) & 用處: 推導后面2種方法 \\ x^{(k+1)} = \color{blue}{(E - D^{-1}A)}x^{(k)} + \color{blue}{D^{-1}b} & 用處: 用此式編程 \\ x^{(k+1)} = \color{blue}{B_1}x^{(k)} + \color{blue}{g_1} & 用處: B_1用來判斷收斂性 \end{cases}

注意:上面兩式中的藍色對應相等。

到此,雅克比迭代格式就得到了,可以看到非常容易編程實現!但是,大家注意到上面"標紅"的條件:對角線元素如果等于0了,那么D對角矩陣就不可逆,那迭代不就連格式都寫不出來?這里先埋下伏筆,后文會專門說明如何用"預處理"方法完美解決該問題!

高斯-賽德爾迭代

思想:在同一輪迭代中,前面已經更新的結果可以在本輪中給后面的用!而不是像雅克比迭代那樣等一輪全結束了再一起更新!因此收斂更快。

迭代格式為:

\begin{cases} x_1^{(k+1)} = x_1^{(k)} - \frac{1}{a_{11}}( a_{11}x_1^{(k)} + a_{12}x_2^{(k)} + a_{13}x_3^{(k)} + \cdots + a_{1n}x_n^{(k)} - b_1) & \\ x_2^{(k+1)} = x_2^{(k)} - \frac{1}{\color{blue}{a_{22}}}( a_{21}x_1^{\color{blue}{(k+1)}} + a_{22}x_2^{(k)} + a_{23}x_3^{(k)} + \cdots + a_{2n}x_n^{(k)} - b_2) & \\ \quad \quad \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad \cdots \cdots & \\ x_n^{(k+1)} = x_n^{(k)} - \frac{1}{\color{blue}{a_{nn}}}( a_{n1}x_1^{\color{blue}{(k+1)}} + a_{n2}x_2^{\color{blue}{(k+1)}} + a_{n3}x_3^{\color{blue}{(k+1)}} + \cdots + a_{nn}x_n^{(k)} - b_n) & \end{cases}

同樣改為矩陣格式,這里稍微多一步A系數矩陣單純拆成上、對角、下3個部分:

A = L + D + U

L = \left( \begin{matrix} 0 & 0 & 0 & \cdots & 0 \\ a_{21} & 0 & 0 & \cdots & 0 \\ a_{31} & a_{32} & 0 & \cdots & 0 \\ \vdots & \vdots & \vdots & & \vdots \\ a_{n1} & a_{n2} & a_{n3} & \cdots & 0 \end{matrix} \right) \quad U = \left( \begin{matrix} 0 & a_{12} & a_{13} & \cdots & a_{1n} \\ 0 & 0 & a_{23} & \cdots & a_{2n} \\ 0 & 0 & 0 & \cdots & a_{3n} \\ \vdots & \vdots & \vdots & & \vdots \\ 0 & 0 & 0 & \cdots & 0 \end{matrix} \right)

注意1:"單純"分解就是單純、簡單的拆分成上、對角、下這3個部分!
注意2:matlab如何快速單純取上下三角參考本文

隨意給定一組初始值x^{0},可得到2種完全等價矩陣迭代格式

\begin{cases} x^{(k+1)} = \color{blue}{-(D + L)^{-1}U}x^{(k)} + \color{blue}{(D+L)^{-1}b} & 用處: 用此式編程 \\ x^{(k+1)} = \color{blue}{B_2}x^{(k)} + \color{blue}{g_2} & 用處: B_2用來判斷收斂性 \end{cases}

高斯-賽德爾迭代到此結束,同樣非常好編程實現!但是同樣有一個潛在問題:如果對角矩陣D中有0,那么(D+L)這個下三角陣的對角元素有0,是不可逆的!也就是說和前面雅克比迭代一樣,系數矩陣A若對角元素有0,連迭代格式都寫不出來!

(超)松弛迭代:

前面高斯-賽德爾法中提到了將系數矩陣A進行單純/簡單分解:A = L + D + U,將上式分別帶入到雅克比、高斯-賽德爾中可得二者新的迭代公式(實際中不使用):

新雅克比迭代:

x^{(k+1)} = x^{(k)} - D^{-1}(Lx^{(k)} + Dx^{(k)} + Ux^{(k)} - b)

新高斯-賽德爾迭代:

x^{(k+1)} = x^{(k)} - D^{-1}(Lx^{\color{blue}{(k+1)}} + Dx^{(k)} + Ux^{(k)} - b)

說明:搞成上面這兩種迭代格式,純粹是為了了解他們真實迭代過程的內涵,不是為了實際使用(實際使用還是用前文說的那些)的哈!在新高斯-塞德斯基礎上引入一個常數ω,得到:

(超)松弛迭代

x^{(k+1)} = x^{(k)} - \color{blue}{\omega} D^{-1}(Lx^{\color{blue}{(k+1)}} + Dx^{(k)} + Ux^{(k)} - b)

同樣,將上式稍作改寫,即把所有的(k+1)次冪項都移到移到等號左邊,可得適宜編程和收斂判斷的最終的2種形式:

\begin{cases} x^{(k+1)} = \color{blue}{(D+\omega L)^{-1} [(1-\omega)D - \omega U]} x^{(k)} + \color{blue}{\omega (D+\omega L)^{-1}}b & 用處: 用此式編程 \\ x^{(k+1)} = \color{blue}{B_3}x^{(k)} + \color{blue}{g_3} & 用處: B_3用來判斷收斂性 \end{cases}

同樣,(超)松弛迭代也非常容易編程實現!只要參數ω數值給的得當,收斂速度會變高斯-賽德爾快!但至于取多少,很難定奪。

因為(超)松弛迭代就是基于高斯-賽德爾迭代來的,所以它同樣存在一個問題:如果系數矩陣A對角元素有0,那么同樣連迭代格式也寫不出來!下面我們就用一種簡單的"預處理"方法來完美解決對角元素有0的情況!目標:通過預處理后,新的等價方程組一定可以寫出迭代表達式!

迭代法的收斂性判斷

判斷所依據的迭代格式:

x^{(k+1)} = \color{red}{B}x^{(k)} + g

收斂充要條件:\rho(B) < 1,或:\parallel B \parallel < 1。即B譜半徑或任意一種范數要小于1,數值越小收斂越快

2條重要的特殊推論

  • 若系數矩陣A對稱正定陣,則高斯-賽德爾迭代對任意初始值都!收!斂!
  • 若系數矩陣A對稱正定陣,且松弛系數0 < \omega < 2,則(超)松弛迭代對任意初始值都!收!斂!

線性方程組預處理

預處理解決什么問題:如果n個方程n個未知數的線性方程組,它的系數矩陣A對角元素有0存在,那么任何一種迭代方法都寫不出來迭代表達式,即卡在第一步!因此,預處理就是為了解決這一問題。

開始之前,不給證明的列出3條關于"對角元素有0的方陣"的必備知識:

  • 非奇異方陣A經過一些行之間的調換,一定可以得到一個對角元素非0的新的形式!
  • 非奇異方陣AA^TA一定是一個對稱陣,且為"對稱正定陣";
  • (對稱)正定陣的主對角線元素一定都是大于0的!

( 注:上面3條信息的更多內容可參看這篇文章。)

有了上面的3條必備知識,下面介紹2條思路來做預處理:

  • 對原對角有0的系數矩陣A做行交換(b也得跟著換),直到換出一個對角元素無0的新形式!用新形式(新順序的線性方程組,肯定是等價的)來迭代;缺點:雖思路簡單直接,但是編程可能要用到"二分圖"來遍歷!不好實現。
  • 原方程兩邊同時左乘原系數矩陣A的轉置,形成了等價新形式:

\color{blue}{A^TA}x = \color{blue}{A^Tb}

這個方程左邊藍色看成新的系數矩陣,根據上面的第2、3條知識,這個矩陣一定是對稱正定的!它的對角線元素一定是都是大于0的!又因為兩邊左乘的是一個非奇異矩陣,所以新方程與原方程是完全等價的。優點:一個矩陣的轉置很好求。因此我推薦使用這種方法!!

用第2條思路做預處理,就這么簡單就完事了!并且這種處理是萬能適用的(根據知識2和3)!即:只要原方程確定有解(A非奇異),不管原系數矩陣A對角有多少個0(哪怕全是0)都能給你處理妥當!!迭代就根據新的方程組進行就行:

\begin{cases} \color{blue}{B_{4}}x = \color{blue}{g_4} & \\ \color{blue}{B_4} = \color{blue}{A^TA}\quad \color{blue}{g_4} = \color{blue}{A^Tb}& \\ \end{cases}

更加牛逼的是,根據"收斂性判斷"中的2條重要推論可得:預處理后的新方程形式,用高斯-賽德爾迭代一定收斂!!萬能!!


第1次更新

本次更新補充預處理中第1種思路的一種解決方法!利用:系數矩陣對角最大化。注意做列對換的時候,x中對應的行要跟著一起變,這樣方程才會等價;最后得到的解的順序還要再做一下調整,恢復到原方程的解的順序。程序參考本文開頭地址;"矩陣行列對換如何保持方程等價"參考本文"第1次"更新

一個簡單實例流程圖即可搞清:

圖1:對角最大化操作示意圖

這種方法雖然既不萬能(極端特殊情況導致變換完對角還有0!),而且還有些麻煩(對換A時x和b要跟著一起!)。但是它有一個優點:原先高斯-賽德爾迭代不收斂的系數陣,這樣換完有很大幾率變成收斂形式!這里給出程序中的一個例子:

% 原始系數矩陣: 
A =

     1     2     3     1
     1     4     6     2
     2     9     8     3
     3     7     7     2

這個原始的系數矩陣,未預處理時它的高斯-賽德爾迭代格式中的B的譜半徑是大于1的!是不收斂的!但是經過對換預處理后變成:

% 對換預處理后:
A =

     9     8     3     2
     7     7     2     3
     4     6     2     1
     2     3     1     1

對它再做高斯-賽德爾迭代,譜半徑小于1!可以收斂。

具體內容參考程序中的詳細注釋。

說明一個問題:為什么系數矩陣做不了對角占優的操作?

因為:對角占優考慮的每一行中的絕對值最大元素在對角位置。在線性方程中的對系數矩陣的等價變換只能是按行或按列來的,不能是元素與元素之間的交換這樣的(因為某2個元素改變了,后面x也跟著改變順序:這樣最多就滿足了一個方程,剩下的所有方程都不匹配了!所以等價變換只能行與行,列與列整體的換)。舉一個很簡單的例子,如下面的系數矩陣:

A =

    11    -2     3
     8    -5     2
     1     3     7

第1行不用動,11正好最大而在對角位置。第2行最大的8在第1列,想要換到第2列就要第1列和第2列對換,此時就會把第1列中已經排好的給再次打亂!

A =

    -2    11     3
     -5    8     2
     3     1     7

綜上:不是不想把系數矩陣搞成對角占優陣!而是在等價變換的限制下不可能實現!只能被迫選擇退而求次的本文的"對角最大化處理"!正因為是替代品,所以無法做到萬能。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 某君,某單位正式職工,嗜小賭。單位屬事業單位,管理松散,閑睱時分,職工三五成群,以打牌為樂。 牌戲名...
    鄧布利多又多閱讀 599評論 5 15
  • --404天 做每一件事情,操練的是自己,成長的是自己。別想給別人帶來什么,需要的只是展現操練后的結果。即便別人...
    Alina_qi閱讀 168評論 0 0
  • 上個星期被無聊帶了節奏,跟著閨蜜一起去看了傳說已久的前任3。想來無所事事,也能夠緩解一下自己的無聊感。...
    S小小肥閱讀 254評論 0 0
  • 01 1948年,羅伯特.利夫報考密蘇里大學,拿到了新聞學院伸出的橄欖枝。 1952年,朝鮮半島戰事火熱,羅伯特....
    言西小熊閱讀 567評論 3 14