小弟是新手 想運用矩陣相加的方式來計算
但不知道為什麼矩陣相加後應該為零 但卻出現很小很小的數字
首先 我用了迴圈的方式 以下是我的寫法
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