有没有人尝试在MATLAB中为大值绘制正弦函数?
例如:
x = 0:1000:100000;
plot(x,sin(2*pi*x))
我只是想知道为什么这个周期函数的振幅会发生变化?根据我的预期,对于x
的任何值,函数的周期为2*pi
。为什么不呢?
有谁知道吗?有没有办法让它正确?此外,这是一个错误,它是否已知?
答案 0 :(得分:6)
实际上不幅度变化。这是由于浮点运算的数值不精确。请记住,您指定的是0到100000之间的整数序列,步长为1000.如果从三角函数中回忆,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
假设我们有{strong> pi
的所有小数位可用。但是,因为我们总共只有64位来用数字表示pi
,所以你肯定不会得到完全零的结果。此外,请注意sin
函数很可能使用数值逼近算法(例如Taylor / MacLaurin series),因此这也可能导致结果可能不完全为0。
当然,有一些解决方法,例如使用符号数学工具箱(参见@yoh.lej's answer)。在这种情况下,你会得到零,但我不会专注于此。您的帖子质疑MATLAB中sin
函数的准确性,它适用于数字类型输入。理论上,您输入sin
,因为它是一个整数序列,x
的每个值都应该sin(n*x*pi) = 0
。
答案 1 :(得分:2)
因为pi
的确切值是多少?
这种明显的误差是由于浮点精度的限制。如果你真的需要/想要解决这个问题,你可以用matlab进行符号计算,看看之间的区别:
>> sin(2*pi*10)
ans =
-2.4493e-15
和
>> sin(sym(2*pi*10))
ans =
0