Я моделирую самолет, взлетающий с ВПП в 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 ответ на основании этого ограниченного количества информации. Тем не менее, из-за долговечности кода, я не могу поделиться полной информацией о нем. Поэтому я в основном ищу ответы и предложения, основанные на опыте людей (похожих).