用NumPy计算梯度

时间:2013-04-18 09:10:16

标签: python numpy scipy gradient

我真的无法理解numpy.gradient函数的作用以及如何使用它来计算多变量函数梯度

例如,我有这样一个功能:

def func(q, chi, delta):
    return q * chi * delta

我需要计算它的三维梯度(换句话说,我想计算所有变量(q,chi,delta)的偏导数。)

如何使用NumPy计算此渐变?

5 个答案:

答案 0 :(得分:19)

问题是,numpy不能直接给你衍生物,你有两个选择:

使用NUMPY

您基本上要做的是在三维中定义网格并评估此网格上的功能。然后,将此函数值表提供给numpy.gradient,以获得具有每个维度(变量)的数值导数的数组。

来自here的示例:

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

您也可以使用centered difference quotient自行计算衍生物。 centered difference quotient

这基本上是预定义网格中每个点的numpy.gradient is doing

答案 1 :(得分:12)

Numpy和Scipy用于数值计算。由于您想要计算分析函数的梯度,您必须使用支持符号数学的Sympy包。差异化解释为here(您实际上可以在左下角的Web控制台中使用它。)

您可以使用

在Ubuntu下安装Sympy
sudo apt-get install python-sympy

或使用pip

的任何Linux发行版
sudo pip install sympy

答案 2 :(得分:4)

答案 3 :(得分:1)

您可以使用scipy.optimize.approx_fprime

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

答案 4 :(得分:0)

Numpy并不直接支持渐变计算而不创建整个网格点。相反,我会使用autodifferentiation 有关如何在Python中执行此操作,请参阅https://code.activestate.com/recipes/580610-auto-differentiation/