якобиан#
- 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. Например, элемент
iof nfev является количеством точек, в которых f был оценен для вычисления элементаiof df.
Смотрите также
Примечания
Предположим, мы хотим оценить матрицу Якоби функции \(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, ...)должны быть включены в старые категории. Значения, которые были в удаленных категориях, будут установлены в NaNdfатрибут результата будет иметь форму(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