在一本关于matplotlib的书中,我发现了一个1/sin(x)的情节,它看起来与我制作的这个类似:

我使用了域
input = np.mgrid[0 : 1000 : 200j]最让我困惑的是,正弦函数只是周期性的。我不明白为什么最大绝对值在下降。在wolfram-alpha中绘制相同的函数不会显示出这种下降的效果。使用不同的步骤数量
input = np.mgrid[0 : 1000 : 300j]提供了一个不同的结果:

最大绝对值也有下降的趋势。
所以我的问题是:
我怎样才能使这样的情节一致,即独立于step-size/step-amount?
发布于 2021-12-27 18:43:49
正弦函数的周期比所绘制的要高,所以你看到的是从采样频率的差异和一些真实频率的倍数中对进行混叠。由于其中一个根位于0,前几个样本与本身的倍数之间存在的最小误差线性地远离0,从而产生了一个1/x包络。
在本例中,input[5]为5(1000/(200-1))=8π−0.007113,因此函数大约为−141,如图所示。input[10]当然是16π−0.014226,所以函数大约是−70,等等,只要差异比π小得多。
某些准周期样本序列有可能最终接近n个π,从而产生一个更复杂的模式,如第二个图中的模式。
发布于 2021-12-27 17:51:39
为什么人们会看到这种下降的趋势,即使函数是纯周期性的?
请记住,实际上,在pi的每一个倍数上,函数都是无穷大的。而显示的跳转大小实际上只反映了函数仍然有意义的抽样值的最大值。因此,如果您碰巧采样了一个值,如果函数很大,但不是太大,那么就会得到很大的跳转。
为了能够绘制任何内容,matplotlib丢弃了一些没有意义的值。就像np.nan一样,pi和±np.infs的倍数与此非常接近。我相信发生的事情是,离零一步之远,你碰巧得到一个足够小的值,不会被丢弃,但仍然很大。当您到达pi和它的倍数时,最大的值会被丢弃。
我怎样才能使这样的情节一致,即独立于步骤大小/步骤数量?
在函数变得不合理的大值时,会出现奇怪的行为。只需选择一个ylimit,以避免绘制那些疯狂的大值。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.transforms import Bbox
x = np.linspace(10**-10,50, 10**4)
plt.plot(x,1/np.sin(x))
plt.ylim((-15,15))

https://stackoverflow.com/questions/70496858
复制相似问题