gpt4 book ai didi

python - `numpy.diff` 和 `scipy.fftpack.diff` 在微分时给出不同的结果

转载 作者:太空宇宙 更新时间:2023-11-03 14:07:30 27 4
gpt4 key购买 nike

我正在尝试计算一些数据的导数,并且正在尝试比较有限差分的输出和谱方法的输出。但结果却大不相同,我也想不通到底是为什么。

考虑下面的示例代码

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()

这会输出以下结果 enter image description here

橙色输出是 fftpack 输出。不要在意细节,这只是为了举例。

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

我很确定可以使用 fftpack.diff 的 period 关键字校正不同的振幅,但我无法确定哪个是正确的周期(我认为应该是 period=1 但这是行不通的)。

此外,我怎样才能使用 numpy 进行自己的光谱区分?

最佳答案

函数scipy.fftpack.diff计算导数,但它假定输入是周期性的。 period 参数给出了输入序列的周期(即 x 区间的总长度)。

在您的例子中,这是 len(x)*dx,其中 dx = x[1] - x[0]

下面是一些绘制简单(居中)有限差分(蓝色)和使用 period 参数(红色)的 diff 结果的代码。变量 xy 与您的代码中使用的相同:

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>

plot

请注意,如果您的输入实际上不是周期性的,则 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>

plot2

关于python - `numpy.diff` 和 `scipy.fftpack.diff` 在微分时给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42197460/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com