2016-12-05 37 views
0

Я пытаюсь решить набор нелинейных уравнений, используя алгоритм доверия между собаками-ногами в Matlab и Python.Алгоритм оптимизации (trust-region dog-leg) в Matlab и Python

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

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

ответ

2

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

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


Edit:

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

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

Edit

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) 
+0

Да, вы правы! Спасибо, что вызвали меня. Я отредактировал мой ответ, а также добавил часть, в которой говорится, что минимизация вызовов 'approx_fprime' внутренне, если' jac = False' – lucianopaz

+0

Я получаю сообщение об ошибке, когда я указываю 'jac = False':' ValueError: Jacobian требуется для минимизации dogleg'. –

+0

Похоже на ошибку в обработке scipy [числовой оценки] (https://github.com/scipy/scipy/blob/v0.18.0/scipy/optimize/_minimize.py#L411-L416). Ошибка сохраняется в текущих версиях scipy, поэтому кажется, что нужно поместить билет с ошибкой или что-то еще. Чтобы решить вашу конкретную проблему, вам нужно будет создать вызываемый 'jac' с помощью' approx_fprime'. Я отредактировал свой ответ соответственно. – lucianopaz