Re: [問題] singular 問題

看板MATLAB作者 (法國號有氣質)時間16年前 (2009/09/24 12:30), 編輯推噓1(101)
留言2則, 1人參與, 最新討論串2/2 (看更多)
: Warning: Matrix is close to singular or badly scaled. : Results may be inaccurate. RCOND = 3.502134e-017. 我是做數值分析與計算流體力學的,嘗試回答你的問題。 我想你可能要先瞭解一下,不是每一個矩陣都有反矩陣的。 一般線性代數的書在談論到矩陣時,都會特別說明,若是一個矩陣沒有反矩陣, 它就被稱做singular matrix。 一般來說,只要是該矩陣的determinant等於或非常非常接近0,它就不存在或很 難用一般的方法求出反矩陣。 就實際應用面而言,一般會想求反矩陣,並不是真的對那個矩陣的反矩陣有興趣 ,通常都是為了解之後的問題,必須在過程中先求得反矩陣。 舉例來說,最常遇到的就是解聯立方程式。 [A]{X} = {B} 先講一般程式語言的作法。如果你是用C或是Fortran的話,就得先用數值方法求 得[A]的反矩陣,再用反推法求得{X}。光是要求得[A]的反矩陣,就有很多種數 值方法可以用,詳細的就不在這裡談了。 那,如果你是用MATLAB的內建函數,就不必這麼麻煩了。想解上式,可以直接打 X=B/A 或是 X=B\A,都可以得到答案。 如果我沒記錯的話,「右除」只能用在當A是方陣且不是singular時,但「左除」 可以用在A是任意矩陣時(不管是不是singular,不管是不是未知數的數目大於方 程式的數目或小於方程式的數目)。所以,即使A是singular matrix,你也不必 擔心,MATLAB會直接「黑箱作業」,幫你得到答案。 那MATLAB是怎麼「黑箱作業」的呢?這可能就要去翻數值分析的書,裡面都會談 到一個方法,叫做singular value decomposition,簡稱SVD。這是專門對付 singular matrix而發展出來的數值方法。同樣地,我無法在這裡細談,那個牽 扯到太多的數學技巧。 一般SVD,會將[A]分解成三個矩陣相乘,以便之後求解聯立方程式時使用。但不 幸的是,分解出來的這三個矩陣,都不是[A]的反矩陣,因為根據定義,[A]是 singular matrix,它本來就不會有反矩陣。 MATLAB也有一個指令是SVD(),()裡面直接打矩陣的名稱就可以將改矩陣做 singular value decomposition。回想前面提過的,當你使用「左除」這個指令 時,MATLAB本身就會去計算該矩陣是否為singular,如果是的話,它就會自動使 用SVD來求解。 很多數學統計和工程問題都會遇到singular matrix,數學統計上常用到的最小 平方法(least-square method)也會遇到。 回到你本身的問題,你會發現,你得到的矩陣前面,有乘上一個很大很大的值, 大的不像話,那就已經說明,得到的答案有99%是錯的...... 總結一下: 如果你有一個矩陣,是singular matrix,你單純想要求他的反矩陣,MATLAB解 出來的有很大的機率是錯誤的。即使你用別的程式語言加上數值分析的方法, 也只能求得很近似的值而已。因為在數學理論上,它其實是不存在的。 但如果你在整個演算法中,無論如何都必須要先求得它的反矩陣,再加以應用 的話,那就必須要訴諸其他的數值分法,避免「正面」去求它的反矩陣,走別 條路,去得到最後的答案。 -- 年 輕 是 什 麼 ? 是 風 ,是 雲 彩 , 也 是 天 空 , 是 一 種 心 情, 閃 爍 在 生 命 的 每 一 個 轉 折 裡。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.187.195

09/24 13:07, , 1F
正解。
09/24 13:07, 1F

09/24 13:08, , 2F
而且寫的很清楚,有興趣的人建議可以去翻閱相關書籍。
09/24 13:08, 2F
文章代碼(AID): #1AklNmHp (MATLAB)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1AklNmHp (MATLAB)