Как получить сходящиеся результаты в IPOPT для проблемы с разрывом в системе Dynami c? - PullRequest
0 голосов
/ 14 февраля 2020

Я моделирую самолет, взлетающий с ВПП в MATLAB, и использую IPOPT в качестве решателя НЛП для решения соответствующей дискретной задачи оптимального управления (ортогональной коллокации Лежандра-Гаусса-Радау). В той части, где я моделирую физику самолета, силу подъема и вес, а также нормальную силу, я заметил, что в IPOPT происходит сложное сближение.

Я бы хотел смоделировать нормальную силу так, чтобы она равнялась нулю всякий раз, когда подъем превышает вес (для простоты предполагается, что наклон сейчас не наклонен). Я делаю это, устанавливая N(N < 0) = 0 в MATLAB, где N - нормальная сила. При этом IPOPT останавливается после максимального числа итераций в выполнимой точке первого порядка (таким образом, динамика и ограничения удовлетворяются), но в недопустимой точке второго порядка (условия KKT не выполняются в достаточной степени / решение не является оптимальным, inf_du ~ O(0)). Я включил фрагмент вывода IPOPT в точку, где он уже «застрял»:

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
 630 5.8586166e+001 1.24e-009 9.52e-001 -11.0 7.62e-006   5.1 1.00e+000 1.00e+000h  1
 631 5.8586154e+001 1.24e-009 9.52e-001 -11.0 2.86e-006   5.5 1.00e+000 1.00e+000h  1
 632 5.8586120e+001 1.24e-009 1.11e+000 -11.0 8.57e-006   5.0 1.00e+000 1.00e+000h  1
 633 5.8586107e+001 1.24e-009 9.52e-001 -11.0 3.21e-006   5.5 1.00e+000 1.00e+000h  1

Теперь, когда я выключаю условие N(N < 0) = 0, по существу, допускаю «липкую» взлетно-посадочную полосу ( самолет остается на взлетно-посадочной полосе, даже если подъемная сила больше, чем вес), проблема сходится довольно легко.

Я подозреваю, что разрыв (градиент) в N и, следовательно, в динамике системы в точке, где подъем равен весу, не очень хорошо обрабатывается IPOPT. Однако я все же хотел бы смоделировать взлет вышеупомянутым способом.

Кто-нибудь имеет опыт работы с IPOPT и может сказать мне, вероятно ли мое подозрение? Более того, может ли кто-нибудь предложить улучшение или обходной путь, чтобы разрыв с нормальной силой обрабатывался лучше?

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

Ps Я знаю, что очень сложно дать конкретный c ответ на основании этого ограниченного количества информации. Тем не менее, из-за долговечности кода, я не могу поделиться полной информацией о нем. Поэтому я в основном ищу ответы и предложения, основанные на опыте людей (похожих).

...