對矩陣求逆或者求解線性方程組時,若出現「矩陣接近奇異值,或者縮放錯誤。結果可能不準確。Matrix is close to singular or badly scaled. Results may be inaccurate.」報錯信息,可能是選取的求逆函數不合適導致的,可使用求解最小範數最小二乘解的方法進行解決。
Matlab中一般有四種求解線性方程組的方法,下面依次進行簡單介紹,具體函數使用方法可查詢MATLAB官方文檔。
假設有線性方程組
Ax=b
其中A為係數矩陣,x為待求解未知量列向量。
MATLAB中有4種方法常用來進行求解:
1. 直接求逆
使用函數x=inv(A)*b,此方法等價於x=A^(-1)*b,但這種方法是通過構造顯式逆矩陣,如果A接近奇異或奇異,會返回不準確的結果。並且實際很少需要知道矩陣求逆結果,一般求解線性方程組時很少使用此種方法。
2. 使用反斜槓求解
即x=A\b,這種方法使用的是高斯消元法,不需構造矩陣求解,就求解速度和精度而言,這種方法比方法1要好。
3. 求偽逆
使用函數x=pinv(A)*b。即Moore-Penrose偽逆矩陣,相關概念可見官方文檔。此方法主要用於求解沒有唯一解的線性方程組,適用於A接近或者就是奇異矩陣的情況,若A非奇異求解成本要高於使用inv(),可使用rcond()函數求解條件數,判斷A是否奇異。
4. 求最小範數最小二乘解
使用函數x=lsqminnorm(A,b)。此方法在矩陣接近奇異或者奇異時,相比pinv()這種方法更加有效,因此最小範數最小二乘解不僅會使||Ax-b||最小,還會使||x最小。
因此,若產生「矩陣接近奇異值,或者縮放錯誤。結果可能不準確。」報錯信息,可使用方法3和方法4來解決,其中方法4會更加有效。