1. 程式人生 > >Moore-Penrose廣義逆:可解決MATLAB報錯“矩陣接近奇異值,或者縮放錯誤。結果可能不準確”

Moore-Penrose廣義逆:可解決MATLAB報錯“矩陣接近奇異值,或者縮放錯誤。結果可能不準確”

但實際上執行過程中我們會遇到:當AX=b線性方程組是一個病態方程組;或者A是奇異矩陣(即det(A)=0,不可逆),沒法求逆,用不了inv(A)方法只能用A\b,此時MATLAB會報錯“矩陣接近奇異值,或者縮放錯誤。結果可能不準確”…網路上很多人問這個問題怎麼解決,其實不是MATLAB的問題,而是MATLAB內建演算法的魯棒性問題,直接用A\b方法無法處理這個棘手的問題。如果沒有矩陣論或數值計算方法基礎的同學可能會一頭霧水。本文借用Moore-Penrose廣義逆來解決這個問題,幫助大家理解帶奇異矩陣的病態方程組如何解決。

首先我們先來看下mldivide, \在MATLAB中的含義:

也就是說,A\b的方法是可以求包含奇異矩陣的方程組的,但是可能會出錯。而且錯誤可能非常離譜。(這個例子告誡我們,不要以為MATLAB算出來的結果都是準確的,MATLAB也不過是呼叫一些演算法進行運算,每個演算法都可能存在一些缺陷,無法處理某些極端的情況)。大家可以看一下它內建演算法原理:https://ww2.mathworks.cn/help/matlab/ref/mldivide_full_zh_CN.png

這裡就涉及到數值計算方法領域矩陣的性態的問題了。我們可以直觀來感受一下:

假設如下方程組:

其精確解是(1,1)。

若對左右邊都做一些非常非常微小的變化:

其精確解變為:(10,-2)。

一個非常非常微小的擾動就讓方程的解產生巨大的變動,我們稱上述方程組是病態方程組,係數矩陣A是病態矩陣。

如果我們遇到不是方陣的矩陣,或者不能求逆的方陣,要想求解AX=b,避免奇異值導致MATLAB產生錯誤的情況,我們可以採用“偽逆”來幫助我們解決這個問題。

廣義逆矩陣

對任意一個矩陣A,提出四個條件:

如果存在矩陣G滿足上述的一部分或全部條件,G就可以稱為A的廣義逆矩陣。最常用的四種廣義逆矩陣定義如下:

MATLAB中自帶的pinv方法,就可以求矩陣的M-P廣義逆,即A+矩陣。官方文件:

大家可以查閱官方文件看具體應用例項。

如果我們求出A+,就可以有另一種思路來解AX=b了:

這裡,通解的表示式還是類似於X=X*+X0的形式,A+b相當於是特解,後面那一項就是帶係數的自由解,y可以取任意數,注意維度匹配即可。

所以,大家呼叫pinv求出M-P廣義逆,然後用x=A+b + (I-A+A)y這個式子構造出通解就可以啦!