scipy.differentiate.

якобиан#

scipy.differentiate.якобиан(f, x, *, допуски=None, maxiter=10, порядок=8, initial_step=0.5, step_factor=2.0, step_direction=0)[источник]#

Вычислить якобиан функции численно.

Параметры:
fcallable

Функция, чья матрица Якоби требуется. Сигнатура должна быть:

f(xi: ndarray) -> ndarray

где каждый элемент xi является конечным вещественным числом. Если функция для дифференцирования принимает дополнительные аргументы, оберните её (например, используя functools.partial или lambda) и передать обёрнутый вызываемый объект в jacobian. f не должен изменять массив xi. См. примечания относительно векторизации и размерности входных и выходных данных.

xfloat array_like

Точки, в которых вычисляется якобиан. Должны иметь хотя бы одно измерение. См. примечания относительно размерности и векторизации.

допускисловарь чисел с плавающей точкой, опционально

Абсолютная и относительная погрешности. Допустимые ключи словаря:

  • atol - абсолютный допуск на производную

  • rtol - относительный допуск на производную

Итерация остановится, когда res.error < atol + rtol * abs(res.df). По умолчанию atol является наименьшим нормальным числом соответствующего типа данных, и по умолчанию rtol является квадратным корнем точности соответствующего типа данных.

maxiterint, по умолчанию: 10

Максимальное количество итераций алгоритма для выполнения. См. Примечания.

порядокint, по умолчанию: 8

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

initial_stepfloat array_like, по умолчанию: 0.5

(Абсолютный) начальный размер шага для аппроксимации производной конечными разностями. Должен быть совместим с x и step_direction.

step_factorfloat, по умолчанию: 2.0

Коэффициент, на который умножается размер шага уменьшенный на каждой итерации; т.е. размер шага на итерации 1 равен initial_step/step_factor. Если step_factor < 1, последующие шаги будут больше начального шага; это может быть полезно, если шаги меньше некоторого порога нежелательны (например, из-за ошибки вычитательной отмены).

step_directionцелочисленный array_like

Массив, представляющий направление шагов конечных разностей (например, для использования, когда x находится близко к границе области определения функции.) Должно быть совместимо с x и initial_step. Где 0 (по умолчанию), используются центральные разности; где отрицательное (например, -1), шаги неположительные; и где положительное (например, 1), все шаги неотрицательные.

Возвращает:
res_RichResult

Объект, похожий на экземпляр scipy.optimize.OptimizeResult со следующими атрибутами. Описания написаны так, как будто значения будут скалярами; однако, если f возвращает массив, выходные данные будут массивами той же формы.

successлогический массив

True где алгоритм успешно завершился (статус 0); False в противном случае.

statusцелочисленный массив

Целое число, представляющее статус завершения алгоритма.

  • 0 : Алгоритм сошелся к заданным допускам.

  • -1 : Оценка ошибки увеличилась, поэтому итерация была прекращена.

  • -2 : Достигнуто максимальное количество итераций.

  • -3 : Встречено неконечное значение.

dfмассив float

Якобиан f в x, если алгоритм завершился успешно.

ошибкамассив float

Оценка ошибки: величина разницы между текущей оценкой якобиана и оценкой на предыдущей итерации.

nitцелочисленный массив

Количество выполненных итераций алгоритма.

nfevцелочисленный массив

Количество точек, в которых f было вычислено.

Каждый элемент атрибута связан с соответствующим элементом df. Например, элемент i of nfev является количеством точек, в которых f был оценен для вычисления элемента i of df.

Смотрите также

derivative, hessian

Примечания

Предположим, мы хотим оценить матрицу Якоби функции \(f: \mathbf{R}^m \rightarrow \mathbf{R}^n\). Присвоить переменным m и n положительные целые значения \(m\) и \(n\), соответственно, и пусть ... представляет произвольный кортеж целых чисел. Если мы хотим вычислить якобиан в одной точке, то:

  • аргумент x должен быть массивом формы (m,)

  • аргумент f должен быть векторизован для принятия массива формы (m, ...). Первая ось представляет \(m\) входы \(f\); остальные предназначены для вычисления функции в нескольких точках за один вызов.

  • аргумент f должен возвращать массив формы (n, ...). Первая ось представляет \(n\) выходы \(f\); остальные предназначены для результата вычисления функции в нескольких точках.

  • атрибут df результирующего объекта будет массивом формы (n, m), матрица Якоби.

Эта функция также векторизована в том смысле, что якобиан может быть вычислен в k точки в одном вызове. В этом случае, x будет массивом формы (m, k), f примет массив формы (m, k, ...) и вернуть массив формы (n, k, ...)должны быть включены в старые категории. Значения, которые были в удаленных категориях, будут установлены в NaN df атрибут результата будет иметь форму (n, m, k).

Предположим, желаемый вызываемый объект f_not_vectorized не векторизован; он может принимать только массив формы (m,). Простое решение для удовлетворения требуемого интерфейса — обернуть f_not_vectorized следующим образом:

def f(x):
    return np.apply_along_axis(f_not_vectorized, axis=0, arr=x)

В качестве альтернативы, предположим, что требуемый вызываемый объект f_vec_q векторизован, но только для 2-D массивов формы (m, q). Чтобы удовлетворить требуемый интерфейс, рассмотрите:

def f(x):
    m, batch = x.shape[0], x.shape[1:]  # x.shape is (m, ...)
    x = np.reshape(x, (m, -1))  # `-1` is short for q = prod(batch)
    res = f_vec_q(x)  # pass shape (m, q) to function
    n = res.shape[0]
    return np.reshape(res, (n,) + batch)  # return shape (n, ...)

Затем передать обёрнутый вызываемый объект f в качестве первого аргумента jacobian.

Ссылки

[1]

Матрица Якоби и определитель, Википедия, https://en.wikipedia.org/wiki/Jacobian_matrix_and_determinant

Примеры

Функция Розенброка отображает из \(\mathbf{R}^m \rightarrow \mathbf{R}\); реализация в SciPy scipy.optimize.rosen векторизован для приёма массива формы (m, p) и вернуть массив формы p. Предположим, мы хотим вычислить якобиан (также известный как градиент, потому что функция возвращает скаляр) в [0.5, 0.5, 0.5].

>>> import numpy as np
>>> from scipy.differentiate import jacobian
>>> from scipy.optimize import rosen, rosen_der
>>> m = 3
>>> x = np.full(m, 0.5)
>>> res = jacobian(rosen, x)
>>> ref = rosen_der(x)  # reference value of the gradient
>>> res.df, ref
(array([-51.,  -1.,  50.]), array([-51.,  -1.,  50.]))

В качестве примера функции с несколькими выходами рассмотрим Пример 4 из [1].

>>> def f(x):
...     x1, x2, x3 = x
...     return [x1, 5*x3, 4*x2**2 - 2*x3, x3*np.sin(x1)]

Истинная матрица Якоби задаётся как:

>>> def df(x):
...         x1, x2, x3 = x
...         one = np.ones_like(x1)
...         return [[one, 0*one, 0*one],
...                 [0*one, 0*one, 5*one],
...                 [0*one, 8*x2, -2*one],
...                 [x3*np.cos(x1), 0*one, np.sin(x1)]]

Вычислить якобиан в произвольной точке.

>>> rng = np.random.default_rng()
>>> x = rng.random(size=3)
>>> res = jacobian(f, x)
>>> ref = df(x)
>>> res.df.shape == (4, 3)
True
>>> np.allclose(res.df, ref)
True

Вычислить якобиан в 10 произвольных точках за один вызов.

>>> x = rng.random(size=(3, 10))
>>> res = jacobian(f, x)
>>> ref = df(x)
>>> res.df.shape == (4, 3, 10)
True
>>> np.allclose(res.df, ref)
True