[運算] 求助 簡單的矩陣乘法結果怪怪的

作者: amy2005 (FamilyAlwaysFirst)   2017-07-20 01:27:39
各位高手晚安~
小妹我剛剛在做一個矩陣乘法時,發現乘出的結果好難理解...
過程是這樣的:
H = 1e-14 * ones(4) (一個4*4, 每個元素皆為1e-14的方陣)
R = 1e-100 * eye(4) (一個對角矩陣,對角元素皆為1e-100)
t = H * H * transpose(H) + R
t = inv(t)
最後t的結果長這樣:(一個4*4矩陣, 以下結果為求乾淨只顯示到小數點後第3位)
row1: 5.629e+56 , -6.938e+24 , -6.25e+40 , -5.629e+56
row2: -6.938e+24 , 5.070e+72 , -5.629e+56 , -5.070e+72
row3: -6.25e+40 , -5.629e+56 , 4.567e+88 , -4.567e+88
row4: -5.629e+56 , -5.070e+72 , -4.567e+88 , 4.567e+88
之後我計算 H*t,
結果居然是個元素全都是0的4*4矩陣...
全都是0耶...好奇怪...看起來就不對阿
然後我嘗試只算第一項,
也就是 H(1,1)*t(1,1) + H(1,2)*t(2,1) + H(1,3)*t(3,1) + H(1,4)*t(4,1)
正解應該是 (5.629e+56 -6.938e+24 -6.25e+40 -5.629e+56) * 1e-14 ,約為-6.25e+26
但matlab跑出結果 = 0
然後我還是不死心,改變加法順序,
變成 H(1,1)*t(1,1) + H(1,4)*t(4,1) + H(1,2)*t(2,1) + H(1,3)*t(3,1)
跑出結果 = 6.1294e+26
痾.......交換加法順序結果居然不一樣! 而且都是錯的!
後來再用java算 , 結果也是錯的....
請問各位matlab高手有碰過類似的狀況嗎~~
p.s. 這些算術都沒有overflow或underflow喔~
謝謝大家!
作者: sunev (Veritas)   2017-07-20 03:24:00
基本上取inverse 時就爆了
作者: amy2005 (FamilyAlwaysFirst)   2017-07-20 09:37:00
原來如此! 那請問為甚麼之後改變加法順序答案居然不一樣呢?我後來用java測試加法的部分居然和matlab結果一樣...感謝樓上高手回答!!!
作者: BrianCashman (最強⑨番-さるの)   2017-07-20 12:23:00
怎麼可能會沒有overflow? 容器僅能夠裝10^308指數
作者: sunev (Veritas)   2017-07-20 13:22:00
應該在t=H^3+R 就出問題了,有效數字沒這麼多
作者: amy2005 (FamilyAlwaysFirst)   2017-07-20 16:19:00
http://i.imgur.com/x7rXhs6.jpghttp://i.imgur.com/a0kOdXI.jpg不好意思~我覺得不會overflow or underflow耶...請參考圖片, 因最小值為 16*e-42 , 最大值為 16*e-42 +1e-100
作者: BrianCashman (最強⑨番-さるの)   2017-07-20 16:38:00
絕對overflow,4x4算det(R)時 1e-100就已經1e-400了
作者: amy2005 (FamilyAlwaysFirst)   2017-07-20 16:40:00
嗯嗯!所以是在算inv的時候~
作者: BrianCashman (最強⑨番-さるの)   2017-07-20 16:41:00
1e-100對角矩陣不見 你的矩陣行列式就直接變成0
作者: amy2005 (FamilyAlwaysFirst)   2017-07-20 17:29:00
喔喔!但算行列式時,應該只有算到 (1e-100)^4 和 (1e-100)^3 時才會overflow吧?其他項不會~然後overflow(歸0) +某數 = 某數 ? 所以行列式值不會為0? 謝謝!

Links booklink

Contact Us: admin [ a t ] ucptt.com