2017-09-02 3 views
0

Supposons que j'ai une courbe, puis j'évalue son gradient par différences finies en utilisant np.gradient. Étant donné un point initial x [0] et le vecteur gradient, comment puis-je reconstruire la courbe d'origine? Mathématiquement, je vois que c'est possible compte tenu de ce système d'équations, mais je ne suis pas certain de savoir comment le faire par programmation.Reconstruire la courbe à partir du gradient

Voici un exemple simple de mon problème, où j'ai sin (x) et je calcule la différence numérique, qui correspond à 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

Examinez les splines cubiques (et d'autres méthodes d'interpolation de courbes lisses) à moins que vous souhaitiez que votre courbe ait une forme fonctionnelle spécifique. – barrycarter

Répondre

0

J'ai trouvé comment le faire, en utilisant la fonction trapz de numpy (la trape intégration de la règle zoïdale).

Faisant suite au code que je présentais sur la question, pour reproduire le tableau d'entrée test, nous:

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])) 

Le tableau intégral contient alors les résultats de l'intégration numérique.

+0

Ceci est assez inefficace parce que 'trapz' va refaire les accumulations à partir de zéro à chaque invocation, alors que le calcul incrémental est possible. –

+0

Et pour une telle fonction lisse, la règle de Simpson devrait donner une meilleure précision. –

0

Vous pouvez restaurer la courbe initiale à l'aide de l'intégration.

Comme exemple de la vie: Si vous avez la fonction de la position de 1D en mouvement, vous pouvez obtenir la fonction pour la vitesse comme dérivé (gradient)

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

et ayant la vitesse, vous pouvez potentiellement obtenir la position (toutes les fonctions sont intégrable analytiquement - dans ce cas, l'intégration numérique est utilisée) avec une constante inconnue (décalage) a ajouté - et avec la position initiale, vous pouvez restaurer la valeur exacte

s(T) = Integral[from 0 to T](v(t)dt) + s(0)