看板 MATLAB 關於我們 聯絡資訊
小弟是新手 想運用矩陣相加的方式來計算 但不知道為什麼矩陣相加後應該為零 但卻出現很小很小的數字 首先 我用了迴圈的方式 以下是我的寫法 Q1=[6.65 5.05 4.5; 5.05 6.65 0; 4.5 0 5.15]; Q2=[6.65 5.05 -4.5; 5.05 6.65 0; -4.5 0 5.15]; Q=[Q1;Q2;Q2;Q1]; h=[-0.3 -0.15 0 0.15 0.3]; B=zeros(3,3); for i=1:4; B=1/2.*Q(1+3*(i-1):3+3*(i-1),1:3).*((h(i+1)).^2.-(h(i)).^2.)+B; end 照理來說 B矩陣應該會為零 可是出現了很小的數字 所以我就把迴圈拆開 一個一個相加如下 F=Q(1+(3*(1-1)):3+(3*(1-1)),:)*((h(1+1)).^2.-(h(1)).^2.); G=Q(1+(3*(2-1)):3+(3*(2-1)),:)*((h(2+1)).^2.-(h(2)).^2.); H=Q(1+(3*(3-1)):3+(3*(3-1)),:)*((h(3+1)).^2.-(h(3)).^2.); I=Q(1+(3*(4-1)):3+(3*(4-1)),:)*((h(4+1)).^2.-(h(4)).^2.); P=F+G+H+I SS=F+H+G+I 但卻發現SS為零矩陣 但P不是 P = 1.0e-16 * 0.555111512312578 0 0 0 0.555111512312578 0 0 0 0 非常詭異的問題 請問一下這要如何解決 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 165.91.12.56 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1424288984.A.821.html
JamesChen: 看不懂 你要不要把數學的算式寫出來 02/19 07:10
JamesChen: 你說的第一種狀況純粹交換順序不可能會那樣 02/19 07:10
JamesChen: 應該是你迴圈出的問題 盡量避免使用迴圈 02/19 07:10
※ 編輯: abudurahim (165.91.12.56), 02/19/2015 07:21:59
abudurahim: 抱歉,我多打了一些細節,謝謝你 02/19 07:22
sunev: 電腦只能處理有限位的小數 02/19 08:56
JamesChen: 我意思是手寫的計算是什麼,因為你這樣寫有點難看懂。 02/20 03:25
JamesChen: 我猜是中間有一個互消正負所以為零,另一個相加非常小 02/20 03:25
JamesChen: ,被當作0,然後又加上一個正的小數。 02/20 03:25
xniux: 我剛剛測試了一下,-0.0675*6.65會多出一點點 02/22 12:53
xniux: 造成F有些地方並不是真的理論值 02/22 12:54
xniux: 以下是我的猜測: F+H的有效位數比較多(5位數),需要的空間 02/22 12:58
xniux: 也比較多,所以剛好把那個微小的錯誤省略掉了,而F+G則少一 02/22 12:59
xniux: 位數,所以一直保留到最後 02/22 12:59
xniux: 而為什麼-0.0675*6.65會多,就要請別的大師解釋了orz 02/22 13:00