вирішення пов'язаних ODE з початковими значеннями та кінцевими значеннями


12

Суть мого питання полягає в наступному: у мене є система з двох ОДЕ. Один має обмеження початкового значення, а інший - обмеження кінцевого значення. Це можна розглядати як єдину систему з обмеженням початкового значення для деяких змінних і обмеженням кінцевого значення для інших.

Ось деталі:

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

Система має форму , за умовиx(0)=x0х˙(т)=Ах(т)+Бу(т)х(0)=х0

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

де K(t)=R1BТП(т)

і П(т) - рішення диференціального рівняння Ріккаті безперервного часу (зауважимо, що цей П(т) є матрицею)

П˙(т)=-АТП(т)-П(т)А+П(т)БR-1БТП(т)+Q умови П(тf)=Q

А , Б , х0 , Q , Qf , R , тf - всі наведені.

Англійською мовою: у вас є динамічна система, яка запускається у стані . Контролер LQR генерує матрицю зворотного зв'язку для використання між часом і ( зазвичай називають часовим горизонтом проблеми) 0 t f t fх00тfтf

Зауважте, що два ODE з'єднані лише в одному напрямку - рішення не залежить від . Тому один із способів вирішити задачу - це повернути рівняння Ріккаті, щоб перетворити задачу остаточного значення в задачу початкового значення і знайти числове рішення між часом і за допомогою стандартного інтегратора ODE. Тоді я можу використовувати це числове рішення, щоб знайти . Це стосується мене, тому що числовий вирішувач ODE для x (t) не обов'язково буде вибіркою ODE одночасно з часом у числовому рішенні до $ P (t). Можливо, є якийсь розумний спосіб це застосувати.П(т)х(т)0тfх(т)

Інший спосіб, який я передбачаю вирішити проблему, - це вирішити систему разом, але я не знаю, як боротися з поєднанням обмежень початкового значення та кінцевого значення. Ці проблеми обчислювально важко вирішити? Чи можу я це зробити в SciPy / Python?

Відповіді:


8

Я не згоден з іншими відповідями. Оскільки у вас є лише одностороння зв'язок між проблемами зворотного і прямого часу, вирішити їх буде послідовно, як ви спершу пропонуєте. Вам просто потрібне рішення яке можна оцінити в будь-який час . П(т)т[0,тf]

Це можна зробити, інтерполюючи між вихідними значеннями . Я рекомендую використовувати метод Runge-Kutta, який підтримує щільний вихід. Наприклад, scipy.integrate.ode.dopri5заснований на такому методі. Таким чином, ви повинні мати можливість задати дуже точні відстані часу виведення, не змушуючи інтегратор робити дуже невеликі кроки (якщо припустити, що інтерфейс scipy до нього реалізований правильно).


Так, це справді простіше. Ви можете використовувати будь-який метод для генерації і в будь-яких точках, які інтегратор вважає необхідними, і інтерполювати між собою кубічний сплав Герміта, якщо точності O (h ^ 4) достатньо. П(т)П'(т)
Арнольд Ноймаєр

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 вбудований) для другої системи означає, що ви будете добре для "звичайних" систем, як ця.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.