Сравнение результатов fsolve в python и matlab

У меня есть дополнительный вопрос к сообщению, написанному пару дней назад, спасибо за предыдущий отзыв:

Поиск сложных корни из набора нелинейных уравнений в питоне

Теперь я получил набор нелинейных уравнений, настроенных на python, так что fsolve будет обрабатывать реальную и мнимую части независимо. Тем не менее, все еще есть проблемы с тем, что python «fsolve» сходится к правильному решению. У меня есть точно такие же входные данные, которые используются в Matlab, и после двойной проверки набор уравнений точно такой же. Matlab, как бы я ни задавал начальные значения, всегда будет сходиться к правильному решению. Однако с python каждое начальное условие дает другой результат, и никогда не бывает правильным. Через долю секунды появляется следующее предупреждение с python:

/opt/local/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages/scipy/optimize/minpack.py:227: 
RuntimeWarning: The iteration is not making good progress, as measured by the 
improvement from the last ten iterations.
warnings.warn(msg, RuntimeWarning) 

Мне было интересно, есть ли какие-то известные различия между fsolve в python и Matlab, и есть ли какие-то известные методы оптимизации производительности в python.

Большое тебе спасибо


person rmsrms1987    schedule 19.02.2014    source источник


Ответы (1)


Я не думаю, что вы должны полагаться на то, что имена совпадают. Из вашего другого вопроса я вижу, что вы указываете, что Matlab fsolve использует 'levenberg-marquardt' алгоритм, а не по умолчанию. Python scipy.optimize.fsolve использует алгоритмы hybrd MINPACK. Левенберг-Марквардт находит корни приблизительно, минимизируя сумму квадратов функции, и является достаточно надежным . Это не настоящий метод поиска корней, как метод по умолчанию 'trust-region-dogleg' алгоритм. Я не знаю, как работают схемы hybrd, но они утверждают, что являются модификацией метода Пауэлла.

Если вам нужно что-то похожее на то, что вы делаете в Matlab, я бы поискал схему оптимизации, реализующую Levenberg-Marquardt, например scipy.optimize.root, который вы также использовали в своем предыдущем вопросе. Есть ли причина, почему вы не используете это?

person horchler    schedule 19.02.2014
comment
Спасибо за ваш отзыв! Первоначально в моем коде я пробовал метод «lm», используя корневую функцию в scipy. Тем не менее, результаты были полностью выключены. Затем я попытался просто использовать числовой решатель по умолчанию для fsolve как в Python, так и в Matlab. После внесения этого изменения Matlab по-прежнему работал хорошо, а Python — нет. Так что на данный момент я просто немного потерян для идей. - person rmsrms1987; 19.02.2014
comment
Во-первых, можете ли вы получить сходимость, если вы укажете начальные условия как решение, данное Matlab (или что-то близкое к этому)? Если нет, то у вас может быть ошибка в вашем коде. Поскольку Левенберг-Марквардт работает, вы можете попробовать переформулировать задачу как минимизацию суммы квадратов и использовать метод из scipy.optimize.minimize, например Nelder-Mead. - person horchler; 19.02.2014
comment
@ rmsrms1987: Кроме того, можно ли указать или определить параметр Левенберга-Марквардта, который использует метод lm? Matlab использует значение по умолчанию 0,01. - person horchler; 19.02.2014
comment
Это хорошее предложение, я не рассматривал возможность использования результатов Matlab в коде Python. Оказывается в моем коде баг, так как решение не сошлось на питоне. Это явно нужно будет исправлять. Спасибо вам за помощь. - person rmsrms1987; 19.02.2014
comment
Это оказалось небольшим исправлением :/ . Из любопытства, как вы определили, что параметр Левенберга-Марквардта в Matlab равен 0,1? Я поищу, как это делается в питоне. - person rmsrms1987; 19.02.2014
comment
@rmsrms1987: Рад слышать. Параметр по умолчанию — 0.01, и он указан прямо в документации в разделе Алгоритм. Я заметил, что вы не приняли превосходный ответ, данный на ваш предыдущий вопрос (или любой из ваших предыдущих вопросов) . Если этот и любые другие ответы помогут решить ваши проблемы, обязательно примите их. - person horchler; 19.02.2014
comment
Спасибо за информацию. Извините, что не принял ответы, я только что получил привилегии сделать это после моего последнего сообщения. - person rmsrms1987; 19.02.2014