前言
常用的線性方程組的直接法求解方法有LU分解埋虹、高斯消去诗鸭、列主元消去法等,但是這些直接法最大的缺點(diǎn)就是對(duì)系數(shù)矩陣要求太高对室!導(dǎo)致直接解法的通用性受限。反觀近似求解咖祭,迭代形式簡(jiǎn)單掩宜、程序方便寫(xiě)、創(chuàng)造收斂格式就可以迭代達(dá)到任意精度么翰!看過(guò)本文后牺汤,相信以后你會(huì)選擇用迭代法。
迭代方法
常用的迭代方法有3種:雅克比迭代浩嫌、高斯-賽德?tīng)柕?超)松弛迭代檐迟。3者的關(guān)系是:雅克比迭代 → 賽德?tīng)柕?→ 松弛迭代。所以3者的思路是一樣的码耐,這是迭代格式不一樣而已追迟。
注意:本文所討論方程組都是n個(gè)方程n個(gè)未知數(shù),即系數(shù)矩陣為正方形骚腥。
雅克比迭代
對(duì)于下面的n個(gè)方程n個(gè)未知數(shù)的正方形線性方程組:
如果系數(shù)矩陣A可逆敦间,且對(duì)角元素,根據(jù)克拉默法則該正方形方程組有唯一解束铭!現(xiàn)將方程改寫(xiě)如下廓块,即把第行的未知數(shù)單提到方程左邊:
上式改成迭代格式很簡(jiǎn)單:
或者把第行的在右邊空的地方填上,前面再補(bǔ)一個(gè)可得另一迭代格式:√
得到上面的迭代格式契沫,其實(shí)任務(wù)已完成带猴!但為了好編程,還是用矩陣表示為好懈万,設(shè):
隨意給定一組初始值拴清,可得到3種完全等價(jià)的矩陣迭代格式:
注意:上面兩式中的藍(lán)色對(duì)應(yīng)相等。
到此钞速,雅克比迭代格式就得到了贷掖,可以看到非常容易編程實(shí)現(xiàn)!但是渴语,大家注意到上面"標(biāo)紅"的條件:對(duì)角線元素如果等于0了苹威,那么D對(duì)角矩陣就不可逆,那迭代不就連格式都寫(xiě)不出來(lái)驾凶?這里先埋下伏筆牙甫,后文會(huì)專(zhuān)門(mén)說(shuō)明如何用"預(yù)處理"方法完美解決該問(wèn)題掷酗!
高斯-賽德?tīng)柕?/h2>
思想:在同一輪迭代中,前面已經(jīng)更新的結(jié)果可以在本輪中給后面的用窟哺!而不是像雅克比迭代那樣等一輪全結(jié)束了再一起更新泻轰!因此收斂更快。
迭代格式為:
同樣改為矩陣格式且轨,這里稍微多一步把A系數(shù)矩陣單純拆成上浮声、對(duì)角、下3個(gè)部分:
注意1:"單純"分解就是單純旋奢、簡(jiǎn)單的拆分成上泳挥、對(duì)角、下這3個(gè)部分至朗!
注意2:matlab如何快速單純?nèi)∩舷氯菂⒖急疚?/a>屉符!
隨意給定一組初始值,可得到2種完全等價(jià)的矩陣迭代格式:
高斯-賽德?tīng)柕酱私Y(jié)束锹引,同樣非常好編程實(shí)現(xiàn)矗钟!但是同樣有一個(gè)潛在問(wèn)題:如果對(duì)角矩陣D中有0,那么(D+L)這個(gè)下三角陣的對(duì)角元素有0嫌变,是不可逆的吨艇!也就是說(shuō)和前面雅克比迭代一樣,系數(shù)矩陣A若對(duì)角元素有0腾啥,連迭代格式都寫(xiě)不出來(lái)秸应!
(超)松弛迭代:
前面高斯-賽德?tīng)柗ㄖ刑岬搅藢⑾禂?shù)矩陣A進(jìn)行單純/簡(jiǎn)單分解:,將上式分別帶入到雅克比碑宴、高斯-賽德?tīng)栔锌傻枚咝碌牡?實(shí)際中不使用):
新雅克比迭代:
新高斯-賽德?tīng)柕?/p>
說(shuō)明:搞成上面這兩種迭代格式软啼,純粹是為了了解他們真實(shí)迭代過(guò)程的內(nèi)涵,不是為了實(shí)際使用(實(shí)際使用還是用前文說(shuō)的那些)的哈延柠!在新高斯-塞德斯基礎(chǔ)上引入一個(gè)常數(shù)ω祸挪,得到:
(超)松弛迭代:
同樣,將上式稍作改寫(xiě)贞间,即把所有的(k+1)次冪項(xiàng)都移到移到等號(hào)左邊贿条,可得適宜編程和收斂判斷的最終的2種形式:
同樣,(超)松弛迭代也非常容易編程實(shí)現(xiàn)增热!只要參數(shù)ω?cái)?shù)值給的得當(dāng)整以,收斂速度會(huì)變高斯-賽德?tīng)柨欤〉劣谌《嗌倬穑茈y定奪公黑。
因?yàn)?超)松弛迭代就是基于高斯-賽德?tīng)柕鷣?lái)的,所以它同樣存在一個(gè)問(wèn)題:如果系數(shù)矩陣A對(duì)角元素有0,那么同樣連迭代格式也寫(xiě)不出來(lái)凡蚜!下面我們就用一種簡(jiǎn)單的"預(yù)處理"方法來(lái)完美解決對(duì)角元素有0的情況人断!目標(biāo):通過(guò)預(yù)處理后,新的等價(jià)方程組一定可以寫(xiě)出迭代表達(dá)式朝蜘!
迭代法的收斂性判斷
判斷所依據(jù)的迭代格式:
收斂充要條件:恶迈,或:。即B的譜半徑或任意一種范數(shù)要小于1谱醇,數(shù)值越小收斂越快暇仲!
2條重要的特殊推論:
- 若系數(shù)矩陣A為對(duì)稱正定陣,則高斯-賽德?tīng)?/strong>迭代對(duì)任意初始值都副渴!收熔吗!斂!
- 若系數(shù)矩陣A為對(duì)稱正定陣佳晶,且松弛系數(shù),則(超)松弛迭代對(duì)任意初始值都讼载!收轿秧!斂!
線性方程組預(yù)處理
預(yù)處理解決什么問(wèn)題:如果n個(gè)方程n個(gè)未知數(shù)的線性方程組咨堤,它的系數(shù)矩陣A的對(duì)角元素有0存在菇篡,那么任何一種迭代方法都寫(xiě)不出來(lái)迭代表達(dá)式,即卡在第一步一喘!因此驱还,預(yù)處理就是為了解決這一問(wèn)題。
開(kāi)始之前凸克,不給證明的列出3條關(guān)于"對(duì)角元素有0的方陣"的必備知識(shí):
- 非奇異方陣A經(jīng)過(guò)一些行之間的調(diào)換议蟆,一定可以得到一個(gè)對(duì)角元素非0的新的形式!
- 非奇異方陣A萎战,一定是一個(gè)對(duì)稱陣咐容,且為"對(duì)稱正定陣";
- (對(duì)稱)正定陣的主對(duì)角線元素一定都是大于0的蚂维!
( 注:上面3條信息的更多內(nèi)容可參看這篇文章戳粒。)
有了上面的3條必備知識(shí),下面介紹2條思路來(lái)做預(yù)處理:
- 對(duì)原對(duì)角有0的系數(shù)矩陣A做行交換(b也得跟著換)虫啥,直到換出一個(gè)對(duì)角元素?zé)o0的新形式蔚约!用新形式(新順序的線性方程組,肯定是等價(jià)的)來(lái)迭代涂籽;缺點(diǎn):雖思路簡(jiǎn)單直接苹祟,但是編程可能要用到"二分圖"來(lái)遍歷!不好實(shí)現(xiàn)。
- 原方程兩邊同時(shí)左乘原系數(shù)矩陣A的轉(zhuǎn)置苔咪,形成了等價(jià)新形式:
這個(gè)方程左邊藍(lán)色看成新的系數(shù)矩陣锰悼,根據(jù)上面的第2、3條知識(shí)团赏,這個(gè)矩陣一定是對(duì)稱正定的箕般!它的對(duì)角線元素一定是都是大于0的!又因?yàn)閮蛇?strong>左乘的是一個(gè)非奇異矩陣舔清,所以新方程與原方程是完全等價(jià)的丝里。優(yōu)點(diǎn):一個(gè)矩陣的轉(zhuǎn)置很好求。因此我推薦使用這種方法L遐恕杯聚!
用第2條思路做預(yù)處理,就這么簡(jiǎn)單就完事了抒痒!并且這種處理是萬(wàn)能適用的(根據(jù)知識(shí)2和3)幌绍!即:只要原方程確定有解(A非奇異),不管原系數(shù)矩陣A對(duì)角有多少個(gè)0(哪怕全是0)都能給你處理妥當(dāng)9氏臁傀广!迭代就根據(jù)新的方程組進(jìn)行就行:
更加牛逼的是,根據(jù)"收斂性判斷"中的2條重要推論可得:預(yù)處理后的新方程形式彩届,用高斯-賽德?tīng)柕欢ㄊ諗浚伪冰。∪f(wàn)能U寥洹贮聂!
第1次更新
本次更新補(bǔ)充預(yù)處理中第1種思路的一種解決方法!利用:系數(shù)矩陣對(duì)角最大化寨辩。注意做列對(duì)換的時(shí)候吓懈,x中對(duì)應(yīng)的行要跟著一起變,這樣方程才會(huì)等價(jià)靡狞;最后得到的解的順序還要再做一下調(diào)整骄瓣,恢復(fù)到原方程的解的順序。程序參考本文開(kāi)頭地址耍攘;"矩陣行列對(duì)換如何保持方程等價(jià)"參考本文"第1次"更新榕栏。
一個(gè)簡(jiǎn)單實(shí)例流程圖即可搞清:
這種方法雖然既不萬(wàn)能(極端特殊情況導(dǎo)致變換完對(duì)角還有0!)蕾各,而且還有些麻煩(對(duì)換A時(shí)x和b要跟著一起扒磁!)。但是它有一個(gè)優(yōu)點(diǎn):原先高斯-賽德?tīng)柕皇諗康南禂?shù)陣式曲,這樣換完有很大幾率變成收斂形式妨托!這里給出程序中的一個(gè)例子:
% 原始系數(shù)矩陣:
A =
1 2 3 1
1 4 6 2
2 9 8 3
3 7 7 2
這個(gè)原始的系數(shù)矩陣缸榛,未預(yù)處理時(shí)它的高斯-賽德?tīng)柕袷街械?strong>B的譜半徑是大于1的!是不收斂的兰伤!但是經(jīng)過(guò)對(duì)換預(yù)處理后變成:
% 對(duì)換預(yù)處理后:
A =
9 8 3 2
7 7 2 3
4 6 2 1
2 3 1 1
對(duì)它再做高斯-賽德?tīng)柕诳牛V半徑小于1!可以收斂敦腔。
具體內(nèi)容參考程序中的詳細(xì)注釋均澳。
說(shuō)明一個(gè)問(wèn)題:為什么系數(shù)矩陣做不了對(duì)角占優(yōu)的操作?
因?yàn)椋簩?duì)角占優(yōu)考慮的每一行中的絕對(duì)值最大元素在對(duì)角位置符衔。在線性方程中的對(duì)系數(shù)矩陣的等價(jià)變換只能是按行或按列來(lái)的找前,不能是元素與元素之間的交換這樣的(因?yàn)槟?個(gè)元素改變了,后面x也跟著改變順序:這樣最多就滿足了一個(gè)方程判族,剩下的所有方程都不匹配了躺盛!所以等價(jià)變換只能行與行,列與列整體的換)形帮。舉一個(gè)很簡(jiǎn)單的例子槽惫,如下面的系數(shù)矩陣:
A =
11 -2 3
8 -5 2
1 3 7
第1行不用動(dòng),11正好最大而在對(duì)角位置辩撑。第2行最大的8在第1列界斜,想要換到第2列就要第1列和第2列對(duì)換,此時(shí)就會(huì)把第1列中已經(jīng)排好的給再次打亂槐臀!
A =
-2 11 3
-5 8 2
3 1 7
綜上:不是不想把系數(shù)矩陣搞成對(duì)角占優(yōu)陣!而是在等價(jià)變換的限制下不可能實(shí)現(xiàn)氓仲!只能被迫選擇退而求次的本文的"對(duì)角最大化處理"水慨!正因?yàn)槭翘娲罚詿o(wú)法做到萬(wàn)能敬扛。