感嘆。計算行列式以確定奇點是一件荒謬的事情,完全如此。對於大型矩陣尤其如此。對不起,但是。爲什麼?是的,有些書告訴你這樣做。甚至可能是你的導師。
分析奇點是一回事。但是如何確定奇點的數值呢?除非您使用符號工具,否則MATLAB使用浮點運算。這意味着它將數字存儲爲浮點數,雙精度值。這些數字不能超過在幅度較小
>> realmin
ans =
2.2251e-308
(實際上,MATLAB比這低一點,在非規範化的數值,它可以深入到大約1E-323的條款。)看到,當我嘗試存儲比它小的數字,MATLAB認爲它是零。
>> A = 1e-323
A =
9.8813e-324
>> A = 1e-324
A =
0
大矩陣會發生什麼?例如,這是矩陣單數:
M = eye(1000);
由於M是一個單位矩陣,它是相當明顯的非奇異的。事實上,det確實表明它是非單一的。
>> det(M)
ans =
1
但是,它乘以一些常數。這是否使它非單一?沒有!!!!!!!!!!!!!!!!!!!!!!!!當然不是。但無論如何都要嘗試。
>> det(M*0.1)
ans =
0
嗯。那很奇怪。 MATLAB告訴我這個行列式是零。但我們知道行列式是1e-1000。哦,是的。天哪,1e-1000更小,比我剛纔告訴你的MATLAB可以存儲的最小數量要多一倍。因此,行列式下溢,儘管顯然非零。矩陣是單數嗎?當然不是。但是det的使用在這裏失敗了嗎?當然,這是完全可以預料的。
相反,使用一個很好的工具來確定奇點。使用像cond或rank這樣的工具。例如,我們可以欺騙排名嗎?
>> rank(M)
ans =
1000
>> rank(M*.1)
ans =
1000
見秩知道這是一個滿秩矩陣,不管我們是否擴大與否。 cond也是如此,計算M的條件數。
>> cond(M)
ans =
1
>> cond(M*.1)
ans =
1
歡迎來到浮點運算的世界。噢,順便說一下,忘記使用浮點運算幾乎所有計算的工具。這幾乎總是一個糟糕的選擇。
有一個爲僞逆的PINV功能 – Amro