Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用NumPy计算梯度_Python_Numpy_Scipy_Gradient - Fatal编程技术网

Python 用NumPy计算梯度

Python 用NumPy计算梯度,python,numpy,scipy,gradient,Python,Numpy,Scipy,Gradient,我真的不明白什么是numpy.gradient函数,以及如何使用它来计算多变量函数的梯度 例如,我有这样一个功能: def func(q, chi, delta): return q * chi * delta 我需要计算它的三维梯度(换句话说,我要计算所有变量(q,chi,delta)的偏导数) 如何使用NumPy计算此梯度?NumPy和Scipy用于数值计算。由于要计算分析函数的梯度,必须使用支持符号数学的软件包。这里解释了区别(您实际上可以在左下角的web控制台中使用它) 你可以

我真的不明白什么是
numpy.gradient
函数,以及如何使用它来计算多变量函数的梯度

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

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


如何使用NumPy计算此梯度?

NumPy和Scipy用于数值计算。由于要计算分析函数的梯度,必须使用支持符号数学的软件包。这里解释了区别(您实际上可以在左下角的web控制台中使用它)

你可以在Ubuntu下用

sudo apt-get install python-sympy
或者在任何具有


问题是,numpy不能直接给你导数,你有两个选择:

带NUMPY

你基本上要做的是定义一个三维网格,并在这个网格上评估函数。然后,将此函数值表馈送到
numpy.gradient
,以获得每个维度(变量)的数值导数数组

示例来自:

不带NUMPY

你也可以自己用公式计算导数。


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

同样
theano
可以自动计算渐变


Numpy在不创建整个点网格的情况下,不直接支持渐变计算。相反,我会使用 有关如何在Python中执行此操作的信息,请参阅。

您可以使用


谢谢你,Stefan!事实上,我知道如何手动计算导数(没有任何框架),但我无法理解np.gradient是如何工作的。以前我曾用C++和GSL结合,但是这种方法需要太多的编码。code>numpy.gradient类似,但在边界处有特殊行为。@Mark:
numpy.gradient
更像这个公式(以$+\Delta x$和$-\Delta x$为中心的差商),而不是
numpy.diff
它们都非常相似<“代码>渐变”(code>gradient)确实在栅格点处使用中心差分,这是类似的,但对边界的处理不同<代码>DIF/<代码>可以得到网格点中间的中心差异(与Delta半网格间距),并且不特别地处理边界,只是使梯度网格1点更小。它们都遵循表达式,但具有不同的求值点和增量,以及不同的边界行为。因为答案没有提到如何处理这些问题,我想这是主观的,更类似于。。。
sudo pip install sympy
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)
f = lambda x: x**2
approx_fprime(np.array([2]), f, epsilon=1e-6)  # array([ 4.000001])