2013-08-28 8 views
10

numpy.gradient関数が返す配列は、データポイントのデータポイント数/スペーシング数によって異なります。これは予想される動作ですか?たとえば:numpy勾配関数と数値派生語

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

乾杯np.gradient

答えて

18

あなたはサンプル距離を教えてください。同じ結果を得るには次のように入力する必要があります

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のために働く理由です。

距離が足りない場合は、手動で計算する必要があります。あなたはこのような何かを行うことができないnp.gradientとして中心差分を計算することに興味があるなら

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

を::

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ありがとうあなたが前進差分を使用する場合は、行うことができます。マニュアルでは「サンプル距離」はわかりにくい用語であることがわかりました。 1つの最後の質問 - サンプル距離が均等でない場合はどうですか?マニュアルには何もありません。 – user1654183

+0

距離が足りない場合は、手動で計算する必要があります。 – pabaldonedo

+2

@ user1654183私はサンプル距離が均一でない場合の可能な解決策を含めるために私の答えを編集しました。 – pabaldonedo

関連する問題