我实在无法理解什么numpy.gradient
功能原理,以及如何使用它的多变量函数梯度的计算。
例如,我有这样的功能:
def func(q, chi, delta):
return q * chi * delta
我需要计算它的3维梯度(换言之,我想计算偏导数相对于所有变量(Q,志,三角洲))。
我如何使用NumPy的计算这个梯度?
我实在无法理解什么numpy.gradient
功能原理,以及如何使用它的多变量函数梯度的计算。
例如,我有这样的功能:
def func(q, chi, delta):
return q * chi * delta
我需要计算它的3维梯度(换言之,我想计算偏导数相对于所有变量(Q,志,三角洲))。
我如何使用NumPy的计算这个梯度?
问题是,numpy的不能直接给你衍生物和你有两个选择:
随着NumPy的
你实际上需要做的,就是在三维定义一个网格,以评估该网格的功能。 之后你喂函数值的这张表来numpy.gradient
获得具有用于每个维度(变量)的数值衍生物的阵列。
从实例这里 :
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)
没有NumPy的
你也可以自己通过计算派生中心差商 。
这基本上是什么numpy.gradient
做你的义电网的每一个点。
与NumPy和SciPy的是数值计算。 既然你要计算的解析函数的梯度,则必须使用Sympy支持符号数学包。 分化,说明在这里 (实际上你可以在左下角的Web控制台使用它)。
你可以在Ubuntu下安装Sympy
sudo apt-get install python-sympy
或在任何Linux发行PIP
sudo pip install sympy
也theano
可以自动计算梯度
http://deeplearning.net/software/theano/tutorial/gradients.html
你可以使用scipy.optimize.approx_fprime
f = lambda x: x**2
approx_fprime(np.array([2]), f, epsilon=1e-6) # array([ 4.000001])
NumPy的不直接支持梯度计算,而无需创建点的整个电网。 相反,我会用autodifferentiation见https://code.activestate.com/recipes/580610-auto-differentiation/如何做到这一点在Python。