Systèmes à n équations et n inconnues

Pour résoudre un système de la forme

\begin{displaymath}A x = b, \end{displaymath}

où A est une matrice de taille nxn et b un vecteur de taille n, il suffit, lorsque cela est possible, d'inverser A

\begin{displaymath}x = A^{-1} b. \end{displaymath}

En matlab ou octave, on peut donc résoudre un système linéaire en exécutant la commande
x=inv(A)*b;
Le plus souvent, il n'est cependant ni nécessaire ni même efficace d'inverser la matrice pour résoudre le système linéaire. Il est souvent plus judicieux de récourir à des décompositions adaptées aux propriétés de la matrice A. En matlab et octave, les fonctions \ ou mldivide sont spécialisées dans la résolution de systèmes linéaires. Elles mettent en \oeuvre un ensemble de stratégies de résolution qui tiennent compte des propriétés de la matrice A. Par exemple, si la matrice A est symétrique et comporte des éléments diagonaux réels et positifs, les fonctions tenteront de résoudre le système avec une décomposition de Cholesky.

Aussi est-il recommandé d'utiliser les fonctions \ ou mldivide pour la résolution de système linéaires. Ces dernières s'utilisent comme suit :

x=A\b;
x=mldivide(A,b);

En utilisant ces fonctions, il faut toutefois être vigilant aux messages d'avertissement qu'elles délivrent lorsque la matrice A est singulière (de manière absolue ou à la précision de la machine).

Lorsque la matrice A est singulière (càd lorsque r=rg(A)<n), deux cas se présentent : (a) soit le système admet une infinité de solutions, (b) soit il n'en admet aucune. Dans les deux cas, les fonctions \ ou mldivide renvoient le point x de norme minimale qui réalise un minimum de la somme des écarts quadratiques

\begin{displaymath}J(x)=\Vert Ax - b \Vert^2. \end{displaymath}

Dans le cas (a), ce point x est la solution de Ax=b de norme minimale. Dans le cas (b), le point x n'est qu'une solution approchée de Ax=b de norme minimale.

Pour observer cela, prenons les deux exemples ci-dessous.

Le premier exemple

A=[1 1 1; 2 0 3; 3 1 4]; %matrice de rang 2
b=[2 5 7]';              %Ax=b admet une infinité de solutions
x=A\b
A*x
renvoie
>>>warning: matrix singular to machine precision, rcond = 1.15648e-17
x =

   0.785714
   0.071429
   1.142857

>>>warning: attempting to find minimum norm solution
warning: dgelsd: rank deficient 3x3 matrix, rank = 2
ans =

   2
   5
   7

Le second exemple

A=[1 1 1; 2 0 3; 3 1 4]; %même matrice de rang 2
b=[2 5 6]';              %Ax=b n'admet pas de solution
x=A\b
A*x
retourne
x =

   0.69048
  -0.11905
   1.09524
>>>warning: matrix singular to machine precision, rcond = 1.15648e-17
>>>warning: attempting to find minimum norm solution
warning: dgelsd: rank deficient 3x3 matrix, rank = 2
ans =

   1.6667
   4.6667
   6.3333

En fait, lorsque la matrice A est singulière, les fonctions \ ou mldivide ont recours à une pseudo-inversion de A.

Dans l'exemple ci-dessous, on peut vérifier que la solution approchée s'obtient également à partir des lignes de commandes

x = pinv(A)*b
x =
   0.69048
  -0.11905
   1.09524

Frédéric Richard, Aix-Marseille Université 2012-12-05