前言
常用的線性方程組的直接法求解方法有LU分解、高斯消去、列主元消去法等,但是這些直接法最大的缺點就是對系數矩陣要求太高!導致直接解法的通用性受限。反觀近似求解,迭代形式簡單、程序方便寫、創造收斂格式就可以迭代達到任意精度!看過本文后,相信以后你會選擇用迭代法。
迭代方法
常用的迭代方法有3種:雅克比迭代、高斯-賽德爾迭代、(超)松弛迭代。3者的關系是:雅克比迭代 → 賽德爾迭代 → 松弛迭代。所以3者的思路是一樣的,這是迭代格式不一樣而已。
注意:本文所討論方程組都是n個方程n個未知數,即系數矩陣為正方形。
雅克比迭代
對于下面的n個方程n個未知數的正方形線性方程組:
如果系數矩陣A可逆,且對角元素,根據克拉默法則該正方形方程組有唯一解!現將方程改寫如下,即把第
行的
未知數單提到方程左邊:
上式改成迭代格式很簡單:
或者把第行的
在右邊空的地方填上,前面再補一個可得另一迭代格式:√
得到上面的迭代格式,其實任務已完成!但為了好編程,還是用矩陣表示為好,設:
隨意給定一組初始值,可得到3種完全等價的矩陣迭代格式:
注意:上面兩式中的藍色對應相等。
到此,雅克比迭代格式就得到了,可以看到非常容易編程實現!但是,大家注意到上面"標紅"的條件:對角線元素如果等于0了,那么D對角矩陣就不可逆,那迭代不就連格式都寫不出來?這里先埋下伏筆,后文會專門說明如何用"預處理"方法完美解決該問題!
高斯-賽德爾迭代
思想:在同一輪迭代中,前面已經更新的結果可以在本輪中給后面的用!而不是像雅克比迭代那樣等一輪全結束了再一起更新!因此收斂更快。
迭代格式為:
同樣改為矩陣格式,這里稍微多一步把A系數矩陣單純拆成上、對角、下3個部分:
注意1:"單純"分解就是單純、簡單的拆分成上、對角、下這3個部分!
注意2:matlab如何快速單純取上下三角參考本文!
隨意給定一組初始值,可得到2種完全等價的矩陣迭代格式:
高斯-賽德爾迭代到此結束,同樣非常好編程實現!但是同樣有一個潛在問題:如果對角矩陣D中有0,那么(D+L)這個下三角陣的對角元素有0,是不可逆的!也就是說和前面雅克比迭代一樣,系數矩陣A若對角元素有0,連迭代格式都寫不出來!
(超)松弛迭代:
前面高斯-賽德爾法中提到了將系數矩陣A進行單純/簡單分解:,將上式分別帶入到雅克比、高斯-賽德爾中可得二者新的迭代公式(實際中不使用):
新雅克比迭代:
新高斯-賽德爾迭代:
說明:搞成上面這兩種迭代格式,純粹是為了了解他們真實迭代過程的內涵,不是為了實際使用(實際使用還是用前文說的那些)的哈!在新高斯-塞德斯基礎上引入一個常數ω,得到:
(超)松弛迭代:
同樣,將上式稍作改寫,即把所有的(k+1)次冪項都移到移到等號左邊,可得適宜編程和收斂判斷的最終的2種形式:
同樣,(超)松弛迭代也非常容易編程實現!只要參數ω數值給的得當,收斂速度會變高斯-賽德爾快!但至于取多少,很難定奪。
因為(超)松弛迭代就是基于高斯-賽德爾迭代來的,所以它同樣存在一個問題:如果系數矩陣A對角元素有0,那么同樣連迭代格式也寫不出來!下面我們就用一種簡單的"預處理"方法來完美解決對角元素有0的情況!目標:通過預處理后,新的等價方程組一定可以寫出迭代表達式!
迭代法的收斂性判斷
判斷所依據的迭代格式:
收斂充要條件:,或:
。即B的譜半徑或任意一種范數要小于1,數值越小收斂越快!
2條重要的特殊推論:
- 若系數矩陣A為對稱正定陣,則高斯-賽德爾迭代對任意初始值都!收!斂!
- 若系數矩陣A為對稱正定陣,且松弛系數
,則(超)松弛迭代對任意初始值都!收!斂!
線性方程組預處理
預處理解決什么問題:如果n個方程n個未知數的線性方程組,它的系數矩陣A的對角元素有0存在,那么任何一種迭代方法都寫不出來迭代表達式,即卡在第一步!因此,預處理就是為了解決這一問題。
開始之前,不給證明的列出3條關于"對角元素有0的方陣"的必備知識:
- 非奇異方陣A經過一些行之間的調換,一定可以得到一個對角元素非0的新的形式!
- 非奇異方陣A,
一定是一個對稱陣,且為"對稱正定陣";
- (對稱)正定陣的主對角線元素一定都是大于0的!
( 注:上面3條信息的更多內容可參看這篇文章。)
有了上面的3條必備知識,下面介紹2條思路來做預處理:
- 對原對角有0的系數矩陣A做行交換(b也得跟著換),直到換出一個對角元素無0的新形式!用新形式(新順序的線性方程組,肯定是等價的)來迭代;缺點:雖思路簡單直接,但是編程可能要用到"二分圖"來遍歷!不好實現。
- 原方程兩邊同時左乘原系數矩陣A的轉置,形成了等價新形式:
這個方程左邊藍色看成新的系數矩陣,根據上面的第2、3條知識,這個矩陣一定是對稱正定的!它的對角線元素一定是都是大于0的!又因為兩邊左乘的是一個非奇異矩陣,所以新方程與原方程是完全等價的。優點:一個矩陣的轉置很好求。因此我推薦使用這種方法!!
用第2條思路做預處理,就這么簡單就完事了!并且這種處理是萬能適用的(根據知識2和3)!即:只要原方程確定有解(A非奇異),不管原系數矩陣A對角有多少個0(哪怕全是0)都能給你處理妥當!!迭代就根據新的方程組進行就行:
更加牛逼的是,根據"收斂性判斷"中的2條重要推論可得:預處理后的新方程形式,用高斯-賽德爾迭代一定收斂!!萬能!!
第1次更新
本次更新補充預處理中第1種思路的一種解決方法!利用:系數矩陣對角最大化。注意做列對換的時候,x中對應的行要跟著一起變,這樣方程才會等價;最后得到的解的順序還要再做一下調整,恢復到原方程的解的順序。程序參考本文開頭地址;"矩陣行列對換如何保持方程等價"參考本文"第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
綜上:不是不想把系數矩陣搞成對角占優陣!而是在等價變換的限制下不可能實現!只能被迫選擇退而求次的本文的"對角最大化處理"!正因為是替代品,所以無法做到萬能。