作者moussorgsky (法国号有气质)
看板MATLAB
标题Re: [问题] singular 问题
时间Thu Sep 24 12:30:37 2009
: 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
1F:推 takuya0608:正解。 09/24 13:07
2F:→ takuya0608:而且写的很清楚,有兴趣的人建议可以去翻阅相关书籍。 09/24 13:08