Алгоритм оптимизации (доверительная область изгибающейся ноги) в Matlab и Python

Я пытаюсь решить набор нелинейных уравнений, используя алгоритм доверительной области с собачьей ногой в Matlab и Python.

В Matlab есть fsolve, где этот алгоритм используется по умолчанию, тогда как для Python мы указываем 'dogleg' в scipy .оптимизировать.свернуть. Мне не нужно указывать якобиан или гессиан для Matlab, тогда как Python нужен любой из них для решения проблемы.

У меня нет якобиана/гессеана, так есть ли способ обойти эту проблему для Python? Или есть другая функция, которая выполняет эквивалент метода изгиба Matlab в fsolve?


person Medulla Oblongata    schedule 05.12.2016    source источник


Ответы (1)


В более новых версиях scipy есть функция приблизительно_fprime. Он вычисляет числовую аппроксимацию якобиана функции f в позиции xk, используя конечную разность шага вперед. Он возвращает ndarray с частичным производным от f в позициях xk.

Если вы не можете обновить свою версию scipy, вы всегда можете скопировать реализацию из источник scipy.


Редактировать:

scipy.optimize.minimize вызывает approx_fprime внутренне, если вход jac=False. Итак, в вашем случае должно быть достаточно сделать следующее:

scipy.optimize.minimize(fun, x0, args, method='dogleg', jac=False)

Редактировать

scipy, похоже, не обрабатывает условие jac=False должным образом, поэтому необходимо построить вызываемый jac с использованием approx_fprime следующим образом.

jac = lambda x,*args: scipy.optimize.approx_fprime(x,fun,epsilon,*args)
scipy.optimize.minimize(fun, x0, args, method='dogleg', jac=jac)
person lucianopaz    schedule 05.12.2016
comment
Да, ты прав! Спасибо, что заставил меня заметить. Я отредактировал свой ответ, а также добавил часть о том, что минимизируются внутренние вызовы approx_fprime, если jac=False - person lucianopaz; 08.12.2016
comment
Я получаю сообщение об ошибке, когда я указываю jac=False: ValueError: Jacobian is required for dogleg minimization. - person Medulla Oblongata; 13.12.2016
comment
Похоже, ошибка в обработке scipy числовая оценка. Ошибка сохраняется в текущих версиях scipy, поэтому кажется, что необходимо разместить сообщение об ошибке или что-то еще. Чтобы решить вашу конкретную проблему, вам нужно будет создать вызываемый jac с помощью approx_fprime. Я отредактировал свой ответ соответственно. - person lucianopaz; 13.12.2016