OpenGoddard ist eine Python-Bibliothek, um numerische Lösungen für meine nichtlinearen Probleme der optimalen Steuerung zu finden.
https://github.com/istellartech/OpenGoddard https://istellartech.github.io/OpenGoddard/
Hier wird ein Beispiel für die tatsächliche Verwendung erläutert.
Verwendung von OpenGoddard 1 ← Jetzt hier Verwendung von OpenGoddard 2 Verwendung von OpenGoddard 3 Öffnen Sie Goddard How to use 4
Optimale Steuerungsprobleme sind eingeschränkte Optimierungsprobleme, und Optimierungsprobleme sind [Wikipedia](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%81%A9%E5% Wie in 8C% 96% E5% 95% 8F% E9% A1% 8C) beschrieben, gibt es mehrere Typen, abhängig von der Form der Bewertungsfunktion und dem Vorhandensein oder Fehlen von Einschränkungen. OpenGoddard ist eine Bibliothek zur Lösung des Problems der nichtlinearen Programmierung (NLP) = nichtlinearer optimaler Steuerung. Nichtlineares Problem der optimalen Steuerung = Nichtlineare Programmierung → [Sequentielle Sekundärprogrammierung](https://ja.wikipedia.org/wiki/%E9%80%90%E6%AC%A1%E4%BA%8C%E6% AC% A1% E8% A8% 88% E7% 94% BB% E6% B3% 95) (sequentielle quadratische Programmierung, SPQ). Wenn Sie in OpenGoddard die Bewertungsfunktion, die Bewegungsgleichung, die Einschränkungsbedingung und die Berechnungsbedingung eingeben, fügen Sie die Einschränkungsbedingung der Methode mit dem Namen Pseudospektralmethode hinzu und fügen Sie die Einschränkungsbedingung in Pythons Scipy hinzu. Es wird durch den sequentiellen sekundären Programmierlöser (SLSQP) gelöst. Der Benutzer muss nur die Bewertungsfunktion, die kinetische Gleichung (normale Differentialgleichung), die Randbedingung und die Berechnungsbedingung eingeben, ohne die darin enthaltene Methode zu betrachten.
Ein klassisches Beispiel für ein Problem der optimalen Steuerung am Beispiel des berühmten Problems des schnellsten Abstiegs. Finden Sie die Kurve (Umlaufbahn), die es dem Ball (Qualitätspunkt) ermöglicht, bei Vorhandensein der Schwerkraft die weiteste Entfernung zu erreichen, vorausgesetzt, es gibt keine Reibung oder Luftwiderstand. Es wird herauskommen, wenn Sie googeln, aber diese Kurve wird eine Zykloiden-Kurve sein. In einfachen Fällen wie dem typischen Problem des schnellsten Abstiegs wird üblicherweise die indirekte Methode (Variationsmethode) verwendet. Dies liegt daran, dass es einfach ist, eine analytische Lösung durch Konvertieren mathematischer Formeln zu erhalten. Bei reichlich vorhandenen Computerressourcen ist die direkte Methode jedoch für den "praktischen Gebrauch" realistischer. Also werde ich meine Arbeit Open Goddard verwenden, eine Bibliothek der direkten Methode, insbesondere der Pseudospektralmethode.
Schreiben Sie das Python-Skript wie in der README-Datei von github beschrieben gemäß dem folgenden Ablauf.
Insbesondere müssen Sie im Voraus über den Teil nachdenken, in dem Sie die Bewegungsgleichung, die Randbedingungen und die Bewertungsfunktion aufschreiben.
Die Bewegungsgleichung lautet wie folgt. (Beachten Sie, dass die Formel je nach Literatur je nach Winkel unterschiedlich ist.)
\dot{x} = v \sin{\theta} \\
\dot{y} = v \cos{\theta} \\
\dot{v} = g \cos{\theta}
Einschränkungsbedingungen geben Hinweise wie Anfangsbedingungen, Beendigungsbedingungen und Dinge, die physikalisch nicht seltsam sind. Hier ist die Bedingung, dass $ x = 1 $ erreicht ist und y überall sein kann.
\theta \geq 0 \\
[x(t_0), y(t_0), v(t_0), t0, x(t_f)] = [0, 0, 0, 0, 1] \\
t_f \geq 0
Enthält die zu minimierende Funktion. Hier wollen wir die Route in der "kürzesten Zeit" finden, also wollen wir die Zeit minimieren.
J = t_f
Um das Optimierungsproblem zu lösen, müssen die Zustandsvariablen und Steuervariablen initialisiert werden. Wenn kein Anfangswert festgelegt ist, werden alle als 0 initialisiert. Wenn Sie einen zu seltsamen Wert eingeben, geht die Lösung auseinander. Insbesondere wenn Sie den Anfangswert eingeben, der gegen die Nullprozent- oder die Rückhaltebedingung verstößt, kann die Lösung nicht erhalten werden.
Um die Leistungsfähigkeit der direkten Methode zu verstehen, fügen wir dem Problem des schnellsten Abstiegs einige zusätzliche Bedingungen hinzu. Fügen wir die Bedingung hinzu, dass es einen Bereich (Wand) gibt, in den der Ball (Qualitätspunkt) nicht eintreten sollte. Setzen Sie Folgendes in die Einschränkungsbedingung ein.
y \leq x \tan{\theta_0} + h_0
Auf der anderen Seite kann es durch die Variantenmethode gelöst werden, aber die analytische Lösung wird erst herauskommen, wenn die mathematische Formel manipuliert wird. Wie OpenGoddard ist die direkte Methode eine numerische Lösung, die definitiv nicht optimal ist wie die analytische Lösung, aber die Lösung ist einfach zu finden. Bitte beachten Sie jedoch, dass es sich nicht um eine globale optimale Lösung handelt, sondern um eine lokale optimale Lösung. (Ab Version 1.0.0 nicht implementiert, aber es gibt auch eine Methode, die das Optimum bestätigen kann.)
Sie können sehen, dass die Spur erstellt wird, während Sie den Rückhaltezustand der Wand beobachten. Dies unterscheidet sich von der analytischen Lösung, die mit der Variantenmethode gelöst wird. Dies ist auf die Konvergenzschwelle oder die unzureichende Anzahl von Teilungspunkten zurückzuführen.
Stellen Sie sich als tatsächliche Anwendung (?) Die Entfernung zwischen Tokio und Osaka für das Problem des schnellsten Abstiegs vor und berechnen Sie, welche Art von Tunnel gegraben werden sollte, um die schnellste Geschwindigkeit mit einer Schwerkraftbeschleunigung von 9,8 m / s2 und ohne Reibung und Luftwiderstand in einer Entfernung von 600 km zu erreichen. Ich werde versuchen.
Lassen Sie uns die Entfernung auf 600 km ändern und berechnen, wie sie ist.
class Ball:
def __init__(self):
self.g = 9.8 # gravity [m/s2]
self.l = 600000 # goal [m]
self.h = 300000 # depth limit [m]
Es war nicht gut Der Wert der Steuervariablen flattert und das Ergebnis ist nicht anständig. Warum? Dies liegt an den Variablen, die intern berechnet werden.
prob.plot()
Wenn Sie den obigen Befehl nach der Ausführung auf ipython oder jupyter notebook ausführen, wird die Plotmethode der Probleminstanz von OpenGoddard.optimize aufgerufen, und Sie können den Wert der Variablen visualisieren, die in den Optimierungslöser eingetaucht ist.
Von links nach rechts bedeutet dies Zustandsvariablen, Steuervariablen und Zeit (Punkte). Der am weitesten links stehende Teil ist der Wert von x. Die Reihenfolge der Werte ist Hunderttausende. Andererseits ist v mehrere Tausend und der Wert des Wegwinkels & thgr; liegt bei 0 bis 3. Sequentielle sekundäre Programmierlöser sind schlecht gelaunt, wenn die Reihenfolge für jede Variable nicht korrekt ist. Der Grund dafür ist, dass der Computer versucht, die Auswertungsfunktion zu minimieren, indem er mit den visualisierten internen Variablen spielt, ohne die Bedeutung der Variablen zu kennen. Wenn jedoch Variablen vorhanden sind, die für die Auswertungsfunktion zu effektiv und zu ineffektiv sind, funktioniert dies nicht.
Daher wird eine Normalisierung durchgeführt, um die Reihenfolge der Variablen auszurichten. Stellen Sie die Statusvariable, die Steuervariable und die Zeit so ein, dass die Reihenfolge ausgerichtet ist. Eine gute Faustregel ist, die Variablen zwischen -10 und 10 zu halten.
unit_x = 300000
unit_y = 100000
unit_t = 100
unit_v = unit_x / unit_t
prob.set_unit_states_all_section(0, unit_x)
prob.set_unit_states_all_section(1, unit_y)
prob.set_unit_states_all_section(2, unit_v)
prob.set_unit_controls_all_section(0, 1.0)
prob.set_unit_time(unit_t)
Die internen Variablen sind jetzt normalisiert.
Dies gibt Ihnen eine Lösung. Es kam in 10 Minuten und 20 Sekunden mit einer maximalen Tiefe von 183 km und einer maximalen Geschwindigkeit von Mach 5,5 (1893 m / s) an. In diesem Tunnel ist es notwendig, einem fast freien Fall bis zu etwa 100 km unter der Erde standzuhalten, und da das tiefste von der Menschheit gegrabene Loch 12 km zu sein scheint, ist es notwendig, mehr als das Zehnfache davon zu graben. Tut mir leid, unrealistisch.
Recommended Posts