Tom*_*Cho 3 python numpy scipy derivative differentiation
我试图计算一些数据的导数,我试图比较有限差分和光谱方法输出的输出.但结果却截然不同,我无法弄明白为什么.
请考虑下面的示例代码
import numpy as np
from scipy import fftpack as sp
from matplotlib import pyplot as plt
x = np.arange(-100,100,1)
y = np.sin(x)
plt.plot(np.diff(y)/np.diff(x))
plt.plot(sp.diff(y))
plt.show()
Run Code Online (Sandbox Code Playgroud)
橙色输出是fftpack输出.没关系细微之处,这只是为了举个例子.
那么,为什么他们如此不同?他们不应该(大致)相同吗?
我很确定使用fftpack.diff句点关键字可以纠正不同的幅度,但我无法确定哪个是正确的句号(我认为它应该是period=1但不起作用).
此外,如何使用numpy进行自己的光谱差异化?
该函数scipy.fftpack.diff计算导数,但它假定输入是周期性的.该period参数给出的期间(即,的总长度x的输入序列中的间隔).
在你的情况下,这是len(x)*dx在哪里dx = x[1] - x[0].
下面是一些代码,用于绘制简单(居中)有限差分(蓝色)和diff使用period参数(红色)的结果.变量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>
Run Code Online (Sandbox Code Playgroud)
请注意,如果您的输入实际上不是周期性的,则计算的导数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>
Run Code Online (Sandbox Code Playgroud)