web-dev-qa-db-ja.com

numpy勾配関数と数値微分

配列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を使用して数値微分を計算するより良い方法はありますか?

乾杯

11
user1654183

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)
20
pabaldonedo