![]() | Systèmes de Cramer |
Les systèmes de Cramer sont des systèmes de n équations linéaires à n inconnues. Il ont la forme générale suivante :
On peut les représenter de façon matricielle par la formule AX=Y où A est la une matrice nxn et où X et Y sont des vecteurs colonnes à n composantes.
Si n=3, on a :
Commençons par définir une constante nMax définissant le nombre d'équations et d'inconnues du système.
const nMax = 3;
Définissons le type vecteur comme un tableau de nombres.
type vecteur=array[1..nMax] of Real;
Définissons le type matrice comme un tableau de nombres doublement indicé.
type matrice=array[1..nMax,1..nMax] of Real;
lireVecteur(var v:vecteur);
qui permet de définir un
vecteur en donnant ses composantes.
lireMatrice(var m:matrice);
qui permet de définir une
matrice.
afficheSyst(A:matrice; Y:vecteur);
qui affiche le
système AX=Y.
afficheSol(X:vecteur);
qui affiche la solution d'un
système.
Nous allons résoudre un tel système en effectuant des combinaisons linéaires sur les lignes de façon à obtenir un système triangulaire supérieur, c'est à dire un système pour lequel la matrice A contient des 0 dans le triangle inférieur délimité par la diadonale principale (aij = 0 pour i>j ).
Si n=3, on aboutit à la matrice :
Le système devient :
Il est alors facile à résoudre par substitution en partant de x3.
resTriangleSup(A: matrice; Y : vecteur; var X : vecteur);
qui
permet de résoudre le système AX=Y lorsque A est une matrice triangulaire.
const A:matrice=((1,5,7),(0,3,4),(0,0,5)); const Y:vecteur=(3,2,10);puis résoudre AX=Y.
Pour transformer tout système en système triangulaire supérieur nous utiliserons des combinaisons linéaires des lignes.
Appelons L1, L2, .... , Ln les différentes lignes du système. Pour faire apparaître des 0 dans la 1ère colonne, si a11 est différent de 0, nous remplacerons la ligne L2 par L2 - (a21/a11)L1, puis la ligne L3 par L3 - (a31/a11)L1, etc...
Il suffira ensuite de reprendre le même procédé pour les colonnes suivantes en laissant la 1ère ligne et la 1ère colonne de côté.
Si a11 est égal à 0, il faudra trouver une ligne dont le premier coefficient est non nul et l'échanger avec la première ligne. Si une telle ligne n'existe pas, le système n'est pas régulier (déterminant nul) et n'a donc pas une solution unique.
Pour des raisons de meilleure approximation, on a intérêt à faire en sorte que le coefficient par lequel on divise soit le plus grand possible en valeur absolu. Nous allons donc toujours commencer par rechercher le plus grand coefficient (en valeur absolue) sur une colonne pour le placer en première ligne.
Si ce coefficient est nul, le système n'est pas régulier. Pour tenir compte des arrondis, nous considèrerons comme nul les coefficients inférieurs à 10-8 en valeur absolue.
gaussPartiel(A : matrice; Y : vecteur; var X : vecteur);
qui
commence par transformer le système AX=Y pour le rendre triangulaire, puis calcule la solution
en utilisant la procédure resTriangleSup vue précédemment.