Pour résoudre un système de la forme
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
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
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*xrenvoie
>>>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*xretourne
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