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

时间:2017-02-13 05:53:19

标签: python numpy scipy derivative differentiation

我正在尝试计算某些数据的导数,我试图比较有限差分和谱方法输出的输出。但结果却截然不同,我无法弄清楚原因。

考虑下面的示例代码

fftpack

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

橙色输出为fftpack.diff输出。没关系细微之处,这只是为了举个例子。

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

我很确定使用period=1的句点关键字可以纠正不同的幅度,但我无法确定哪个是正确的句号(我认为它应该是class purchase_ordr_line(models.Model): _inherit = "purchase.order.line" @api.multi def onchange_product_id(self, pricelist_id, product_id, qty, uom_id, partner_id, date_order=False, fiscal_position_id=False, date_planned=False, name=False, price_unit=False, state='draft'): dic_res = super(purchase_ordr_line, self).onchange_product_id(pricelist_id, product_id, qty, uom_id,partner_id, date_order=False, fiscal_position_id=False, date_planned=False, name=False, price_unit=False, state='draft') #Following the custom code: dic_value = dic_res['value'] dic_value['new_field_to_update'] = new_value return dic_res 但这不起作用。

此外,我如何使用numpy进行自己的光谱区分?

2 个答案:

答案 0 :(得分:5)

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

在您的情况下,这是len(x)*dx dx = x[1] - x[0]

这里有一些代码使用diff参数(红色)绘制简单(居中)有限差异(蓝色)和period的结果。变量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

答案 1 :(得分:0)

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例程中句点/标准化的确切理由