functions - numpy python tutorial
Cálculo de gradiente con NumPy (5)
Numpy no admite cálculos de gradiente directamente sin crear una grilla completa de puntos. En cambio, usaría autodiferenciación. Consulte https://code.activestate.com/recipes/580610-auto-differentiation/ para saber cómo hacerlo en Python.
Realmente no puedo entender qué función numpy.gradient
tiene y cómo usarla para calcular el gradiente de función multivariable .
Por ejemplo, tengo esa función:
def func(q, chi, delta):
return q * chi * delta
Necesito calcular su gradiente tridimensional (en otras palabras, quiero calcular derivadas parciales con respecto a todas las variables (q, chi, delta)).
¿Cómo puedo calcular este gradiente usando NumPy?
Numpy y Scipy son para cálculos numéricos. Como desea calcular el gradiente de una función analítica, debe usar el paquete Sympy que admite matemática simbólica. La diferenciación se explica aquí (puedes usarla en la consola web en la esquina inferior izquierda).
Puedes instalar Sympy en Ubuntu con
sudo apt-get install python-sympy
o bajo cualquier distribución de Linux con pip
sudo pip install sympy
También theano
puede calcular el gradiente automáticamente
http://deeplearning.net/software/theano/tutorial/gradients.html
El problema es que ese numpy no puede darte los derivados directamente y tienes dos opciones:
Con NUMPY
Lo que esencialmente tiene que hacer, es definir una grilla en tres dimensiones y evaluar la función en esta grilla. Después, alimenta esta tabla de valores de función a numpy.gradient
para obtener una matriz con la derivada numérica para cada dimensión (variable).
Ejemplo de aquí :
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)
Sin NUMPY
También puede calcular la derivada usted mismo usando el cociente de diferencia centrado .
Esto es esencialmente lo que está haciendo numpy.gradient
para cada punto de su grilla predefinida.
Podría usar scipy.optimize.approx_fprime
f = lambda x: x**2
approx_fprime(np.array([2]), f, epsilon=1e-6) # array([ 4.000001])