Алгоритм оптимизации (область доверия "собака-нога") в 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)