решение связанных ODE с ограничениями начального и конечного значений

12

Суть моего вопроса заключается в следующем: у меня есть система двух ODE. Один имеет ограничение начального значения, а другой имеет ограничение конечного значения. Это можно рассматривать как единую систему с ограничением начального значения для некоторых переменных и ограничением конечного значения для других.

Вот подробности:

Я пытаюсь использовать контроллер LQR с конечным горизонтом непрерывного времени для управления линейной динамической системой. Я хотел бы продолжить использование экосистемы Python.

Система имеет вид , при условии x ( 0 ) = x 0x˙(t)=Ax(t)+Bu(t)x(0)=x0

Решение LQR генерирует матрицу такую, что оптимальным управляющим входом u (t), линейным по x ( t ) , является u ( t ) = K ( t ) x ( t ) .K(t)x(t)u(t)=K(t)x(t)

где K(t)=R1BTP(t)

и является решением дифференциального уравнения Риккати с непрерывным временем (обратите внимание, что это P ( t ) является матрицей)P(t)P(t)

учетомP(tf)=QP˙(t)=ATP(t)P(t)A+P(t)BR1BTP(t)+QP(tf)=Q

, B , x 0 , Q , Q f , R , t f все заданы.ABx0QQfRtf

x00tftf

P(t)x(t)0tfx(t), Это касается меня, потому что числовой решатель ОДУ для x (t) не обязательно будет выбирать ОДУ в то же время, что и время численного решения $ P (t). Может быть, есть какой-то умный способ обеспечить это.

Другой способ решения проблемы, который я предвижу, - это совместное решение системы, но я не знаю, как справиться с сочетанием ограничений начального и конечного значений. Являются ли эти проблемы вычислительно сложными для решения? Могу ли я сделать это в SciPy / Python?

Гас
источник

Ответы:

8

P(t)t[0,tf]

Вы можете сделать это путем интерполяции между выходными значениями . Я рекомендую вам использовать метод Рунге-Кутты, который поддерживает плотный вывод. Например, scipy.integrate.ode.dopri5основан на таком методе. Таким образом, вы должны иметь возможность указывать очень точное время вывода, не заставляя интегратора делать очень маленькие шаги (при условии, что интерфейс scipy к нему реализован правильно).

Дэвид Кетчесон
источник
P(t)P(t)
6

Это называется двухточечной краевой задачей и хорошо изучено.

Метод съемки очень прост в программировании, но может быть чрезвычайно нестабильным в численном отношении.

Стандартный способ решения этих проблем - использование подхода множественной стрельбы и решение соответствующей нелинейной системы уравнений стандартным нелинейным решателем. Список решателей для нелинейных систем уравнений см., Например,
http://www.mat.univie.ac.at/~neum/glopt/software_l.html#nonlin.

В качестве переменных вы принимаете состояния регулярной сетки во времени (обычно не требуется очень тонкая сетка), а в качестве уравнений - граничные условия и отображения, которые отображают переменные времени t на переменные времени t + h. Это дает столько уравнений, сколько переменных. Вам нужно только предоставить процедуры для оценки этого отображения для данной конфигурации состояний в сетке, а нелинейный решатель делает все остальное. (Возможно, вам нужно несколько отправных точек, если ваши начальные догадки плохи.)

В Википедии http://en.wikipedia.org/wiki/Direct_multiple_shooting_method есть полезное описание процесса, если приведенное выше описание недостаточно подробное для вас. Книга Стоера / Булирша, цитируемая там, дает полную информацию.

Арнольд Ноймайер
источник
5

Я не знаю, как это сделать в Python, но ключевое слово, которое вы хотите найти в литературе, - это «метод стрельбы». Это имя метода, который решает проблемы, которые имеют ограничения как начального, так и конечного значения.

Вольфганг Бангерт
источник
1

AUTO может решать двухточечные BVP, имеет интерфейс Python и относительно прост в установке. http://www.ma.hw.ac.uk/~gabriel/auto07/node6.html .

Если вы пойдете по пути желания сначала решить P (t) и передать его другому ODE в качестве входных данных, тогда эффективный способ установить это - использовать PyDSTool. PyDSTool очень легко установить на любую платформу, см. Http://pydstool.sf.net . По умолчанию он будет использовать только линейную интерполяцию, хотя для вашего ранее вычисленного решения (так что вычисляйте это с точным временным разрешением). Тем не менее, вы можете заставить PyDSTool перейти точно к желаемым временным точкам даже с помощью адаптивного интегратора (хотя это может быть неэффективным и привести к неточностям). Но с достаточно маленькими максимальными временными шагами, линейной интерполяцией и быстрым интегратором (встроенный Dopri) для второй системы означает, что вам подойдет «обычные» системы, подобные этой.

RHC
источник