rozwiązywanie połączonych ODE z ograniczeniami wartości początkowej i końcowej

12

Istota mojego pytania jest następująca: mam system dwóch ODE. Jeden ma ograniczenie wartości początkowej, a drugi ograniczenie wartości końcowej. Można to traktować jako pojedynczy system z ograniczeniem wartości początkowej dla niektórych zmiennych i ograniczeniem wartości końcowej dla innych.

Oto szczegóły:

Próbuję użyć kontrolera LQR o skończonym horyzoncie czasowym do sterowania liniowym układem dynamicznym. Chciałbym nadal korzystać z ekosystemu Python.

System ma postać , z zastrzeżeniemx(0)=x0x˙(t)=Ax(t)+Bu(t)x(0)=x0

Rozwiązanie LQR generuje macierz tak że optymalne wejście sterujące u (t), liniowe w , wynosi .x ( t ) u ( t ) = K ( t ) x ( t )K(t)x(t)u(t)=K(t)x(t)

gdzieK(t)=R1BTP(t)

a jest rozwiązaniem równania różniczkowego Riccati w czasie ciągłym (zauważ, że to jest macierzą)P ( t )P(t)P(t)

P˙(t)=ATP(t)P(t)A+P(t)BR1BTP(t)+Q zastrzeżeniemP(tf)=Q

A , , , , , , są podane.x 0 Q Q f R t fBx0QQfRtf

W języku angielskim: masz jakiś dynamiczny system, który zaczyna się w stanie . Kontroler LQR generuje macierz sprzężenia zwrotnego, która ma być używana między czasem a ( jest powszechnie nazywany horyzontem czasowym problemu) 0 t f t fx00tftf

Zauważ, że dwa ODE są sprzężone tylko w jednym kierunku - rozwiązanie nie zależy od . Dlatego jednym ze sposobów rozwiązania problemu jest odwrócenie równania Riccati w celu przekształcenia problemu wartości końcowej w problem wartości początkowej i znalezienie rozwiązania numerycznego między czasem a przy użyciu standardowego integratora ODE. Następnie mogę użyć tego rozwiązania numerycznego, aby znaleźć . Dotyczy to mnie, ponieważ liczbowy solver ODE dla x (t) niekoniecznie będzie próbkować ODE w tym samym czasie, co czasy w rozwiązywaniu liczbowym dla $ P (t). Może istnieje jakiś sprytny sposób, aby to egzekwować.x ( t ) 0 t f x ( t )P(t)x(t)0tfx(t)

Innym sposobem przewidywania rozwiązania problemu jest wspólne rozwiązanie systemu, ale nie wiem, jak poradzić sobie z połączeniem ograniczeń wartości początkowej i końcowej. Czy te problemy są trudne obliczeniowo do rozwiązania? Czy mogę to zrobić w SciPy / Python?

Gus
źródło

Odpowiedzi:

8

Nie zgadzam się z innymi odpowiedziami. Ponieważ masz tylko jednokierunkowe sprzężenie między problemami czasu do tyłu i do przodu, o wiele bardziej efektywne będzie ich rozwiązywanie w kolejności, jak to początkowo zaproponujesz. Po prostu potrzebujesz rozwiązania które można ocenić w dowolnym momencie . t [ 0 , t f ]P(t)t[0,tf]

Możesz to zrobić interpolując wartości wyjściowe . Polecam użyć metody Runge-Kutta, która obsługuje gęste wyjście. Na przykład scipy.integrate.ode.dopri5opiera się na takiej metodzie. Powinieneś być w stanie określić bardzo dokładnie rozłożone czasy wyjściowe bez zmuszania integratora do podejmowania bardzo małych kroków (przy założeniu, że scipy interfejs do niego jest poprawnie zaimplementowany).

David Ketcheson
źródło
Tak, to jest rzeczywiście prostsze. Możesz użyć dowolnej metody do wygenerowania i w dowolnych punktach, które integrator uzna za konieczne, i interpoluj pomiędzy sześciennym splajnem Hermite, jeśli dokładność O (h ^ 4) jest wystarczająca. P ( t )P(t)P(t)
Arnold Neumaier
6

Nazywa się to problemem dwupunktowej wartości granicznej i jest dobrze zbadane.

Metoda fotografowania jest bardzo prosta do zaprogramowania, ale może być bardzo niestabilna numerycznie.

Standardowym sposobem rozwiązania tych problemów jest zastosowanie metody wielokrotnego fotografowania i rozwiązanie odpowiedniego nieliniowego układu równań za pomocą standardowego rozwiązania nieliniowego. Aby uzyskać listę solverów dla nieliniowych układów równań, patrz np.
Http://www.mat.univie.ac.at/~neum/glopt/software_l.html#nonlin

Jako zmienne przyjmuje się stany na regularnej siatce w czasie (zwykle nie jest potrzebna bardzo drobna siatka), a jako równania warunki brzegowe i odwzorowania odwzorowujące zmienne czasowe t na zmienne czasowe t + h. Daje to tyle równań, ile zmiennych. Wystarczy podać procedury oceny tego mapowania dla danej konfiguracji stanów w siatce, a solver nieliniowy robi wszystko inne. (Być może potrzebujesz wielu punktów początkowych, jeśli początkowe przypuszczenia są słabe.)

Wikipedia http://en.wikipedia.org/wiki/Direct_multiple_shooting_method ma przydatny opis tego procesu, jeśli powyższy opis nie jest dla ciebie wystarczająco szczegółowy. Cytowana tam książka Stoer / Bulirsch podaje pełne szczegóły.

Arnold Neumaier
źródło
5

Nie wiem, jak to zrobić w Pythonie, ale słowem kluczowym, którego szukasz w literaturze, jest „metoda strzelania”. To nazwa metody, która rozwiązuje problemy, które mają zarówno początkowe, jak i końcowe ograniczenia wartości.

Wolfgang Bangerth
źródło
1

AUTO może rozwiązać dwupunktowe BVP i ma interfejs Pythona i jest stosunkowo łatwy w instalacji. http://www.ma.hw.ac.uk/~gabriel/auto07/node6.html .

Jeśli pójdziesz drogą, aby najpierw rozwiązać P (t) i podasz go do drugiego ODE jako danych wejściowych, to skutecznym sposobem skonfigurowania tego jest użycie PyDSTool. PyDSTool jest bardzo łatwy do zainstalowania na dowolnej platformie, patrz http://pydstool.sf.net . Będzie jednak domyślnie używał interpolacji liniowej tylko w przypadku wcześniej obliczonego rozwiązania (oblicz go z dokładną rozdzielczością czasu). Można jednak zmusić PyDSTool do przejścia do dokładnie pożądanych punktów czasowych, nawet za pomocą integratora adaptacyjnego (chociaż może to być nieefektywne i prowadzić do nieścisłości). Ale przy wystarczająco małych maksymalnych krokach czasowych interpolacja liniowa i szybki integrator (wbudowany Dopri) dla drugiego systemu oznacza, że ​​będzie dobrze w przypadku „zwykłych” systemów takich jak ten.

RHC
źródło