Выбор решающей программы: NonlinearBlockGS vs NewtonSolver
У меня есть две группы openmdao с циклической зависимостью между группами. Я вычисляю производные, используя сложный шаг. У меня есть нелинейный решатель зависимости, и я использую SLSQP для оптимизации моей целевой функции. Проблема заключается в выборе нелинейного решателя. При использовании NonlinearBlockGSоптимизация проходит успешно за 12 итераций. Но когда я использую NewtonSolverwith Directsolverили ScipyKrylovпри сбое оптимизации (превышен предел итераций), даже с maxiter=2000. Циклические связи сходятся, но просто расчетные переменные не достигают оптимальных значений. Разница между проектными переменными в последовательных итерациях находится в порядке 1e-5. И это увеличивает количество необходимых итераций. Также, когда я изменяю первоначальное предположение на значение, более близкое к оптимальному, оно работает.
Для дальнейшей проверки я преобразовал модель в IDF (путем создания копий переменных связывания и ограничений согласованности), тем самым устранив необходимость в решателе. Теперь оптимизация прошла успешно за 5 итераций, и результаты аналогичны результатам при NonlinearBlockGSиспользовании.
Почему это происходит? Я что-то пропустил? Когда я должен использовать NewtonSolverвместо других? Я знаю, что сложно ответить, не увидев кода. Но дело в том, что мой код длинный и состоит из нескольких компонентов, и я не мог воссоздать проблему с игрушечной моделью. Поэтому ценится любое общее понимание.
Ответы
Не видя кода, вы правы в том, что сложно дать конкретику.
Вообще говоря, у Newton иногда может быть намного больше проблем с конвергенцией, чем у NLBGS (примечание: это не совсем так, но это хорошее практическое правило). Итак, я предполагаю, что происходит то, что на вашей первой или второй итерации решатель Ньютона на самом деле не сходится. Вы можете проверить это, установив newton.options['iprint']=2и просмотрев историю итераций по мере выполнения оптимизатором.
Когда у вас есть решатель в вашей оптимизации, очень важно, чтобы вы также установили его так, чтобы он выдавал ошибку при несовпадении. Некоторые оптимизаторы могут обрабатывать эту ошибку и возвращаются к поиску строки. Остальные просто умрут. В любом случае, это важно. В противном случае вы предоставите оптимизатору несогласованный случай, о котором он не знает.
Это плохо по двум причинам. Во-первых, полученные значения цели и ограничений будут неправильными! Во-вторых, что, возможно, более важно, производные, которые он вычисляет, будут неправильными! Вы можете прочитать подробности [в руководстве по теории], но в целом аналитические производные методы, которые использует OpenMDAO, предполагают, что остатки упали до 0. Если это не так, математика не работает. Даже если вы делали полную модель с конечными разностями, неконвергентные модели представляют собой проблему. Вы просто получите шумный мусор, когда попытаетесь FD. 2
Итак, если вы правильно настроили свою модель и у вас есть проблемы с настройкой линейных решателей (похоже, что вы это делаете, поскольку он работает с NLBGS), то наиболее вероятно, что решатель Ньютона не сходится. Используйте iprint, возможно, в сочетании с печатью отладки драйвера , чтобы убедиться в этом сами. Если это так, вам нужно выяснить, как заставить Ньютона вести себя лучше.
Здесь есть несколько общих советов . Вы также можете попробовать использовать поиск по строке armijo , который часто может стабилизировать решение Ньютона за счет некоторой скорости.
Наконец ... Ньютон - не лучший ответ во всех ситуациях. Если NLBGS более стабилен и требует меньших вычислительных затрат, вам следует использовать его. Я приветствую ваше желание заставить его работать с Ньютоном. Вы обязательно должны выяснить, почему это не так, но если окажется, что Ньютон просто не может надежно решить вашу связанную проблему, это тоже нормально!