Суть моего вопроса заключается в следующем: у меня есть система двух ODE. Один имеет ограничение начального значения, а другой имеет ограничение конечного значения. Это можно рассматривать как единую систему с ограничением начального значения для некоторых переменных и ограничением конечного значения для других.
Вот подробности:
Я пытаюсь использовать контроллер LQR с конечным горизонтом непрерывного времени для управления линейной динамической системой. Я хотел бы продолжить использование экосистемы Python.
Система имеет вид , при условии x ( 0 ) = x 0
Решение LQR генерирует матрицу такую, что оптимальным управляющим входом u (t), линейным по x ( t ) , является u ( t ) = K ( t ) x ( t ) .
где
и является решением дифференциального уравнения Риккати с непрерывным временем (обратите внимание, что это P ( t ) является матрицей)
учетомP(tf)=Q
, B , x 0 , Q , Q f , R , t f все заданы.
, Это касается меня, потому что числовой решатель ОДУ для x (t) не обязательно будет выбирать ОДУ в то же время, что и время численного решения $ P (t). Может быть, есть какой-то умный способ обеспечить это.
Другой способ решения проблемы, который я предвижу, - это совместное решение системы, но я не знаю, как справиться с сочетанием ограничений начального и конечного значений. Являются ли эти проблемы вычислительно сложными для решения? Могу ли я сделать это в SciPy / Python?
Это называется двухточечной краевой задачей и хорошо изучено.
Метод съемки очень прост в программировании, но может быть чрезвычайно нестабильным в численном отношении.
Стандартный способ решения этих проблем - использование подхода множественной стрельбы и решение соответствующей нелинейной системы уравнений стандартным нелинейным решателем. Список решателей для нелинейных систем уравнений см., Например,
http://www.mat.univie.ac.at/~neum/glopt/software_l.html#nonlin.
В качестве переменных вы принимаете состояния регулярной сетки во времени (обычно не требуется очень тонкая сетка), а в качестве уравнений - граничные условия и отображения, которые отображают переменные времени t на переменные времени t + h. Это дает столько уравнений, сколько переменных. Вам нужно только предоставить процедуры для оценки этого отображения для данной конфигурации состояний в сетке, а нелинейный решатель делает все остальное. (Возможно, вам нужно несколько отправных точек, если ваши начальные догадки плохи.)
В Википедии http://en.wikipedia.org/wiki/Direct_multiple_shooting_method есть полезное описание процесса, если приведенное выше описание недостаточно подробное для вас. Книга Стоера / Булирша, цитируемая там, дает полную информацию.
источник
Я не знаю, как это сделать в Python, но ключевое слово, которое вы хотите найти в литературе, - это «метод стрельбы». Это имя метода, который решает проблемы, которые имеют ограничения как начального, так и конечного значения.
источник
AUTO может решать двухточечные BVP, имеет интерфейс Python и относительно прост в установке. http://www.ma.hw.ac.uk/~gabriel/auto07/node6.html .
Если вы пойдете по пути желания сначала решить P (t) и передать его другому ODE в качестве входных данных, тогда эффективный способ установить это - использовать PyDSTool. PyDSTool очень легко установить на любую платформу, см. Http://pydstool.sf.net . По умолчанию он будет использовать только линейную интерполяцию, хотя для вашего ранее вычисленного решения (так что вычисляйте это с точным временным разрешением). Тем не менее, вы можете заставить PyDSTool перейти точно к желаемым временным точкам даже с помощью адаптивного интегратора (хотя это может быть неэффективным и привести к неточностям). Но с достаточно маленькими максимальными временными шагами, линейной интерполяцией и быстрым интегратором (встроенный Dopri) для второй системы означает, что вам подойдет «обычные» системы, подобные этой.
источник