Verwendung der OpenGoddard 1-Python-Bibliothek zur nichtlinearen optimalen Steuerung und Trajektoriengenerierung

Verwendung von Open Goddard 1

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

Optimierungsproblem

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.

Schnellstes Abstiegsproblem

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.

  1. Beschreibung der Methode und Variablen der Objektklasse, die die Umlaufbahn optimiert
  2. Funktion der Bewegungsgleichung
  3. Einschränkungsfunktion
  4. Bewertungsfunktionsfunktion
  5. Probleminstanzgenerierung
  6. Generieren einer Objektinstanz, die die Flugbahn optimiert
  7. Einheiteneinstellung für die Normalisierung der Optimierungsvariablen (optional)
  8. Anfangswertschätzung und Installation (optional)
  9. Funktionsspezifikation und Knotenbedingungsspezifikation
  10. solve
  11. Nachbearbeitung (Visualisierung)

Insbesondere müssen Sie im Voraus über den Teil nachdenken, in dem Sie die Bewegungsgleichung, die Randbedingungen und die Bewertungsfunktion aufschreiben.

Bewegungsgleichung

Die Bewegungsgleichung lautet wie folgt. (Beachten Sie, dass die Formel je nach Literatur je nach Winkel unterschiedlich ist.) 1_nomal.png

\dot{x} = v \sin{\theta} \\
\dot{y} = v \cos{\theta} \\
\dot{v} = g \cos{\theta} 

Rückhaltebedingung

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

Bewertungsfunktion

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

Ergebnis

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.

1_nomal1.png

Schnellstes Abstiegsproblem mit Orbitalrückhaltung

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.)

Ergebnis

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.

1_wall.png

Das Problem, Tokio und Osaka mit einem Tunnel ohne Reibung und Luftwiderstand zu verbinden

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]

1_Bad_Tokyo.png

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.

1_Bad_plot.png

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.

1_Tokyo_.png

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

OpenGoddard Verwendung der 2-Python-Bibliothek zur nichtlinearen optimalen Steuerung und Trajektoriengenerierung
Verwendung der OpenGoddard 3-Python-Bibliothek zur nichtlinearen optimalen Steuerung und Trajektoriengenerierung
Verwendung der OpenGoddard 4-Python-Bibliothek zur nichtlinearen optimalen Steuerung und Trajektoriengenerierung
Verwendung der OpenGoddard 1-Python-Bibliothek zur nichtlinearen optimalen Steuerung und Trajektoriengenerierung
[Python] Verwendung von Matplotlib, einer Bibliothek zum Zeichnen von Diagrammen
So installieren und verwenden Sie pandas_datareader [Python]
Python: Verwendung von Einheimischen () und Globalen ()
Verwendung von "deque" für Python-Daten
Verwendung von Python zip und Aufzählung
Verwendung ist und == in Python
Verwendung der C-Bibliothek in Python
Verwendung der Python-Bildbibliothek in der Python3-Serie
[Python] Verwendung von Hash-Funktion und Taple.
Tipps für diejenigen, die verwirrt sind, wie man is und == in Python verwendet
Verwendung von OAuth und API für Dienstkonten mit Google API Client für Python
[BigQuery] Verwendung der BigQuery-API für die Python-Tabellenerstellung-
[Für Anfänger] Wie man den Befehl say mit Python benutzt!
[Python] [Django] Verwendung des Auswahlfelds und Hinzufügen von Optionen
[Python] Verwendung der Diagrammerstellungsbibliothek Altair
Python # So überprüfen Sie Typ und Typ für Super-Anfänger
python3: Verwendung der Flasche (2)
[Python] Verwendung von Liste 1
Python: Wie man pydub benutzt
[Python] Verwendung von checkio
[Python] Verwendung von input ()
[Python] Verwendung von virtualenv
python3: Verwendung der Flasche (3)
python3: Wie man eine Flasche benutzt
Verwendung von Python-Bytes
[Einführung in die Udemy Python3 + -Anwendung] 36. Verwendung von In und Not
[Python] Zusammenfassung der Verwendung von Split- und Join-Funktionen
Wie nutzt man maschinelles Lernen für die Arbeit? 03_Python-Codierungsverfahren
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
Ich wusste nicht, wie ich die [Python] für die Anweisung verwenden sollte
Python: So verwenden Sie Async mit
[Python] Verwendung der Pandas-Serie
Verwendung von .bash_profile und .bashrc
So installieren und verwenden Sie Graphviz
Wie man MySQL mit Python benutzt
Verwendung der Python-API von OpenPose
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
Verwendung der Zip-Funktion von Python
[Python] Verwendung der Typetalk-API
Verwendung von Funktionen in separaten Dateien Perl-Version und Python-Version
Verwendung von Umgebungsvariablen für Serverless Framework und Python und Verwaltung von Phasen
Verwendung eines externen Editors für die Python-Entwicklung mit Grasshopper
[Einführung in Python] Verwendung des Booleschen Operators (und ・ oder ・ nicht)
[Python] Zusammenfassung der Verwendung von Pandas
[Einführung in Python] Wie verwende ich eine Klasse in Python?
[Python] Verwendung von __command__, Funktionserklärung
[Python] Verwendung von import sys sys.argv
[Python of Hikari-] Kapitel 05-09 Steuerungssyntax (Verwendung von for-Anweisung und while-Anweisung ordnungsgemäß)
Memorandum über die Verwendung von Gremlin Python
[Python2.7] Zusammenfassung der Verwendung von unittest
[Python] Verwendung der Aufzählungsfunktion (Indexnummer und Element extrahieren)
Verwendung von __slots__ in der Python-Klasse