Implémenter la solution de l'algèbre de Riccati en Python

Qu'est-ce que l'équation algébrique de Riccati (ARE)?

La formule suivante. Cependant, $ 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 sont des matrices symétriques à valeur constante positive, et $ A, B, Q, R $ sont donnés pour trouver $ P $.

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

Champ de scène où ARE apparaît, exemple

Il apparaît lors de la recherche du gain avec LQR de la théorie du contrôle moderne. LQR est la théorie du contrôle optimal, et le système $ \frac{dx}{dt} = Ax+Bu $ Quand peut être exprimé comme, la loi de contrôle qui satisfait $ \ min J = \ int (x ^ TQx + u ^ TRu) dt $ utilise $ P $ qui satisfait l'équation d'algèbre de Ricati ci-dessus. $ u=-R^{-1}B^TPx $ L'histoire que vous pouvez écrire.

résoudre

politique

La méthode d'Arimoto-Potter (expliquée dans la section suivante) sera implémentée et résolue. A ce moment, le problème des valeurs propres de la matrice sera résolu, mais cela utilise numpy ou similaire.

Méthode Arimoto / Potter

La procédure sera expliquée. Voir les livres, etc. pour la preuve.

1. Placez une file d'attente

Matrice $ H \ in \ mathbb R ^ {2n \ fois 2n} $ appelée Hamilton Matrix

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

loin.

2. Décomposition de la matrice de Hamilton par valeur propre

Il existe n valeurs propres de H dont la partie réelle est négative. Placez ceci comme $ \ lambda_1, \ lambda_2, ..., \ lambda_n $ et les vecteurs propres correspondants comme $ \ vec w_1, \ vec w_2, ..., \ vec w_n $.

3. Placer une matrice divisée en disposant les vecteurs propres

Utilisez ceci pour obtenir $ Y, Z \ in \ mathbb R ^ {n \ times n} $ $ \left[ \vec w_1 \vec w_2 ... \vec w_n \right] = \left[ \begin{array}{c} Y \newline Z \end{array} \right] $ loin.

4. P peut être trouvé

P=ZY^{-1}

la mise en oeuvre

import numpy as np
import numpy.linalg as LA

def solve_are(A, B, Q, R):
    # 1.Mettez la matrice de Hamilton
    H = np.block([[A.T, -B @ LA.inv(R) @ B.T],
                  [-Q , -A]])
    # 2.Décomposer les valeurs propres
    eigenvalue, w = LA.eig(H)
    # 3.Mettre une matrice auxiliaire
    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 est recherché
    return Z @ LA.inv(Y)

tester

Code de test

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("Côté gauche de l'équation algébrique de Riccati")
print(A@P + [email protected] + Q - P@[email protected](R)@B.T@P)

résultat

P
[[ 69.20010326 -66.19334596]
 [-66.19334596  67.7487967 ]]
Côté gauche de l'équation algébrique de Riccati
[[-1.13686838e-13  5.11590770e-13]
 [ 2.55795385e-13 -5.68434189e-13]]

Je l'ai résolu.

Recommended Posts

Implémenter la solution de l'algèbre de Riccati en Python
Trouvez la solution de l'équation d'ordre n avec python
Vérifiez le comportement du destroyer en Python
Implémenter une partie du processus en C ++
Le résultat de l'installation de python sur Anaconda
Principes de base pour exécuter NoxPlayer en Python
À la recherche du FizzBuzz le plus rapide en Python
Sortie du nombre de cœurs de processeur en Python
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Récupérer l'appelant d'une fonction en Python
Faites correspondre la distribution de chaque groupe en Python
Afficher le résultat du traitement de la géométrie en Python
Copiez la liste en Python
Découvrez la fraction de la valeur saisie en python
L'histoire de la lecture des données HSPICE en Python
[Note] À propos du rôle du trait de soulignement "_" en Python
Résolution d'équations de mouvement en Python (odeint)
Sortie sous la forme d'un tableau python
Mettre en œuvre des recommandations en Python
le zen de Python
Implémenter XENO avec python
Implémenter sum en Python
Implémenter Traceroute dans Python 3
Tapez Python pour implémenter l'expansion algébrique (1) ~ Monoïdes, groupes, anneaux, anneaux entiers ~
Comment obtenir le nombre de chiffres en Python
[python] Récupère la liste des classes définies dans le module
L'histoire de FileNotFound en Python open () mode = 'w'
Apprenez le modèle de conception «Chaîne de responsabilité» en Python
Obtenir la taille (nombre d'éléments) de Union Find en Python
Ne pas être conscient du contenu des données en python
Reproduire l'exemple d'exécution du chapitre 4 de Hajipata en Python
Utilisons les données ouvertes de "Mamebus" en Python
Implémentation de l'algorithme "Algorithm Picture Book" en Python3 (Heap Sort Edition)
[Python] Affiche toutes les combinaisons d'éléments de la liste
Obtenez l'URL de la destination de la redirection HTTP en Python
Un mémorandum sur la mise en œuvre des recommandations en Python
Reproduire l'exemple d'exécution du chapitre 5 de Hajipata en Python
Pour faire l'équivalent de Ruby ObjectSpace._id2ref en Python
Vérifiez la nature atrophique de la distribution de probabilité en Python
Vers la retraite de Python2
Trouver des erreurs en Python
Implémenter Naive Bayes dans Python 3.3
Implémenter d'anciens chiffrements en python
Implémenter Redis Mutex en Python
Implémenter l'extension en Python
Mettre en œuvre un RPC rapide en Python
Implémenter l'algorithme de Dijkstra en python
Implémenter le bot de discussion Slack en Python
Implémentation du tri rapide en Python
À propos des fonctionnalités de Python
Le pouvoir des pandas: Python
Essayez de gratter les données COVID-19 Tokyo avec Python
Découvrez la largeur apparente d'une chaîne en python
Mesurons le résultat de l'exécution du programme avec C ++, Java, Python.
[Mémo] Le mystère des instructions d'affectation cumulative dans les fonctions Python
Le résultat de l'apprentissage automatique des ingénieurs Java avec Python www
Calculez des millions de chiffres dans la racine carrée de 2 avec python