Moore-Penrose广义逆:可解决MATLAB报错“矩阵接近奇异值,或者缩放错误。结果可能不准确”
上一篇博文講到:《方程AX=b的解的討論(特解、通解、零空間向量等概念)及其MATLAB實現(xiàn)》,程序中用到的是mldivide或者A\b的方法(二者相同)來解方程。
但實際上運行過程中我們會遇到:當AX=b線性方程組是一個病態(tài)方程組;或者A是奇異矩陣(即det(A)=0,不可逆),沒法求逆,用不了inv(A)方法只能用A\b,此時MATLAB會報錯“矩陣接近奇異值,或者縮放錯誤。結(jié)果可能不準確”…網(wǎng)絡(luò)上很多人問這個問題怎么解決,其實不是MATLAB的問題,而是MATLAB內(nèi)置算法的魯棒性問題,直接用A\b方法無法處理這個棘手的問題。如果沒有矩陣論或數(shù)值計算方法基礎(chǔ)的同學可能會一頭霧水。本文借用Moore-Penrose廣義逆來解決這個問題,幫助大家理解帶奇異矩陣的病態(tài)方程組如何解決。
首先我們先來看下mldivide, \在MATLAB中的含義:
也就是說,A\b的方法是可以求包含奇異矩陣的方程組的,但是可能會出錯。而且錯誤可能非常離譜。(這個例子告誡我們,不要以為MATLAB算出來的結(jié)果都是準確的,MATLAB也不過是調(diào)用一些算法進行運算,每個算法都可能存在一些缺陷,無法處理某些極端的情況)。大家可以看一下它內(nèi)置算法原理:https://ww2.mathworks.cn/help/matlab/ref/mldivide_full_zh_CN.png
這里就涉及到數(shù)值計算方法領(lǐng)域矩陣的性態(tài)的問題了。我們可以直觀來感受一下:
假設(shè)如下方程組:
其精確解是(1,1)。
若對左右邊都做一些非常非常微小的變化:
其精確解變?yōu)?#xff1a;(10,-2)。
一個非常非常微小的擾動就讓方程的解產(chǎn)生巨大的變動,我們稱上述方程組是病態(tài)方程組,系數(shù)矩陣A是病態(tài)矩陣。
如果我們遇到不是方陣的矩陣,或者不能求逆的方陣,要想求解AX=b,避免奇異值導致MATLAB產(chǎn)生錯誤的情況,我們可以采用“偽逆”來幫助我們解決這個問題。
廣義逆矩陣:
對任意一個矩陣A,提出四個條件:
如果存在矩陣G滿足上述的一部分或全部條件,G就可以稱為A的廣義逆矩陣。最常用的四種廣義逆矩陣定義如下:
MATLAB中自帶的pinv方法,就可以求矩陣的M-P廣義逆,即A+矩陣。官方文檔:
https://ww2.mathworks.cn/help/matlab/ref/pinv.html?searchHighlight=pinv&s_tid=doc_srchtitle
大家可以查閱官方文檔看具體應(yīng)用實例。
如果我們求出A+,就可以有另一種思路來解AX=b了:
這里,通解的表達式還是類似于X=X*+X0的形式,A+b相當于是特解,后面那一項就是帶系數(shù)的自由解,y可以取任意數(shù),注意維度匹配即可。
所以,大家調(diào)用pinv求出M-P廣義逆,然后用x=A+b + (I-A+A)y這個式子構(gòu)造出通解就可以啦!
————————————————
版權(quán)聲明:本文為CSDN博主「奔跑的Yancy」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lyxleft/article/details/83998246
總結(jié)
以上是生活随笔為你收集整理的Moore-Penrose广义逆:可解决MATLAB报错“矩阵接近奇异值,或者缩放错误。结果可能不准确”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB中:左右除法、逆inv、广义
- 下一篇: 方程AX=b的解的讨论(特解、通解、零空