2016-07-22 582 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相比可见。

相关问题