Je ne peux vraiment pas comprendre ce que fait la fonction numpy.gradient
et comment l’utiliser pour calculer la fonction multivariable gradient.
Par exemple, j'ai une telle fonction:
def func(q, chi, delta):
return q * chi * delta
Je dois calculer le gradient tridimensionnel (en d'autres termes, je souhaite calculer des dérivées partielles par rapport à toutes les variables (q, chi, delta)).
Comment puis-je calculer ce gradient avec NumPy?
Le problème est que numpy ne peut pas vous fournir directement les dérivés et vous avez deux options:
Avec NUMPY
Ce que vous devez essentiellement faire est de définir une grille en trois dimensions et d’évaluer la fonction sur cette grille. Ensuite, vous alimentez cette table de valeurs de fonction dans numpy.gradient
pour obtenir un tableau avec la dérivée numérique de chaque dimension (variable).
Exemple de ici :
from numpy import *
x,y,z = mgrid[-100:101:25., -100:101:25., -100:101:25.]
V = 2*x**2 + 3*y**2 - 4*z # just a random function for the potential
Ex,Ey,Ez = gradient(V)
Sans NUMPY
Vous pouvez également calculer la dérivée vous-même en utilisant le quotient de différence centré } _.
Il s’agit essentiellement de ce que numpy.gradient
_ { fait } _ pour chaque point de votre grille prédéfinie.
Numpy et Scipy sont destinés aux calculs numériques. Puisque vous voulez calculer le gradient d'une fonction analytique, vous devez utiliser le paquet Sympy qui prend en charge les mathématiques symboliques. La différenciation est expliquée ici (vous pouvez l’utiliser dans la console Web dans le coin inférieur gauche).
Vous pouvez installer Sympy sous Ubuntu avec
Sudo apt-get install python-sympy
ou sous toute distribution Linux avec pip
Sudo pip install sympy
De plus, theano
peut calculer le dégradé automatiquement
http://deeplearning.net/software/theano/tutorial/gradients.html
Numpy ne prend pas directement en charge les calculs de dégradés sans créer une grille de points complète. Au lieu de cela, je voudrais utiliser autodifferentiation Voir https://code.activestate.com/recipes/580610-auto-differentiation/ pour savoir comment le faire en Python.
Vous pouvez utiliser scipy.optimize.approx_fprime
f = lambda x: x**2
approx_fprime(np.array([2]), f, epsilon=1e-6) # array([ 4.000001])