Cálculo del gradiente con NumPy

Realmente no puedo entender qué numpy.gradient función numpy.gradient y cómo usarla para el cálculo del gradiente de función multivariable .

Por ejemplo, tengo una función de este tipo:

 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?

El problema es que ese número no puede darle los derivados directamente y tiene dos opciones:

Con NUMPY

Lo que esencialmente tiene que hacer, es definir una cuadrícula en tres dimensiones y evaluar la función en esta cuadrícula. Luego, 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 desde 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 utilizando el cociente de diferencias centradas . cociente de diferencia centrada

Básicamente, esto es lo que hace numpy.gradient para cada punto de su cuadrícula predefinida.

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 las matemáticas simbólicas. La diferenciación se explica aquí (puede usarla en la consola web en la esquina inferior izquierda).

Puedes instalar Sympy bajo 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

Numpy no admite directamente los cálculos de gradiente sin crear una cuadrícula completa de puntos. En su lugar, usaría la autodiferenciación. Vea https://code.activestate.com/recipes/580610-auto-differentiation/ para saber cómo hacerlo en Python.

Puedes usar scipy.optimize.approx_fprime

 f = lambda x: x**2 approx_fprime(np.array([2]), f, epsilon=1e-6) # array([ 4.000001])