NumPy梯度函数和数值导数

12
< p > numpy.gradient 函数返回的数组取决于数据点数量/数据点间距。这是预期行为吗?例如:

y = lambda x: x

x1 = np.arange(0,10,1)
x2 = np.arange(0,10,0.1)
x3 = np.arange(0,10,0.01)

plt.plot(x1,np.gradient(y(x1)),'r--o')
plt.plot(x2,np.gradient(y(x2)),'b--o')
plt.plot(x3,np.gradient(y(x3)),'g--o')

返回ATTACHED图。

只有y(x1)的梯度才会返回正确的结果。这里发生了什么?是否有更好的方法使用numpy计算数值导数?

干杯

1个回答

23

np.gradient中,您需要告诉样本间距。要获得相同的结果,请键入:

plt.plot(x1,np.gradient(y(x1),1),'r--o')
plt.plot(x2,np.gradient(y(x2),0.1),'b--o')
plt.plot(x3,np.gradient(y(x3),0.01),'g--o')

默认的样本距离为1,这就是为什么它适用于x1。

如果距离不均匀,则必须手动计算。如果使用前向差分,可以执行以下操作:

d = np.diff(y(x))/np.diff(x) 

如果您有兴趣计算中心差分,就像np.gradient做的那样,您可以这样做:

x = np.array([1, 2, 4, 7, 11, 16], dtype=np.float)
y = lambda x: x**2

z1 = np.hstack((y(x[0]), y(x[:-1])))
z2 = np.hstack((y(x[1:]), y(x[-1])))

dx1 = np.hstack((0, np.diff(x)))
dx2 = np.hstack((np.diff(x), 0))

d = (z2-z1) / (dx2+dx1)

1
很棒,谢谢pabaldonedo。我在手册上看到了,但“样本距离”这个术语对我来说是陌生的。最后一个问题 - 如果采样距离不均匀怎么办?手册上没有提到。 - user1654183
2
@user1654183 我已经编辑了我的答案,包括当样本距离不均匀时的可能解决方案。 - pabaldonedo
非常详尽的回答,你完全解决了我的问题。谢谢你。 - user1654183

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接