Calcul des déterminants

Plan du chapitre "Déterminants"

Déterminants et opérations élémentaires

Les propriétés des déterminants découlent ce qu’ils représentent des fonctions multilinéaires alternées de leurs colonnes (et aussi de leurs lignes).
Dans l’énoncé des propriétés suivantes (exprimées en termes de colonnes, mais qui pourraient l’être en termes de lignes), on note {\Delta} un déterminant d’ordre {n}.
On convient de confondre “la valeur” {\Delta} et “le tableau” {\Delta}. Avec cette convention :

  • La valeur d’un déterminant {\Delta} dépend linéairement de chacune de ses colonnes (de ses lignes).
    Si on multiplie une colonne (une ligne) par {\lambda}, la valeur de {\Delta} est multipliée par {\lambda}.
    En particulier, pour toute {A\in\mathcal{M}_{n}(\mathbb{K})}, et tout {\lambda\in\mathbb{K}}, on a: {\det(\lambda A)=\lambda ^{n}\det(A)}.
  • Si on échange deux colonnes (deux lignes) de {\Delta}, la valeur de {\Delta} est changée en son opposé.
    Plus généralement, si on effectue une permutation sur les colonnes (sur les lignes) de {\Delta}, la valeur de {\Delta} est inchangée (resp. changée en son opposé) selon que cette permutation est paire ou impaire, c’est-à-dire selon qu’elle se décompose en un nombre pair ou impair d’échanges.
  • On ne modifie pas la valeur de {\Delta} en ajoutant à l’une de ses colonnes (de ses lignes) une combinaison linéaire des autres colonnes (des autres lignes) de {\Delta}.
  • La valeur du déterminant {\Delta} est nulle si et seulement si ses colonnes (ses lignes) sont liées.
    En particulier, si {\Delta} contient une colonne (ou une ligne) nulle, alors la valeur de {\Delta} est nulle.

On va résumer en termes d’opérations élémentaires sur les lignes (ou colonnes) :

Proposition (effet d'une opération élémentaire sur un déterminant)
Soit {A} dans {{\mathcal M}_n(\mathbb{K})}, et {A'} obtenue en appliquant à {A} une opération élémentaire {\varphi}.
Soit {\Delta=\det(A)} et {\Delta'=\det(A')}.

  • si {\varphi} est l’opération {\text{C}_{i}\leftarrow \alpha_{i}\text{C}_i} (ou {\text{L}_{i}\leftarrow \alpha\text{L}_{i}}), avec {\alpha\ne0}, alors {\Delta'=\alpha\Delta}.
  • si {\varphi} est l’opération {\text{C}_{i}\leftrightarrow \text{C}_{j}} (ou {\text{L}_{i}\leftrightarrow \text{L}_{j}}), alors {\Delta'=-\Delta}.
  • si {\varphi} est l’opération {\text{C}_{i}\leftarrow \text{C}_{i}+\beta_{j}\text{C}_{j}} (ou {\text{L}_{i}\leftarrow \text{L}_{i}+\beta\text{L}_{j}}), avec {j\ne i}, alors {\Delta'=\Delta}.

Développement d’un déterminant, comatrice

Définition (mineur, cofacteur, comatrice)
Soit {A} une matrice de {{\mathcal M}_n(\mathbb{K})}, avec {n\ge2}, de terme général {a_{ij}}.
Pour tous indices {i,j}, on appelle mineur de {a_{ij}} dans {A} (ou dans {\Delta}), le déterminant {\Delta_{ij}} d’ordre {n-1} obtenu en supprimant dans {\Delta} la ligne et la colonne de {a_{ij}}.
La quantité {A_{ij}=(-1)^{i+j}\Delta_{ij}} est appelée cofacteur du coefficient {a_{ij}}.
On appelle comatrice de {A} et on note {\text{Com}(A)} la matrice de {{\mathcal M}_n(\mathbb{K})} de terme général {A_{ij}}.

Exemple dans le cas {n=3}

Si {A=\begin{pmatrix}a&a'&a''\cr b&b'&b''\cr c&c'&c''\end{pmatrix}}, alors {\text{Com}(A)=\left(\begin{array}{rrr}\left|\begin{matrix}b'&b''\cr c'&c''\end{matrix}\right|&-\left|\begin{matrix}b&b''\cr c&c''\end{matrix}\right|&\left|\begin{matrix}b&b'\cr c&c'\end{matrix}\right|\\\\ -\left|\begin{matrix}a'&a''\cr c'&c''\end{matrix}\right|&\left|\begin{matrix}a&a''\cr c&c''\end{matrix}\right|&-\left|\begin{matrix}a&a'\cr c&c'\end{matrix}\right|\\\\ \left|\begin{matrix}a'&a''\cr b'&b''\end{matrix}\right|&-\left|\begin{matrix}a&a''\cr b&b''\end{matrix}\right|&\left|\begin{matrix}a&a'\cr b&b'\end{matrix}\right|\end{array}\right)}

Proposition (développement d'un déterminant suivant une ligne)
Soit {A} une matrice de {{\mathcal M}_n(\mathbb{K})}, avec {n\ge2}, de terme général {a_{ij}}.
Pour tout {i\in\{1,\ldots,n\}}, on a: {\Delta=\displaystyle\sum_{j=1}^n(-1)^{i+j}a_{ij}\Delta_{ij}=\displaystyle\sum_{j=1}^n a_{ij}A_{ij}}.
Cette égalité est appelée développement de {\Delta} suivant sa {i}-ème ligne.
Proposition (développement d'un déterminant suivant une colonne)
Soit {A} une matrice de {{\mathcal M}_n(\mathbb{K})}, avec {n\ge2}, de terme général {a_{ij}}.
Pour tout {j\in\{1,\ldots,n\}}, on a: {\Delta=\displaystyle\sum_{i=1}^n(-1)^{i+j}a_{ij}\Delta_{ij}=\displaystyle\sum_{i=1}^n a_{ij}A_{ij}}.
Cette égalité est appelée développement de {\Delta} suivant sa {j}-ème colonne.
Proposition (expression de l'inverse à l'aide de la comatrice)
Soit {A} une matrice de {{\mathcal M}_n(\mathbb{K})}, avec {n\ge2}.
Alors {A {(\text{Com}(A))}^{\top}= {(\text{Com}(A))}^{\top}\,A=(\det A)\,I_n}.
En particulier, si {A} est inversible, alors {A^{-1}=\dfrac1{\det A}{(\text{Com}(A))}^{\top}}.

La formule précédente possède surtout un intérêt théorique.

Si {n=2} et si {A=\begin{pmatrix}a&b\cr c&d\end{pmatrix}} est inversible, alors {A^{-1}=\dfrac1{ad-bc}\begin{pmatrix}d&-b\cr -c&a\end{pmatrix}}.

Voici une fonction Python pour calculer les cofacteurs et la comatrice (on suppose comme d’habitude que le module numpy a été préalablement importé) :

def cofacteur(a,i,j):
return (-1)**(i+j)*np.linalg.det(np.delete(np.delete(a,j,1),i,0))
def comatrice(a):
n, p = np.shape(a)
return np.array([[cofacteur(a,i,j) for j in range(n)] for i in range(p)])

On forme ici une matrice aléatoire {A} d’ordre {5} (à coefficients entiers dans {[[0,9]]}).

>>> a = np.random.randint(10, size=(6, 6)); print(a)
[[6 7 3 3 1 2] 
[2 4 1 6 0 9] 
[6 9 0 6 0 2] 
[0 3 7 7 0 5] 
[7 8 0 1 6 1] 
[2 5 1 1 3 5]]

On forme ensuite sa comatrice {B} (il est prudent de rester en mode float, même si on sait que les coefficients de {B}, tout comme ceux de {A}, sont entiers) :

b = comatrice(a); print(b)
[[ 6117. -1320. 3945. -4800. -4908. 1989.] 
[ 4697. -4916. -1649. 1733. 314. 2832.] 
[-4367. 4739. -2452. 1981. -1190. -2184.] 
[-2225. 104. 1868. 2557. 2275. -1464.] 
[ 2717. -3854. -1010. 3416. 5570. -1056.] 
[-7473. 8148. 705. -5232. -1515. 1449.]]

On calcule {A\,{B}^{\top}}, et on obtient une matrice scalaire (il faut arrondir raisonnablement le résultat, pour annuler les coefficients non diagonaux, qui sans cela refléteraient les erreurs d’arrondis) :

>>> print(np.dot(a,b.T).round(8))
array([[ 23967., 0., 0., 0., -0., -0.],
[ -0., 23967., -0., 0., -0., -0.],
[ -0., 0., 23967., 0., -0., -0.],
[ -0., 0., -0., 23967., -0., 0.],
[ -0., -0., 0., 0., 23967., -0.],
[ -0., 0., -0., 0., -0., 23967.]])

On vérifie enfin que le coefficient sur la diagonale de {A\,{B}^{\top}} est le déterminant de {A} :

>>> np.linalg.det(a)
23967.000000000004

Quelques déterminants particuliers

Déterminants triangulaires

Proposition (déterminants triangulaires)
Soit {A} une matrice de {\mathcal{M}_n(\mathbb{K})}, triangulaire (supérieure ou inférieure).
Alors {\det(A)} est égal au produit {\displaystyle\prod_{i=1}^n a_{ii}} des coefficients diagonaux de {A}.

C’est le cas en particulier si la matrice est diagonale!

Proposition (déterminants triangulaires par blocs)
Soit {A} une matrice carrée triangulaire (supérieure ou inférieure) “par blocs”.
Alors le déterminant de {A} est égal au produit des déterminants des blocs diagonaux.

Par exemple: {\left|\begin{matrix}a_{11}&a_{12}&a_{13}&a_{14}&a_{15}&a_{16}\cr a_{21}&a_{22}&a_{23}&a_{24}&a_{25}&a_{26}\cr a_{31}&a_{32}&a_{33}&a_{34}&a_{35}&a_{36}\cr 0 &0 &0 &a_{44}&a_{45}&a_{46}\cr 0 &0 &0 &0 &a_{55}&a_{56}\cr 0 &0 &0 &0 &a_{65}&a_{66}\end{matrix}\right|=\left|\begin{matrix}a_{11}&a_{12}&a_{13}\cr a_{21}&a_{22}&a_{23}\cr a_{31}&a_{32}&a_{33}\end{matrix}\right|\,a_{44}\,\left|\begin{matrix}a_{55}&a_{56}\cr a_{65}&a_{66}\end{matrix}\right|}

Déterminant de Vandermonde

Proposition (déterminant de Vandermonde)
Soit {x=(x_{i})_{1\le i\le n}} une famille de {n} scalaires.
Soit {A} la matrice carrée d’ordre {n}, de terme général {a_{ij}=x_i^{j-1}}.
On dit que {\det(A)} est le “déterminant de Vandermonde” de {x_{1},x_{2},\ldots,x_{n}}.
Sa valeur est {\det A=\displaystyle\prod_{i\lt j}(x_j-x_i)}.

La matrice de la définition précédente est {A=\begin{pmatrix}1 & x_1 & x_1^2 &\ldots& x_1^{n-1}\\1 & x_2 & x_2^2 &\ldots& x_2^{n-1}\\\ldots & \ldots & \ldots & \ldots & \ldots \\1 & x_i & x_i^2 &\ldots& x_i^{n-1}\\\ldots & \ldots & \ldots & \ldots & \ldots \\1 & x_n & x_n^2 &\ldots& x_n^{n-1}\end{pmatrix}}

Par exemple, quand {n=4}: {\begin{array}{rl}\left|\begin{matrix}1&x_{1}&x_{1}^2&x_{1}^3\\1&x_{2}&x_{2}^2&x_{2}^3\\1&x_{3}&x_{3}^2&x_{3}^3\\1&x_{4}&x_{4}^2&x_{4}^3\end{matrix}\right|&=\left|\begin{matrix}1&1&1&1\cr x_{1}&x_{2}&x_{3}&x_{4}\\x_{1}^{2}&x_{2}^{2}&x_{3}^{2}&x_{4}^{2}\\x_{1}^{3}&x_{2}^{3}&x_{3}^{3}&x_{4}^{3}\end{matrix}\right|\\\\&=(x_{4}-x_{3})(x_{4}-x_{2})(x_{4}-x_{1})(x_{3}-x_{2})(x_{3}-x_{1})(x_{2}-x_{1})\end{array}}
Dans le module numpy de Python, on dispose d’une fonction vander.
Mais attention, l’indexation n’est pas conforme à notre défintion :

>>> a = np.vander([1,10,100]); print(a)
[[ 1 1 1] 
[ 100 10 1] 
[10000 100 1]]
>>> np.linalg.det(a)
-80190.000000000102
>>> a = np.vander(range(1,6)); print(a)
[[ 1 1 1 1 1] 
[ 16 8 4 2 1] 
[ 81 27 9 3 1] 
[256 64 16 4 1] 
[625 125 25 5 1]]

Voici comment écrire notre propre fonction vandermonde :

def vandermonde(x): # ici on attend une liste ou un intervalle
import numpy as np
n = len(x); x = np.array(x)
return np.vstack([x**i for i in range(n)])

>>> a = vandermonde([1,10,100]); print(a)
[[ 1 1 1] 
[ 1 10 100] 
[ 1 100 10000]]
>>> np.linalg.det(a)
80189.999999999971
vandermonde(range(1,6))
array([[ 1, 1, 1, 1, 1],
[ 1, 2, 4, 8, 16],
[ 1, 3, 9, 27, 81],
[ 1, 4, 16, 64, 256],
[ 1, 5, 25, 125, 625]])

Page précédente : déterminant d’une matrice
Page suivante : déterminants et orientation