2017-09-02 4 views
0

私は曲線があるとし、np.gradientを使って有限差分を使って勾配を推定します。初期点x [0]と勾配ベクトルが与えられたら、元の曲線をどのように再構築できますか?数学的には、この方程式系を考えれば可能ですが、私はそれをプログラム的に行う方法は不明です。勾配から曲線を再構築する

ここに私のsin(x)があり、cos(x)と一致する数値の差を計算する簡単な例があります。

test = np.vectorize(np.sin)(x) 
numerical_grad = np.gradient(test, 30./100) 
analytical_grad = np.vectorize(np.cos)(x) 

## Plot data. 
ax.plot(test, label='data', marker='o') 
ax.plot(numerical_grad, label='gradient') 
ax.plot(analytical_grad, label='proof', alpha=0.5) 
ax.legend(); 

Sine and its gradient.

+0

カーブに特定の機能フォームが必要な場合を除き、3次スプライン(およびその他の滑らかなカーブ補間方法)を調べます。 – barrycarter

答えて

0

正確な値を復元することができますゾイダルルール統合)。入力配列testを再現するために、私は疑問に提示したコードにフォローアップ

、我々は実行します。

x = np.linspace(1, 30, 100) 
integral = list() 
for t in range(len(x)): 
    integral.append(test[0] + np.trapz(numerical_grad[:t+1], x[:t+1])) 

整数配列は、数値積分の結果が含まれています。

+0

これは非常に効率が悪いです。なぜなら、 'trapz'は呼び出しごとにゼロからの累積をやり直すためですが、増分計算は可能です。 –

+0

そしてそのような滑らかな機能のために、シンプソンのルールはより良い精度を与えるべきです。 –

0

あなたは統合を使用して初期曲線を復元することができます。人生の一例として、

:あなたは1Dは移動するための位置のための機能を持っている場合は、誘導体(勾配)

v(t) = s(t)' = ds/dt 

と速度を持つものとして、速度のための機能を得ることができ、あなたが潜在的に(すべてではない関数がある位置を取得することができます積分解析的に - この場合には数値積分)は、いくつかの未知の定数(シフトして)使用追加され - そして初期位置で私はnumpyののtrapz機能(trapeを使用することによって、それを行う方法を見つけ

s(T) = Integral[from 0 to T](v(t)dt) + s(0) 
関連する問題