# CAMA : ma04 Vectors propres # Cours du 30 / 03 Soit A une matrice qui représente une application linéaire quelconque. Que se passe-t-il si on l'applique $n$ fois ? ![](https://i.imgur.com/Nv1qhKD.png) ``` array([[ 0.707, 0.966, 0.966, 0.707, 0.259, -0.259, -0.707, -1.061, -1.414, -1.061, -0.707, -0. , 0.707], [-0.707, -0.259, 0.259, 0.707, 0.966, 0.966, 0.707, 0.354, 0. , -0.354, -0.707, -0.707, -0.707]]) ``` ```python= # on prend une matrice de transformation au hasard (donc probablement pas orthoganale) A = np.array([[3,2], [1,2]]) ``` ```python= as1 = np.dot(A, mouse) as2 = 3 * A @ mouse # souris 3 fois plus grande ``` ![](https://i.imgur.com/ATVie90.png) :::info La transformation n'est pas une isométrie donc la matrice n'est pas orthogonale. ::: :::warning La souris 3x plus grande est isométrique car $A$ est une application linéaire. ::: ```python= aas1 = A @ A @ mouse aaas1 = A @ A @ A @ mouse ``` ![](https://i.imgur.com/wf9vAdY.png) La figure s'étire suivant le vecteur $(2, 1)$ :::warning Si $A{\bf x}$ fait tourner la souris d'environ 25°, appliquer 2 ou 3 fois $A$ ne fait plus tourner la figure. ::: ## Vecteurs propres et valeurs propres :::danger Les valeurs et vecteurs propres respectent cette priopriété : $$ A \, {\bf v_i} = \lambda_i \, {\bf v_i} $$ * $(\lambda_i, {\bf v_i})$ : couple valeur / vecteur propres ::: ```python= val_propre, vec_propre = lin.eig(A) ``` ``` Valeurs propres de A : [4.+0.j 1.+0.j] Vecteurs propres de A (chaque vecteur propre est écrit verticalement): [[ 0.894 -0.707] [ 0.447 0.707]] ``` :::danger Les vecteurs propres sont des **attracteurs** qui capturent tous les points si on fait un nombre infini de multiplications par $A$. Les points **s'alignent** sur l'un des deux vecteurs propres. ::: ```python= N = 100 cercle = np.array([[np.cos(i * 2*np.pi/N), np.sin(i * 2*np.pi/N)] for i in range(N)]).T a10c = np.array([x for x in (A10 @ cercle).T]).T a10cn = np.array([x/lin.norm(x) for x in a10c.T]).T # a10c normé nb1 = np.sum([lin.norm(a10cn[:,i] - vec_propre[:,0]) < 0.01 for i in range(N)]) \ + np.sum([lin.norm(a10cn[:,i] + vec_propre[:,0]) < 0.01 for i in range(N)]) nb2 = np.sum([lin.norm(a10cn[:,i] - vec_propre[:,1]) < 0.01 for i in range(N)]) \ + np.sum([lin.norm(a10cn[:,i] + vec_propre[:,1]) < 0.01 for i in range(N)]) ``` ``` Nombre de points proche du 1er vecteur propre : 100 Nombre de points proche du 2e vecteur propre : 0 ``` Seuls les points colinéaires au second vecteur propre le resteront, les autres rejoignent le premier vecteur propre. ## Le cas des matrices de rotation *Quels sont les vecteurs propres d'une matrice de rotation ?* ```python= def Rot(θ): return np.array([[np.cos(θ), -np.sin(θ)], [np.sin(θ), np.cos(θ)]]) R = Rot(2*np.pi/10) R_valp, R_vecp = lin.eig(R) ``` ``` Valeurs propres de R : [0.809+0.588j 0.809-0.588j] Vecteurs propres de R : [[0.707+0.j 0.707-0.j ] [0. -0.707j 0. +0.707j]] ``` ```python= # regardons un autre angle R = Rot(2*np.pi/3) R_valp, R_vecp = lin.eig(R) ``` ``` Valeurs propres de R : [-0.5+0.866j -0.5-0.866j] Vecteurs propres de R : [[ 0.-0.707j 0.+0.707j] [-0.707+0.j -0.707-0.j]] ``` :::info * Les valeurs et vecteurs propres sont des complexes * Les valeurs propres ont la même norme ::: ## Symétrie axiale horizontale $$ Sx = \begin{bmatrix} 1 & 0 \\ 0 & -1 \\ \end{bmatrix} $$ ```python= Sx = np.array([[1, 0], [0, -1]]) Sx_valp, Sx_vecp = lin.eig(Sx) ``` ``` Valeurs propres de Sx : [ 1.+0.j -1.+0.j] Vecteurs propres de Sx : [[1. 0.] [0. 1.]] ``` * Une matrice diagonale modifie que la i-ième coordonnéee de ${\bf x}$ par la i-ième valeur de sa diagonale. * Ses vecteurs propres sont ceux de la base d'origine : ```python= D = np.diag(np.random.randint(10,size=5)) D_valp, D_vecp = lin.eig(D) ``` ``` Valeurs propres de D : [8.+0.j 8.+0.j 4.+0.j 7.+0.j 1.+0.j] Vecteurs propres de D : [[1. 0. 0. 0. 0.] [0. 1. 0. 0. 0.] [0. 0. 1. 0. 0.] [0. 0. 0. 1. 0.] [0. 0. 0. 0. 1.]] ``` ## Diagonalisation d'une matrice :::danger En changeant de repère, on peut représenter une application linéaire par une matrice diagonale contenant ses valeurs propres. $$ \exists P \; / \; A = P\, \Lambda \, P^{-1} \quad $$ * avec $\Lambda$ la matrice diagonale des valeurs propres $\lambda_i$ * P matrice de passage : vecteurs propres ::: ```python= A vec_propre @ np.diag(val_propre) @ lin.inv(vec_propre) ``` ``` A : [[3 2] [1 2]] 𝑃 Λ inv(𝑃) : [[3.+0.j 2.+0.j] [1.+0.j 2.+0.j] ``` * **Matrice inversible :** si une des valeurs propre est nulle alors $\Lambda$ n'est pas inversible et donc A n'est pas inversible * **Matrice non diagonalisable :** si l'ensemble des vecteurs propres ne genere pas un espace de meme dimension que d'origine, alors on ne peut pas diagonaliser la matrice