功能scipy.fftpack.diff https://docs.scipy.org/doc/scipy/reference/generated/scipy.fftpack.diff.html计算导数,但假设输入是周期性的。这period
参数给出了周期(即总长度)x
输入序列的间隔)。
在你的情况下,这是len(x)*dx
where dx = x[1] - x[0]
.
这是一些绘制简单(中心)有限差分(蓝色)和结果的代码diff
使用period
论证(红色)。变量x
and y
与您的代码中使用的相同:
In [115]: plt.plot(0.5*(x[1:]+x[:-1]), np.diff(y)/np.diff(x), 'b')
Out[115]: [<matplotlib.lines.Line2D at 0x1188d01d0>]
In [116]: plt.plot(x, sp.diff(y, period=len(x)*(x[1]-x[0])), 'r')
Out[116]: [<matplotlib.lines.Line2D at 0x1188fc9d0>]
In [117]: plt.xlabel('x')
Out[117]: <matplotlib.text.Text at 0x1157425d0>
请注意,如果您的输入实际上不是周期性的,则由下式计算的导数diff
在间隔结束时将不准确。
这是另一个示例,使用较短的序列,其中仅包含区间 [0, 1] 中的正弦函数的一个完整周期:
In [149]: x = np.linspace(0, 1, 20, endpoint=False)
In [150]: y = np.sin(2*np.pi*x)
In [151]: plt.plot(0.5*(x[1:]+x[:-1]), np.diff(y)/np.diff(x), 'b')
Out[151]: [<matplotlib.lines.Line2D at 0x119872d90>]
In [152]: plt.plot(x, sp.diff(y, period=len(x)*(x[1]-x[0])), 'r')
Out[152]: [<matplotlib.lines.Line2D at 0x119c49090>]
In [153]: plt.xlabel('x')
Out[153]: <matplotlib.text.Text at 0x1197823d0>