我在计算时遇到问题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