2016-07-22 40 views
18

我在計算時遇到問題matlab。 我知道「pi」是一個浮點數,並不準確。所以,在matlab sin(pi)不完全是零。 我的問題是,如果「pi」不那麼精確,爲什麼sin(pi/2)正好等於1爲什麼在matlab中sin(pi)不準確但是sin(pi/2)是精確的?

sin(pi) - >是不準確的東陽pi。 但是 sin(pi/2)正好等於1

我很好奇和困惑!

+0

它不完全是1,但錯誤實際上太小而無法表示。 –

+0

但是matlab完全顯示爲1. –

+2

嘗試'sin(sym('pi'))'並且看到http://www2.math.umd.edu/~jmr/241/introsession.html – Malick

回答

6

我不知道確切的方式,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=pix=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 
+1

使用'pi'和'pi/2'包含調用標準輸出會很好。是否記錄了在MATLAB內部使用哪種算法的算法? –

+1

完成。我不知道Matlab在內部使用哪種算法。它有可能根據請求的值和平臺等使用不同算法的組合(請參見[這個答案在C++中的類似問題](http://stackoverflow.com/questions/2284860/how-does -C-計算-SIN-和其他-數學函數) – matlabgui

2

的原因是,sin(pi)=0.0,所以每一個細小的錯誤,無論是多麼小的龐大相比0,因此是可見的。

與此不同的是,對於sin(pi/2)=1:如果算法產生的誤差小於eps(約爲2.220446e-16),則不會看到此錯誤,因爲1+eps=1

該錯誤部分是由於不精確的輸入(pi值不準確),部分是計算過程中的舍入結果。一個人必須深入研究代碼才能做到正確。

另一個重要因素是函數本身。通過查看泰勒級數爲pipi/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) 

很清楚:如果dxeps,比錯誤,原因是不精確的投入將是約eps*eps,因此不與1相比可見。

相關問題