Python GEKKO: Как избежать появления ошибки IPOPT «Решено до приемлемого уровня». - PullRequest
1 голос
/ 20 сентября 2019

Я решаю ряд уравнений в симуляции (IMODE = 1, SOLVER = 3).Решатель IPOPT решает проблему до приемлемого уровня и завершает работу, но gekko возвращает ошибку для этого и возвращает мое решение.Согласно документации IPOPT, допустимый уровень допуска равен 1,0e-6, что соответствует значениям по умолчанию для OTOL и RTOL, используемым gekko (и значениям, которые я использую).Мне удалось изменить исходный код gekko.py, чтобы получить ответ, но благодаря этому я обошел все типы ошибок.Я не хочу, чтобы все ошибки были обойдены, поскольку они, очевидно, помогают отладить другие проблемы, такие как неосуществимость.Есть ли опция m.solve, которую я пропускаю, или другой способ не вызвать ошибку, когда IPOPT решает до приемлемого уровня?

1 Ответ

1 голос
/ 20 сентября 2019

Один из способов обработки ошибок из решателя состоит в том, чтобы заключить команду решения в операторы try, except.Выходные данные APPINFO могут дать вам указания относительно того, какой тип ошибки был обнаружен, и позволить вам по-разному реагировать на «неосуществимое решение», «решено до приемлемого уровня» или другие коды ошибок IPOPT .

try:
   m.solve(disp=True)
except:
   print('Solver error, looking at APPINFO')
   if m.options.APPINFO==1:
      print('APPINFO=1')
   elif m.options.APPINFO==2:
      print('APPINFO=2')

Другой вариант - попробовать другой решатель, такой как APOPT или BPOPT .

m.options.SOLVER = 1

Редактировать: Параметр APPINFO не обновляется, когда Gekko вызывает исключение решателя.Вместо этого попробуйте следующее с debug=0:

m.solve(disp=True,debug=0)
if m.options.APPINFO!=0:
   print('Solver error, looking at APPINFO')
if m.options.APPINFO==1:
   print('APPINFO=1')
elif m.options.APPINFO==2:
   print('APPINFO=2')

Я только что обновил Gekko, чтобы удаленные решения также обходили возникшие исключения и заканчивали обработку файла опций с информацией APPINFO.Информация APPINFO находится в options.json в каталоге выполнения при локальном запуске и считывается с load_JSON в gk_post_solve.py.

...