我在計算時遇到問題matlab
。 我知道「pi
」是一個浮點數,並不準確。所以,在matlab sin(pi)
不完全是零。 我的問題是,如果「pi
」不那麼精確,爲什麼sin(pi/2)
正好等於1爲什麼在matlab中sin(pi)不準確但是sin(pi/2)是精確的?
sin(pi)
- >是不準確的東陽pi
。 但是 sin(pi/2)
正好等於1
我很好奇和困惑!
我在計算時遇到問題matlab
。 我知道「pi
」是一個浮點數,並不準確。所以,在matlab sin(pi)
不完全是零。 我的問題是,如果「pi
」不那麼精確,爲什麼sin(pi/2)
正好等於1爲什麼在matlab中sin(pi)不準確但是sin(pi/2)是精確的?
sin(pi)
- >是不準確的東陽pi
。 但是 sin(pi/2)
正好等於1
我很好奇和困惑!
我不知道確切的方式,Matlab的計算sin(x)
- 但你可以通過使用功率序列計算其調查這一點,即
sin x = x - (x^3)/3! + (x^5)/5! - (x^7)/7! + (x^9)/9! ...
談到這爲一些Matlab代碼,我們通過代表它:
clc
x = pi; % or x = pi/2
res = x;
factor = -1;
for ii=3:2:19
res = res + factor*power(x,ii)/factorial(ii);
factor = factor*-1;
fprintf ('iteration %2i sin(x)=%1.16f\n', (ii-1)/2, res);
end
res
對x=pi
和x=pi/2
運行此代碼,您可以看到x=pi/2
以相當快的速度收斂於正確的結果(在eps錯誤中)(9次迭代) - x=pi
案件不會在同一時間框架內收斂。
它有用的注意到,在9次迭代中,最後一個因子是在階乘(19)中計算的。在該序列中計算的下一個因子是21.這是由於雙精度而可以用100%精度表示的最後一個因子(參見help factorial
)。
所以我認爲最近發生的事情是對於pi/2,數學解決方案收斂於1到雙倍精度,在pi情況下更快。事實上,由於數學的侷限性和可以以雙精度結果存儲的精度,pi情況完全不能完全收斂。
說完sin(pi)
在eps
之內,所以你應該使用這個事實來達到你的目的。
我已經複製的結果我得到以下(R2015b):
Results for PI/2
iteration 1 sin(x)=0.9248322292886504
iteration 2 sin(x)=1.0045248555348174
iteration 3 sin(x)=0.9998431013994987
iteration 4 sin(x)=1.0000035425842861
iteration 5 sin(x)=0.9999999437410510
iteration 6 sin(x)=1.0000000006627803
iteration 7 sin(x)=0.9999999999939768
iteration 8 sin(x)=1.0000000000000437
iteration 9 sin(x)=1.0000000000000000
Final Result: 1.0000000000000000
Results for PI
iteration 1 sin(x)=-2.0261201264601763
iteration 2 sin(x)=0.5240439134171688
iteration 3 sin(x)=-0.0752206159036231
iteration 4 sin(x)=0.0069252707075051
iteration 5 sin(x)=-0.0004451602382092
iteration 6 sin(x)=0.0000211425675584
iteration 7 sin(x)=-0.0000007727858894
iteration 8 sin(x)=0.0000000224195107
iteration 9 sin(x)=-0.0000000005289183
Final Result: -0.0000000005289183
使用'pi'和'pi/2'包含調用標準輸出會很好。是否記錄了在MATLAB內部使用哪種算法的算法? –
完成。我不知道Matlab在內部使用哪種算法。它有可能根據請求的值和平臺等使用不同算法的組合(請參見[這個答案在C++中的類似問題](http://stackoverflow.com/questions/2284860/how-does -C-計算-SIN-和其他-數學函數) – matlabgui
的原因是,sin(pi)=0.0
,所以每一個細小的錯誤,無論是多麼小的龐大相比0
,因此是可見的。
與此不同的是,對於sin(pi/2)=1
:如果算法產生的誤差小於eps
(約爲2.220446e-16
),則不會看到此錯誤,因爲1+eps=1
。
該錯誤部分是由於不精確的輸入(pi
值不準確),部分是計算過程中的舍入結果。一個人必須深入研究代碼才能做到正確。
另一個重要因素是函數本身。通過查看泰勒級數爲pi
和pi/2
考慮到誤差傳播,我們可以看到:
sin(pi+dx)=sin(pi)+cos(pi)dx+o(dx^2)=-dx+o(dx^2)
sin(pi/2+dx)=sin(pi/2)+cos(pi/2)dx+o(dx^2)=1+o(dx^2)
很清楚:如果dx
約eps
,比錯誤,原因是不精確的投入將是約eps*eps
,因此不與1
相比可見。
它不完全是1,但錯誤實際上太小而無法表示。 –
但是matlab完全顯示爲1. –
嘗試'sin(sym('pi'))'並且看到http://www2.math.umd.edu/~jmr/241/introsession.html – Malick