next up previous contents index
suivant: La méthode de Gauss monter: Méthode pour résoudre des précédent: Le pivot de Gauss   Table des matières   Index

La méthode de Gauss-Jordan

Étant donnée un système d'équations, on cherche à le remplacer par un système diagonale équivalent. À un système d'équations AX = b, on associe la matrice M formée de A, bordée par b comme dernière colonne.
La fonction gaussjordan_redi transforme M par la méthode de Gauss-Jordan. On cherche dans chaque colonne j,(j = 0..nc - 2) à partir de la diagonale, ce qui va faire office de pivot : dans le programme ci-dessous on choisit le premier élément non nul, puis par un échange de lignes, on met le pivot sur la diagonale ( pivo = M[j, j]). Il ne reste plus qu'à former, pour chaque ligne k (k $ \neq$ j) et pour a = M[k, j], la combinaison :
pivo*lignek - a*lignej (et ainsi M[k, j] devient nul).
On écrit pour réaliser cette combinaison :
lorsque k < j
a:=M[k,j];
for (l:=0;l<j;l++){
M[k,l]:=M[k,l]*pivo-M[j,l]*a;}

et lorsque k > j
a:=M[k,j];
for (l:=j;l<nc;l++){
M[k,l]:=M[k,l]*pivo-M[j,l]*a;}

On remarquera que l part soit de 0 soit de j car pour l < j, on a M[k, l] = 0 seulement si k > j.
Si on ne trouve pas de pivot, on continue comme si de rien n'était : on obtiendra donc des zéros au dessus de la diagonale que si on a trouvé un pivot pour chaque colonne.
gaussjordan_redi(M):={
local pivo,j,k,nl,nc,temp,l,n,a;
nl:=nrows(M);
nc:=ncols(M);
n:=min(nl,nc-1);
//on met des 0 sous et au dessus de la diagonale du carre n*n
for (j:=0;j<n;j++) {
  //choix du pivot
    k:=j;
    while (M[k,j]==0 and k<nl-1) {k:=k+1;}
    //on ne fait la suite que si on a pivo!=0
    if (M[k,j]!=0) {
      pivo:=M[k,j];
      //echange de la ligne j et de la ligne k
      for (l:=j;l<nc;l++){
       temp:=M[j,l];
       M[j,l] := M[k,l];
        M[k,l]:=temp;     
      }
     //fin du choix du pivot qui est M[j,j]
     // on met des zeros au dessus de la diag
     for (k:=0;k<j;k++) {
        a:=M[k,j];
        for (l:=0;l<nc;l++){ 
          M[k,l]:=M[k,l]*pivo-M[j,l]*a; 
         } 
      }
      // on met des zeros au dessous de la diag
      for (k:=j+1;k<nl;k++) {
        a:=M[k,j];
        for (l:=j;l<nc;l++){ 
          M[k,l]:=M[k,l]*pivo-M[j,l]*a; 
         } 
       }
    }  
}
return M;
}
De la même façon que pour la mèthode de Gauss, on va mettre des zéros sous la "fausse diagonale" et au dessus de cette "fausse diagonale" (on ne pourra pas bien sûr, mettre des zéros au dessus de cette "fausse diagonale", pour les colonnes sans pivot!!)
gaussjordan_red(M):={
local pivo,jc,jl,k,nl,nc,temp,l,a;
nl:=nrows(M);
nc:=ncols(M);
//on met des 0 sous la fausse diagonale 
jc:=0;
jl:=0;
//on doit traiter toutes les colonnes sauf le derniere et 
//on doit traiter toutes les lignes
while (jc<nc-1 and jl<nl) {
  //choix du pivot que l'on veut mettre en M[jl,jc]
    k:=jl;
    while (M[k,jc]==0 and k<nl-1) {k:=k+1;}
    //on ne fait la suite que si on a pivo!=0
    if (M[k,jc]!=0) {
      pivo:=M[k,jc];
      //echange de la ligne jl et de la ligne k
      for (l:=jc;l<nc;l++){
       temp:=M[jl,l];
       M[jl,l] := M[k,l];
        M[k,l]:=temp;     
      }
     //fin du choix du pivot qui est M[jl,jc]
      //on met des 0 au dessus la fausse diagonale de 
      //la colonne jc
      for (k:=0;k<jl;k++) {
        a:=M[k,jc];  
        for (l:=0;l<nc;l++){ 
          M[k,l]:=M[k,l]*pivo-M[jl,l]*a; 
         } 
       }
       //on met des 0 sous la fausse diag de la colonne jc
       for (k:=jl+1;k<nl;k++) {
        a:=M[k,jc];
        for (l:=jc;l<nc;l++){ 
          M[k,l]:=M[k,l]*pivo-M[jl,l]*a; 
         } 
       }
      //on a un pivot donc 
      //le numero de ligne de la fausse diag augmente de 1
      jl:=jl+1;
    }
    //ds tous les cas,
    //le numero de colonne de la fausse diag augmente de 1
    jc:=jc+1;  
}
return M;
}
On tape :
M0:= [[1,2,3,6],[2,3,1,6],[3,2,1,6]]
gaussjordan_red(M0)
On obtient :
[[12,0,0,12],[0,12,0,12],[0,0,-12,-12]]
On tape :
M1:= [[1,2,3,4],[0,0,1,2],[0,0,5,1]]
gaussjordan_red(M1)
On obtient :
[[1,2,0,-2],[0,0,1,2],[0,0,0,-9]]
On tape :
M2:= [[1,2,3,4],[0,0,1,2],[0,0,5,1],[0,0,3,2],[0,0,-1,1]]
gaussjordan_red(M2)
On obtient :
[[1,2,0,-2],[0,0,1,2],[0,0,0,-9],[0,0,0,-4],[0,0,0,3]]

$\displaystyle \tt gaussjordan\_red\left(\left [
\begin{array}{rrrr}
1&2&3&4\\
0&0&1&2\\
0&0&5&1\\
0&0&3&2\\
0&0&-1&1\\
\end{array}\right ]\right )$ = $\displaystyle \left[\vphantom{
\begin{array}{rrrr}
1&2&0&-2\\
0&0&1&2\\
0&0&0&-9\\
0&0&0&-4\\
0&0&0&3\\
\end{array}}\right.$$\displaystyle \begin{array}{rrrr}
1&2&0&-2\\
0&0&1&2\\
0&0&0&-9\\
0&0&0&-4\\
0&0&0&3\\
\end{array}$$\displaystyle \left.\vphantom{
\begin{array}{rrrr}
1&2&0&-2\\
0&0&1&2\\
0&0&0&-9\\
0&0&0&-4\\
0&0&0&3\\
\end{array}}\right]$


next up previous contents index
suivant: La méthode de Gauss monter: Méthode pour résoudre des précédent: Le pivot de Gauss   Table des matières   Index
Documentation de giac écrite par Renée De Graeve