有没有人试图在MATLAB中绘制大值的正弦函数?正弦函数中的Matlab错误?
对于例如为:
x = 0:1000:100000;
plot(x,sin(2*pi*x))
我只是想知道为什么幅度正在改变这个周期函数?根据我的预期,任何值为x
,函数的周期为2*pi
。为什么不是?
有谁知道吗?有没有办法让它正确?此外,这是一个错误,它是已知的?
有没有人试图在MATLAB中绘制大值的正弦函数?正弦函数中的Matlab错误?
对于例如为:
x = 0:1000:100000;
plot(x,sin(2*pi*x))
我只是想知道为什么幅度正在改变这个周期函数?根据我的预期,任何值为x
,函数的周期为2*pi
。为什么不是?
有谁知道吗?有没有办法让它正确?此外,这是一个错误,它是已知的?
这实际上是而不是的幅度变化。这是由于浮点算术的数值不精确。请记住,您正在以1000步为单位指定一个从0到100000的整数序列。如果您从三角函数中调用sin(n*x*pi) = 0
,那么当x
和n
是整数时,理论上您应该获得全零的输出。在你的情况,n = 2
,并x
是从0到100000数是1000
然而多,这是我所得到的,当我在您的文章使用上面的代码:
查看该图的比例。这是10^{-11}
。你知道那是多小吗?作为进一步的证据,这里就是最大值和最小值是序列:
>> min(sin(2*pi*x))
ans =
-7.8397e-11
>> max(sin(2*pi*x))
ans =
2.9190e-11
的值是如此之小,他们很可能会成为零。您在图表中显示的内容是由于数字不精确。正如我前面提到的,sin(n*x*pi) = 0
当n
和x
是整数,假设我们有的所有小数位的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/
因为什么是pi
的确切值? 这个明显的错误是由于浮点精度的限制。如果你真的需要/想避开,你可以做符号计算与MATLAB,看之间的区别:
>> sin(2*pi*10)
ans =
-2.4493e-15
和
>> sin(sym(2*pi*10))
ans =
0
加1提出了这个符号数学工具箱。我把这个放在我的答案中,但是你展示了一个工作的例子。 – rayryeng 2015-01-27 00:13:26
谢谢。像你一样,我怀疑这是OP真正想要的。我认为引入符号数学工具箱是一件好事,而不仅仅是认为“matlab甚至不能告诉我sin(2 * pi)等于0”。 – 2015-01-27 08:38:46
非常感谢你们。这正是我正在寻找的。我试图用其他因素来衡量正弦函数,但遇到了这个问题。 @ yoh.lej解决方案让我重返正轨。非常感谢Rayryeng非常详细地解释了不精确性。加1给你们两个。 PS:为什么-4在我的问题上,这是否太愚蠢的问题? :) – user3662179 2015-01-27 22:24:22