Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python `numpy.diff`和'scipy.fftpack.diff`在区分时给出不同的结果_Python_Numpy_Scipy_Derivative_Differentiation - Fatal编程技术网

Python `numpy.diff`和'scipy.fftpack.diff`在区分时给出不同的结果

Python `numpy.diff`和'scipy.fftpack.diff`在区分时给出不同的结果,python,numpy,scipy,derivative,differentiation,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.sho

我试图计算一些数据的导数,我试图比较有限差分法和光谱法的输出。但结果却大不相同,我不知道确切的原因

考虑下面的示例代码

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()
这将输出以下结果

橙色输出为
fftpack
输出。不管有多微妙,这只是为了举个例子

那么,为什么它们如此不同呢?它们不应该(大致)相同吗

我很确定可以用
fftpack.diff
的period关键字来校正不同的振幅,但我不知道哪个是正确的周期(我认为应该是
period=1
,但这不起作用)


此外,如何使用numpy获得自己的光谱微分?

1 rad对于差分近似来说是一个相当粗糙的步长,您应该在数据集中获得整数个周期

x = np.arange(-200,200,1)
y = np.sin(np.pi/50*x)

plt.plot(np.diff(y)/np.diff(x))
plt.plot(sp.diff(y,order=1, period=400))
匹配得很好-但我不知道fft例程中周期/规格化的确切有理数。该函数计算导数,但它假设输入是周期性的。
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>

我天真地认为,
period
指的是一个测量值和另一个测量值之间的时间(因此,在我的例子中,
1
)。但这显然很有道理。现在我明白了,我也可以用numpy重现它,用fft乘以
I*2*pi
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>