函數scipy.fftpack.diff
計算導數,但它假設輸入是週期性的。 period
參數給出了輸入序列的週期(即x
間隔的總長度)。
在你的情況,這是len(x)*dx
,其中dx = x[1] - x[0]
。
下面是一些使用period
參數(紅色)繪製簡單(居中)有限差分(藍色)和diff
的結果的代碼。變量x
和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>
我天真地以爲'period'指的是一次測量和另一次測量之間的時間間隔(因此,在我的情況下爲'1')。但是,顯然這很有意義。現在我明白了,我也可以用numpy來重現它,用'i * 2 * pi'乘以fft。 – TomCho