正弦函数中的Matlab Bug?

时间:2015-01-26 21:47:37

标签: matlab sin

有没有人尝试在MATLAB中为大值绘制正弦函数?

例如:

x = 0:1000:100000; 
plot(x,sin(2*pi*x))

我只是想知道为什么这个周期函数的振幅会发生变化?根据我的预期,对于x的任何值,函数的周期为2*pi。为什么不呢?

有谁知道吗?有没有办法让它正确?此外,这是一个错误,它是否已知?

2 个答案:

答案 0 :(得分:6)

实际上幅度变化。这是由于浮点运算的数值不精确。请记住,您指定的是0到100000之间的整数序列,步长为1000.如果从三角函数中回忆,sin(n*x*pi) = 0xn是整数时,理论上你应该这样做获得全零的输出。在您的情况下,n = 2x是0到100000之间的数字,是1000的倍数。

然而,这是我在你的帖子中使用上述代码时得到的结果:

enter image description here

看一下该图的比例。它是10^{-11}。你知道这有多小吗?作为进一步的证据,这是该序列的最大值和最小值:

>> min(sin(2*pi*x))

ans =

  -7.8397e-11

>> max(sin(2*pi*x))

ans =

   2.9190e-11

这些值太小,以至于它们也可能为零。您在图表中可视化的原因是数值不精确。正如我之前提到的,当sin(n*x*pi) = 0n为整数时,x假设我们有{strong> pi的所有小数位可用。但是,因为我们总共只有64位来用数字表示pi,所以你肯定不会得到完全零的结果。此外,请注意sin函数很可能使用数值逼近算法(例如Taylor / MacLaurin series),因此这也可能导致结果可能不完全为0。

当然,有一些解决方法,例如使用符号数学工具箱(参见@yoh.lej's answer)。在这种情况下,你会得到零,但我不会专注于此。您的帖子质疑MATLAB中sin函数的准确性,它适用于数字类型输入。理论上,您输入sin,因为它是一个整数序列,x的每个值都应该sin(n*x*pi) = 0

顺便说一句,这篇文章很好读。这是每个程序员需要了解的浮点运算和函数:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html。可以在此处找到更简单的概述:http://floating-point-gui.de/

答案 1 :(得分:2)

因为pi的确切值是多少? 这种明显的误差是由于浮点精度的限制。如果你真的需要/想要解决这个问题,你可以用matlab进行符号计算,看看之间的区别:

>> sin(2*pi*10)

ans =

-2.4493e-15

>> sin(sym(2*pi*10))

ans =

0