numpy梯度函数和数值导数

use*_*183 11 python gradient numpy numerical-methods

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')
Run Code Online (Sandbox Code Playgroud)

返回 ATTACHED 情节.

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

干杯

pab*_*edo 20

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')
Run Code Online (Sandbox Code Playgroud)

默认的样本距离为1,这就是它适用于x1的原因.

如果距离不均匀,则必须手动计算.如果您使用前向差异,您可以:

d = np.diff(y(x))/np.diff(x) 
Run Code Online (Sandbox Code Playgroud)

如果你对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)
Run Code Online (Sandbox Code Playgroud)

  • @ user1654183我编辑了我的答案,在样本距离不均匀的情况下为案例提供了一个可能的解决方案. (2认同)