Lösen gekoppelter ODEs mit Anfangs- und Endwertbeschränkungen


11

Das Wesentliche meiner Frage ist das Folgende: Ich habe ein System von zwei ODEs. Eine hat eine Anfangswertbeschränkung und die andere hat eine Endwertbeschränkung. Dies kann als ein einzelnes System mit einer Anfangswertbeschränkung für einige Variablen und einer Endwertbeschränkung für die anderen Variablen betrachtet werden.

Hier sind die Details:

Ich versuche, einen zeitkontinuierlichen LQR-Controller mit endlichem Horizont zu verwenden, um ein lineares dynamisches System anzutreiben. Ich möchte das Python-Ökosystem weiterhin nutzen.

Das System hat die Form , vorbehaltlich x ( 0 ) = x 0x˙(t)=Ax(t)+Bu(t)x(0)=x0

Die LQR-Lösung erzeugt eine Matrix so dass der optimale Steuereingang u (t), linear in x ( t ) , u ( t ) = K ( t ) x ( t ) ist .K(t)x(t)u(t)=K(t)x(t)

wobei K(t)=R1BTP(t)

und ist die Lösung einer kontinuierlichen zeitlichen Riccati-Differentialgleichung (man beachte, dass dieses P ( t ) eine Matrix ist)P(t)P(t)

P˙(t)=ATP(t)P(t)A+P(t)BR1BTP(t)+QP(tf)=Q

ABx0QQfRtf

x00tftf

P(t)x(t)0tfx(t). Dies betrifft mich, weil der numerische ODE-Löser für x (t) die ODE nicht unbedingt gleichzeitig mit den Zeiten in der numerischen Lösung für $ P (t) abtastet. Vielleicht gibt es eine clevere Möglichkeit, dies durchzusetzen.

Die andere Möglichkeit, das Problem zu lösen, besteht darin, das System gemeinsam zu lösen, aber ich weiß nicht, wie ich mit der Mischung aus Anfangs- und Endwertbeschränkungen umgehen soll. Sind diese Probleme rechenintensiv zu lösen? Kann ich das in SciPy / Python machen?

Antworten:


8

P(t)t[0,tf]

Sie können dies tun, indem Sie zwischen den Ausgabewerten interpolieren . Ich empfehle die Verwendung einer Runge-Kutta-Methode, die eine dichte Ausgabe unterstützt. Zum Beispiel scipy.integrate.ode.dopri5basiert auf einer solchen Methode. Sie sollten also in der Lage sein, sehr fein verteilte Ausgabezeiten anzugeben, ohne den Integrator zu sehr kleinen Schritten zu zwingen (vorausgesetzt, die Scipy-Schnittstelle dazu ist korrekt implementiert).


P(t)P(t)

6

Dies wird als Zweipunkt-Randwertproblem bezeichnet und ist gut untersucht.

Die Aufnahmemethode ist sehr einfach zu programmieren, kann jedoch numerisch äußerst instabil sein.

Die Standardmethode zur Lösung dieser Probleme besteht darin, einen Mehrfachaufnahmeansatz zu verwenden und das entsprechende nichtlineare Gleichungssystem mit einem nichtlinearen Standardlöser zu lösen. Eine Liste der Löser für nichtlineare Gleichungssysteme finden Sie beispielsweise unter
http://www.mat.univie.ac.at/~neum/glopt/software_l.html#nonlin

Sie nehmen als Variablen die Zustände in einem regulären Zeitgitter (normalerweise wird kein sehr feines Gitter benötigt) und als Gleichungen die Randbedingungen und die Zuordnungen, die die Zeitvariablen t auf die Zeitvariablen t + h abbilden. Dies ergibt so viele Gleichungen wie Variablen. Sie müssen nur die Routinen zum Auswerten dieser Zuordnung für eine bestimmte Konfiguration von Zuständen im Raster bereitstellen, und der nichtlineare Löser erledigt alles andere. (Vielleicht benötigen Sie mehrere Ausgangspunkte, wenn Ihre anfänglichen Vermutungen schlecht sind.)

Wikipedia http://en.wikipedia.org/wiki/Direct_multiple_shooting_method enthält eine nützliche Beschreibung des Prozesses, wenn die obige Beschreibung für Sie nicht detailliert genug ist. Das dort zitierte Buch von Stoer / Bulirsch enthält vollständige Details.


5

Ich weiß nicht, wie es in Python geht, aber das Schlüsselwort, nach dem Sie in der Literatur suchen möchten, ist die "Aufnahmemethode". Dies ist der Name einer Methode, die Probleme löst, für die sowohl Anfangs- als auch Endwertbeschränkungen gelten.


1

AUTO kann Zwei-Punkt-BVPs lösen und verfügt über eine Python-Schnittstelle und ist relativ einfach zu installieren. http://www.ma.hw.ac.uk/~gabriel/auto07/node6.html .

Wenn Sie zuerst P (t) lösen und es als Eingabe an die andere ODE weiterleiten möchten, können Sie PyDSTool effizient einrichten. PyDSTool ist auf jeder Plattform sehr einfach zu installieren, siehe http://pydstool.sf.net . Standardmäßig wird jedoch nur die lineare Interpolation für Ihre zuvor berechnete Lösung verwendet (berechnen Sie diese also mit feiner Zeitauflösung). Sie können PyDSTool jedoch auch mit einem adaptiven Integrator zwingen, genau die gewünschten Zeitpunkte zu erreichen (obwohl dies ineffizient sein und zu Ungenauigkeiten führen kann). Aber mit ausreichend kleinen maximalen Zeitschritten, der linearen Interpolation und einem schnellen Integrator (Dopri ist eingebaut) für das zweite System bedeutet dies, dass Sie für "normale" Systeme wie dieses in Ordnung sind.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.