[PYTHON] Algèbre linéaire pour la programmation Chapitre 4 (valeurs uniques, vecteurs propres)

Quand ce sera utile

Je veux savoir si le modèle d'auto-retour devient incontrôlable!

Qu'est-ce qu'un modèle d'auto-retour?

Par exemple, $ ξ (t) $ d'aujourd'hui est $ ξ (t-1) $ d'hier, $ ξ (t-2) $ de papa et la veille de cela $ ξ (t-3) $. À partir de $ u (t) $, supposons que vous décidiez:

ξ(t)=-0.5ξ(t-1)+0.34ξ(t-2)+0.08ξ(t-3)+2u(t)

Exprimant cela sous forme de matrice,

x(t)=
\begin{pmatrix}
-0.5&0.34&0.08\\
1&0&0\\
0&1&0
\end{pmatrix} \times
x(t-1)

Ce sera. Depuis, cela s'est généralisé

x(t)=Ax(t-1)

Poignées.

Pour une dimension

x(t)=7x(t-1)

Ceci est multiplié par 7 à chaque fois que $ t $ augmente, donc

x(t)=7^tx(0)

Ensuite, quand $ t → ∞ $, cela devient incontrôlable car c'est $ 7 ^ t → ∞ $. Par contre, si le coefficient est de 0,2 $, il n'y aura pas d'emballement. C'est facile, non?

Pour matrice diagonale

x(t)=
\begin{pmatrix}
5&0&0\\
0&-3&0\\
0&0&0.8
\end{pmatrix} \times
x(t-1)

Dans le cas de, la puissance de la matrice diagonale doit uniquement être la puissance du composant tel quel.

x(t)=
\begin{pmatrix}
5&0&0\\
0&-3&0\\
0&0&0.8
\end{pmatrix}^t
x(0)

Peut être écrit.

Généralisation

Si la matrice n'est pas une matrice diagonale, elle sera convertie de force en matrice diagonale. Apportez une matrice régulière $ P $ à la variable d'origine $ x (t) $

x(t)=Py(t)

Réfléchissons à la façon de convertir en une autre variable avec. À ce moment, comment $ x (t) = Ax (t-1) $ est-il converti?

Premièrement, $ x (t) = Py (t) $

y(t)=P^{-1}x(t)=P^{-1}Ax(t-1)\\
      =P^{-1}A(Py(t-1))=(P^{-1}AP)y(t-1)

Si vous mettez $ Λ = P ^ {-1} AP $,

y(t)=Λy(t-1)

Peut être placé. Si ce $ Λ $ est une matrice diagonale,

y(t)=Λ^ty(0)

Vous pouvez facilement trouver $ y (t) $ avec

x(t)=Py(t)=PΛty(0)=PΛ^tP^{-1}x(0)

J'étais heureux de trouver x aussi.

Cette procédure "apportant un $ P $ pratique et faisant de $ P ^ {-1} AP $ une matrice diagonale" est appelée diagonalisation.

Ce que je veux faire

P^{-1}AP≡Λ=diag(λ_1,...,λ_n)

Est de trouver $ P $ comme. Généralement pour une matrice carrée $ A $

Ap=λp\\
p≠o

Le nombre $ λ $ et le vecteur $ p $ qui satisfont les conditions sont appelés respectivement valeurs propres et vecteurs propres.

Calculer des valeurs propres et des vecteurs propres avec Python

Les calculs sont faciles si vous utilisez pleinement les fonctions de Numpy. Calculons avec la matrice suivante.

A=
\begin{pmatrix}
5&3&4\\
6&8&-8\\
6&9&-9
\end{pmatrix}
import numpy as np

def get_eigenpairs(arr):
    #np.linalg.eig renvoie une valeur unique dans le premier argument et un vecteur unique dans le deuxième argument
    w, v = np.linalg.eig(arr)
    eigenpairs = []
    
    #Parce que v est normalisé à 1. Je ne sais pas si c'est le cas.
    #Par conséquent, la valeur numérique est restaurée en divisant par la valeur minimale à l'exclusion de 0 dans chaque colonne.
    for i, val in enumerate(w):
        vec = v[:, i] / np.min(np.abs(v[:, i][v[:, i] != 0]))
        eigenpairs.append((val, vec))
    eigenpairs.sort(key=lambda x:x[0])
    return eigenpairs

A = np.array([[5,3,-4],[6,8,-8],[6,9,-9]])

get_eigenpairs(A)
#array([[-1.0, array([1., 2., 3.])],
#       [2.0, array([-1., -3., -3.])],
#       [3.0, array([1., 2., 2.])]], dtype=object)

J'ai 3 vecteurs propres. Celles-ci correspondent respectivement à des valeurs uniques $ -1, 2, 3 $. Alors, arrangez trois vecteurs propres

P=
\begin{pmatrix}
1&-1&1\\
2&-3&2\\
3&-3&2
\end{pmatrix}

Vérifions si $ P ^ {-1} AP $ est une matrice diagonale.

P = np.empty((3,3))

#Stockez 3 vecteurs propres dans une matrice 3x3
for i,val in enumerate(get_eigenpairs(a)):
    P[i] = val[1]

np.rint(np.dot(np.dot(np.linalg.inv(P.T),a),P.T))
#array([[-1.,  0.,  0.],
#       [ 0.,  2., -0.],
#       [ 0.,  0.,  3.]])

Il a été confirmé que $ P ^ {-1} AP = diag (-1,2,3) $ a été obtenu avec succès. Désormais, vous pouvez facilement vous renseigner sur l'emballement du modèle à retour automatique.

Recommended Posts

Algèbre linéaire pour la programmation Chapitre 4 (valeurs uniques, vecteurs propres)
Valeurs authentiques et vecteurs propres: Algèbre linéaire en Python <7>
Trouver valeur propre / vecteur propre
Programmation linéaire avec PuLP