Якобиан решения от scipy.optimize не равен fja c scipy.optimize.OptimizeResult - PullRequest
1 голос
/ 08 апреля 2020

При нахождении root функции с использованием scipy.optimize.root() с аргументом jac = True, OptimizeResult.fjac возвращает значения якобиана, которые неверны с якобианом решения.

Например,

# objective function
def fun(x):
    return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0, 0.5 * (x[1] - x[0])**3 + x[1]]

# function returns Jacobain at x
def jac(x):
    return np.array([[1 + 1.5 * (x[0] - x[1])**2, -1.5 * (x[0] - x[1])**2],
                [-1.5 * (x[1] - x[0])**2,
                1 + 1.5 * (x[1] - x[0])**2]])
from scipy import optimize
sol = optimize.root(fun, [0, 0], jac=jac)

После того, как решение сходится, sol.fjac отличается от jac(sol.x)? Я не смог бы понять, что fjac обозначает из OptimizeResult?

Любые идеи и исправления очень ценятся:)

1 Ответ

1 голос
/ 09 апреля 2020

Я проверил с помощью отладчика, и по умолчанию используется алгоритм scipy.optimize. root использует функцию _minpack.hybrj. Если вы посмотрите на документацию по fsolve (которая также использует hybrj), она указывает:

fjac ортогональная матрица q, полученная с помощью факторизации QR окончательной приближенной матрицы Якоби, с сохранением столбца, мудрая

Таким образом, кажется, что документация Сципи неполна.

Источник: https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.fsolve.html

...