2015-01-26 149 views
-4

有没有人试图在MATLAB中绘制大值的正弦函数?正弦函数中的Matlab错误?

对于例如为:

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

我只是想知道为什么幅度正在改变这个周期函数?根据我的预期,任何值为x,函数的周期为2*pi。为什么不是?

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

回答

6

这实际上是而不是的幅度变化。这是由于浮点算术的数值不精确。请记住,您正在以1000步为单位指定一个从0到100000的整数序列。如果您从三角函数中调用sin(n*x*pi) = 0,那么当xn是整数时,理论上您应该获得全零的输出。在你的情况,n = 2,并x是从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) = 0nx是整数,假设我们有的所有小数位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://http://floating-point-gui.de/

1

因为什么是pi的确切值? 这个明显的错误是由于浮点精度的限制。如果你真的需要/想避开,你可以做符号计算与MATLAB,看之间的区别:

>> sin(2*pi*10) 

ans = 

-2.4493e-15 

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

ans = 

0 
+0

加1提出了这个符号数学工具箱。我把这个放在我的答案中,但是你展示了一个工作的例子。 – rayryeng 2015-01-27 00:13:26

+0

谢谢。像你一样,我怀疑这是OP真正想要的。我认为引入符号数学工具箱是一件好事,而不仅仅是认为“matlab甚至不能告诉我sin(2 * pi)等于0”。 – 2015-01-27 08:38:46

+0

非常感谢你们。这正是我正在寻找的。我试图用其他因素来衡量正弦函数,但遇到了这个问题。 @ yoh.lej解决方案让我重返正轨。非常感谢Rayryeng非常详细地解释了不精确性。加1给你们两个。 PS:为什么-4在我的问题上,这是否太愚蠢的问题? :) – user3662179 2015-01-27 22:24:22