Implementieren Sie die Lösung der Riccati-Algebra in Python

Was ist die algebraische Riccati-Gleichung (ARE)?

Die folgende Formel. $ A, Q, P \ in \ mathbb R ^ {n \ times n}, B \ in \ mathbb R ^ {n \ times m}, R \ in \ mathbb R ^ {m \ times m} $ , Q, R sind positive symmetrische Matrizen mit konstantem Wert, und $ A, B, Q, R $ werden angegeben, um $ P $ zu finden.

A P + P A^T + Q - P B R^{-1} B^T P = 0

Beispiel: Szenenfeld, in dem ARE angezeigt wird

Es erscheint, wenn der Gewinn mit LQR der modernen Steuerungstheorie gefunden wird. LQR ist die optimale Steuerungstheorie und das System $ \frac{dx}{dt} = Ax+Bu $ Wenn ausgedrückt werden kann, verwendet das Kontrollgesetz, das $ \ min J = \ int (x ^ TQx + u ^ TRu) dt $ erfüllt, $ P , das die obige Ricati-Algebra-Gleichung erfüllt. $ u=-R^{-1}B^TPx $$ Die Geschichte, die Sie schreiben können.

lösen

Politik

Die Methode von Arimoto-Potter (im nächsten Abschnitt erläutert) wird implementiert und gelöst. Zu diesem Zeitpunkt wird das Eigenwertproblem der Matrix gelöst, dies verwendet jedoch Numpy oder dergleichen.

Arimoto / Potter-Methode

Die Vorgehensweise wird erklärt. Siehe Bücher usw. als Beweis.

1. Stellen Sie eine Warteschlange auf

Matrix $ H \ in \ mathbb R ^ {2n \ times 2n} $ heißt Hamilton Matrix

H=\left[ \begin{array}{cc} A^T & -B R^{-1} B^T \newline -Q & -A \end{array} \right]

weit.

2. Zerlegung der Hamilton-Matrix nach Eigenwert

Es gibt n Eigenwerte von H, deren Realteil negativ ist. Platzieren Sie dies als $ \ lambda_1, \ lambda_2, ..., \ lambda_n $ und die entsprechenden Eigenvektoren als $ \ vec w_1, \ vec w_2, ..., \ vec w_n $.

3. Platzieren Sie eine Matrix, die durch Anordnen der Eigenvektoren geteilt wird

Verwenden Sie dies, um $ Y, Z \ in \ mathbb R ^ {n \ times n} $ zu erhalten $ \left[ \vec w_1 \vec w_2 ... \vec w_n \right] = \left[ \begin{array}{c} Y \newline Z \end{array} \right] $ weit.

4. P kann gefunden werden

P=ZY^{-1}

Implementierung

import numpy as np
import numpy.linalg as LA

def solve_are(A, B, Q, R):
    # 1.Setzen Sie die Hamilton-Matrix
    H = np.block([[A.T, -B @ LA.inv(R) @ B.T],
                  [-Q , -A]])
    # 2.Eigenwerte zerlegen
    eigenvalue, w = LA.eig(H)
    # 3.Setzen Sie eine Hilfsmatrix
    Y_, Z_ = [], []
    n = len(w[0])//2
    for i in range(2*n):
        if eigenvalue[i].real < 0.0:
            Y_.append(w.T[i][:n])
            Z_.append(w.T[i][n:])
    Y = np.array(Y_).T
    Z = np.array(Z_).T
    # 4.P wird gesucht
    return Z @ LA.inv(Y)

Prüfung

Testcode

A = np.array([[3., 1.],[0., 1.]])
B = np.array([[1.2], [1.]])
Q = np.array([[1., 0.2], [0.2, 1.0]])
R = np.array([[1.]])
P = solve_are(A, B, Q, R)
print("P")
print(P)
print("Linke Seite der algebraischen Riccati-Gleichung")
print(A@P + [email protected] + Q - P@[email protected](R)@B.T@P)

Ergebnis

P
[[ 69.20010326 -66.19334596]
 [-66.19334596  67.7487967 ]]
Linke Seite der algebraischen Riccati-Gleichung
[[-1.13686838e-13  5.11590770e-13]
 [ 2.55795385e-13 -5.68434189e-13]]

Ich habe es gelöst.

Recommended Posts

Implementieren Sie die Lösung der Riccati-Algebra in Python
Finden Sie die Lösung der Gleichung n-ter Ordnung mit Python
Überprüfen Sie das Verhalten des Zerstörers in Python
Implementieren Sie einen Teil des Prozesses in C ++
Das Ergebnis der Installation von Python auf Anaconda
Grundlagen zum Ausführen von NoxPlayer in Python
Auf der Suche nach dem schnellsten FizzBuzz in Python
Geben Sie die Anzahl der CPU-Kerne in Python aus
[Python] Sortieren Sie die Liste von pathlib.Path in natürlicher Reihenfolge
Holen Sie sich den Aufrufer einer Funktion in Python
Passen Sie die Verteilung jeder Gruppe in Python an
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Kopieren Sie die Liste in Python
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
Die Geschichte des Lesens von HSPICE-Daten in Python
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Lösen von Bewegungsgleichungen in Python (odeint)
Ausgabe in Form eines Python-Arrays
der Zen von Python
Implementieren Sie XENO mit Python
Implementieren Sie sum in Python
Implementieren Sie Traceroute in Python 3
Geben Sie Python ein, um die algebraische Erweiterung zu implementieren (1) ~ Monoide, Gruppen, Ringe, ganzzahlige Ringe ~
So ermitteln Sie die Anzahl der Stellen in Python
[Python] Ruft die Liste der im Modul definierten Klassen ab
Die Geschichte von FileNotFound im Python open () -Modus = 'w'
Lernen Sie das Entwurfsmuster "Chain of Responsibility" in Python
Ermitteln Sie die Größe (Anzahl der Elemente) von Union Find in Python
Den Inhalt der Daten in Python nicht kennen
Reproduzieren Sie das Ausführungsbeispiel von Kapitel 4 von Hajipata in Python
Verwenden wir die offenen Daten von "Mamebus" in Python
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Heap Sort Edition)
[Python] Gibt alle Kombinationen von Elementen in der Liste aus
Rufen Sie die URL des HTTP-Umleitungsziels in Python ab
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Reproduzieren Sie das Ausführungsbeispiel von Kapitel 5 von Hajipata in Python
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Überprüfen Sie die atrophische Natur der Wahrscheinlichkeitsverteilung in Python
Auf dem Weg zum Ruhestand von Python2
Finde Fehler in Python
Implementieren Sie Naive Bayes in Python 3.3
Implementieren Sie alte Chiffren in Python
Implementieren Sie Redis Mutex in Python
Implementieren Sie die Erweiterung in Python
Implementieren Sie schnelles RPC in Python
Implementieren Sie den Dijkstra-Algorithmus in Python
Implementieren Sie den Slack Chat Bot in Python
Implementierung der schnellen Sortierung in Python
Über die Funktionen von Python
Die Kraft der Pandas: Python
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
Finden Sie die scheinbare Breite einer Zeichenfolge in Python heraus
Lassen Sie uns das Ausführungsergebnis des Programms mit C ++, Java, Python messen.
[Memo] Das Geheimnis kumulativer Zuweisungsanweisungen in Python-Funktionen
Das Ergebnis des maschinellen Lernens von Java-Ingenieuren mit Python www
Berechnen Sie mit Python Millionen von Stellen in der Quadratwurzel von 2