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)=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 )
gdzie
a jest rozwiązaniem równania różniczkowego Riccati w czasie ciągłym (zauważ, że to jest macierzą)P ( t )
zastrzeżeniem
, , , , , , są podane.x 0 Q Q f R t f
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 f
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 )
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?
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.
źródło
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.
źródło
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.
źródło