Réduction des endomorphismes et des matrices carrées
Cours complet · mathématiques approfondies (ECG 2e année), chapitre 3 · prépa ECG, 2e année
Travailler ce chapitre sur Adloun Exercices corrigés de ce chapitre
Le chapitre 1 a montré qu'un même endomorphisme change de matrice quand on change de base, et le chapitre 2 a isolé les directions qu'il conserve. Il reste à joindre les deux : s'il existe assez de directions propres pour former une base, alors dans cette base la matrice devient diagonale.
C'est la réduction. Elle ne modifie pas l'endomorphisme — elle change le point de vue, et le bon point de vue rend le calcul trivial : une matrice diagonale s'élève à la puissance en élevant réels à la puissance .
Diagonalisable ne veut pas dire « diagonale ». Une matrice diagonalisable peut n'avoir aucun zéro. Cela veut dire : semblable à une matrice diagonale, c'est-à-dire qu'il existe un repère dans lequel elle le devient. La question n'est donc jamais « à quoi ressemble ? » mais « existe-t-il une base de vecteurs propres ? ».
3.1 Endomorphismes diagonalisables
3.1.1 Définition
Soit un espace vectoriel réel de dimension finie et un endomorphisme de . On dit que est diagonalisable lorsqu'il existe une base de formée de vecteurs propres de .
Si est une base de vecteurs propres, avec , alors
Démonstration
Par définition, la -ème colonne de la matrice est la colonne des coordonnées de dans . Or , dont les coordonnées sont nulles partout sauf en position , où elles valent .
3.1.2 Trois caractérisations
Soit un endomorphisme de , avec . Les assertions suivantes sont équivalentes :
- est diagonalisable ;
- est la somme directe des sous-espaces propres de :
- la somme des dimensions des sous-espaces propres vaut :
C'est le point (3) qui sert en pratique. On cherche le spectre, on calcule pour chaque valeur propre, et l'on additionne. Si l'on obtient , c'est diagonalisable ; sinon, non. Aucune base n'a besoin d'être exhibée pour décider.
Si est un endomorphisme d'un espace de dimension admettant valeurs propres deux à deux distinctes, alors est diagonalisable, et tous ses sous-espaces propres sont de dimension .
Démonstration
Chaque valeur propre fournit un vecteur propre non nul ; ces vecteurs sont associés à des valeurs propres distinctes, donc forment une famille libre (chapitre 2). Une famille libre de vecteurs dans un espace de dimension est une base : est diagonalisable. De plus avec termes tous supérieurs ou égaux à : chacun vaut exactement .
n'a qu'une valeur propre et sa matrice est diagonale dans toute base. Avoir valeurs propres distinctes est suffisant, jamais nécessaire : quand ce n'est pas le cas, il faut revenir aux dimensions.
3.2 Diagonaliser une matrice
est diagonalisable lorsqu'il existe une matrice inversible et une matrice diagonale telles que
est diagonalisable si et seulement si possède une base formée de vecteurs propres de . Dans ce cas, les colonnes de sont ces vecteurs propres, et les coefficients diagonaux de sont les valeurs propres associées, dans le même ordre.
- Chercher — par un polynôme annulateur, sur la diagonale si est triangulaire, ou par la chute du rang.
- Pour chaque , résoudre et donner une base de .
- Additionner les dimensions. Si la somme vaut , empiler les vecteurs en colonnes dans et les valeurs propres dans .
- Vérifier . Ce produit ne demande pas et attrape aussitôt une colonne mal placée.
Soit . On admet que — trois valeurs distinctes en dimension , donc est diagonalisable, et chaque sous-espace propre est de dimension .
: donne , puis donc , et libre. Vecteur propre : .
: . La troisième ligne donne , la deuxième . Vecteur propre : .
: , puis . Vecteur propre : .
3.3 Puissances d'une matrice diagonalisable
Si avec , alors pour tout ,
Démonstration
Récurrence sur . Le cas est . Et si , alors
les facteurs intermédiaires disparaissant.
Soit . On a et , donc avec , et :
Contrôle en : .
Python : Diagonaliser, et vérifier autrement que par la machine
import numpy as np
A = np.array([[2., 0., 0.], [1., 1., 1.], [-1., 0., 3.]])
P = np.array([[0., 1., 0.], [1., 2., 1.], [0., 1., 2.]])
D = np.diag([1., 2., 3.])
print(np.allclose(A @ P, P @ D)) # True <- la verification du cours
print(np.linalg.matrix_rank(P)) # 3 <- P est bien inversible
k = 6
print(np.allclose(np.linalg.matrix_power(A, k),
# True
P @ np.diag([1., 2., 3.])**k @ np.linalg.inv(P)))
On ne demande pas ses valeurs propres à la machine : on lui fait vérifier celles qu'on a trouvées. C'est qui prouve la diagonalisation, et ce produit se calcule aussi bien à la main.