2016-08-08 8 views
0

Вот моя проблема: я оптимизирую различные проблемы с openmdao, используя различные решатели. Проблема дает мне объективную функцию, которая имеет 1 или более корней, и моя цель - приблизиться к одной, используя оптимизацию. Там нет никаких проблем с SLSQP или PSQP, например, но при использовании IPOPT, вот что я могу получить от печати подробных результатов (экстракт): enter image description hereОстановить критерий объектной функции (IPOPT)

Моей проблема может быть плохо масштабируется или что-то, но есть способ остановить IPOPT, когда целевая функция (например) ниже 1e-5? Мне нужно исправить «tol» около 5., чтобы получить то, что я хочу в этой конкретной проблеме, но влияние «tol» на Eo, которое зависит не только от целевой функции ... У кого-то есть идея? спасибо заранее

ответ

0

Ipopt имеет кучу различных допусков на конвергенцию. Ознакомьтесь с некоторыми документами по адресу: http://www.coin-or.org/Ipopt/documentation/node42.html

Правильно настройте его, чтобы остановить его, когда захотите. Возможно, вы захотите попробовать acceptable_tol, он ищет, когда ответ перестает меняться в качестве критерия завершения.

+0

Я уже проверил эту ссылку. Я должен установить высокий «dual_inf_tol», чтобы моя проблема была остановлена ​​раньше (inf_du составляет около 1e1). Вещь является критерием tol и allowed_tol, зависящим от многих подпроцессов проблемы в соответствии с документом реализации (http://cepac.cheme.cmu.edu/pasilectures/biegler/ipopt.pdf). Таким образом, по-видимому, нет предопределенного значения, которое я мог бы установить, чтобы остановить его, когда целевая функция находится под значением. Поэтому мой вопрос о том, как это сделать (это не будет указано в разделе завершения документации) – gael17

+0

, похоже, что вас не устраивает их встроенный критерий остановки. Вы можете изменить код оболочки OpenMDAO, чтобы добавить свой собственный критерий остановки. Вам нужно быть немного осторожным, чтобы это не получилось как полный взлом, но если вам просто нужно что-то быстро и грязно, тогда взломайте: https://github.com/OpenMDAO/OpenMDAO/blob/master/openmdao /drivers/pyoptsparse_driver.py#L423 –

+0

Это именно то, на что это похоже. Похоже, что _objfunc используется только для класса Optimization (от pyoptsparse). Я не вижу никакого способа изменить критерии остановки из обертки, поскольку обертка напрямую вызывает оптимизатор и обрабатывает только результаты ... И изменение кода IPOPT кажется слишком сложным: / – gael17

 Смежные вопросы

  • Нет связанных вопросов^_^