Вычисление градиента с помощью NumPy

Я действительно не могу понять, что делает функция numpy.gradient и как ее использовать для вычисления многовариантного градиента функции.

Например, у меня есть такая функция:

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

Мне нужно вычислить его трехмерный градиент (другими словами, я хочу вычислить частные производные по всем переменным (q, chi, delta)).

Как я могу вычислить этот градиент с помощью NumPy?

Ответы

Ответ 1

Проблема заключается в том, что 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

Вы также можете вычислить производную, используя центрированный фактор разницы. centered difference quotient

Это по существу, что numpy.gradient делает для каждой точки вашей предопределенной сетки.

Ответ 2

Numpy и Scipy предназначены для численных расчетов. Поскольку вы хотите рассчитать градиент аналитической функции, вы должны использовать пакет Sympy, который поддерживает символическую математику. Дифференциация объясняется здесь (вы можете использовать ее в веб-консоли в левом нижнем углу).

Вы можете установить Sympy под Ubuntu с помощью

sudo apt-get install python-sympy

или в любом дистрибутиве Linux с pip

sudo pip install sympy

Ответ 5

Вы можете использовать scipy.optimize.approx_fprime

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