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

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

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

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

1 ответ

В более новых версиях scipy есть функция ок. Вычисляет числовое приближение якобиана функции 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)
Другие вопросы по тегам