正弦函数中的Matlab Bug?

use*_*179 -3 matlab trigonometry

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

例如:

x = 0:1000:100000; 
plot(x,sin(2*pi*x))
Run Code Online (Sandbox Code Playgroud)

我只是想知道为什么这个周期函数的振幅在变化?根据我的预期,对于任何值x,函数都有一段时间2*pi.为什么不呢?

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

ray*_*ica 6

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

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

在此输入图像描述

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

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

ans =

  -7.8397e-11

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

ans =

   2.9190e-11
Run Code Online (Sandbox Code Playgroud)

这些值非常小,也可能为零.您在图表中可视化的原因是数值不精确.正如我前面提到的,sin(n*x*pi) = 0nx是是整数,则假设下,我们有所有的小数位pi使用.但是,因为我们总共只有64位来表示pi数字,所以你肯定不会得到完全为零的结果.此外,请注意,该sin函数很可能使用数值逼近算法(例如Taylor/MacLaurin系列),因此这也可能导致结果可能不完全为0.

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

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