next up previous contents index
suivant: Résolution d'un système linéaire monter: Méthode pour résoudre des précédent: La méthode de Gauss   Table des matières   Index

Application : recherche du noyau grâce à Gauss-Jordan

Soit une application linéaire f de $ \mathbb {R}$n dans $ \mathbb {R}$p, de matrice A dans la base canonique de $ \mathbb {R}$n et de $ \mathbb {R}$p.
Trouver le noyau de f revient à résoudre f (X) = 0 ou encore à résoudre AX = 0 pour X $ \in$ $ \mathbb {R}$n.
Pour cela, on va utiliser la méthode de Gauss-Jordan en rajoutant des lignes de 0 aux endroits où l'on n'a pas trouvé de pivot de façon à ce que les pivots suivants se trouve sur la diagonale (et non sur la "fausse diagonale").
Plus précisément :
- quand on a trouvé un pivot pour une colonne, à l'aide de la méthode habituelle de réduction de Gauss-Jordan, on met sur cette colonne :
1 sur la diagonale et
0 de part et d'autre du 1.
- quand on n'a pas trouvé de pivot pour la colonne j, on rajoute une ligne de 0 : la ligne j devient une ligne de 0 et les autres lignes sont décalées.
- on rajoute éventuellement à la fin, des lignes de 0, pour traiter toutes les colonnes de A et avoir une matrice carrée.
- on enlève éventuellement à la fin, des lignes de 0, pour avoir une matrice carrée.
Remarque : on ne change pas le nombre de colonnes.
Ainsi, si la colonne Cj a un 0 sur sa diagonale, si ej est le j-ième vecteur de la base canonique de $ \mathbb {R}$n, alors Nj = Cj - ej est un vecteur du noyau. En effet, on a A(ej) = Cj; si on a Cj = a1e1 + .... + aj-1ej-1, pour k < j, et pour ak! = 0, on a A(ek) = ek c'est à dire A(Cj) = Cj = A(ej), soit A(Cj - ej) = A(Nj) = 0.
Voici le programme correspondant en conservant la variable jl afin de faciliter la lisibilité du programme :
     
gaussjordan_noyau(M):={
local pivo,jc,jl,k,j,nl,nc,temp,l,a,noyau;
nl:=nrows(M);
nc:=ncols(M);
//on met des 0 sous la diagonale 
jc:=0;
jl:=0;
// on traite toutes les colonnes
while (jc<nc 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 1 sur la diagonale de la colonne jc
      for (l:=0;l<nc;l++) {
      M[jl,l]:=M[jl,l]/pivo;
      }
      //on met des 0 au dessus de la 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]-M[jl,l]*a; 
         } 
       }
       //on met des 0 sous la 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]-M[jl,l]*a; 
         } 
       }
    }
    else{
    //on ajoute une ligne de 0 si ce n'est pas le dernier 0
    if (jl<nc-1){
     for (j:=nl;j>jl;j--){
      M[j]:=M[j-1];
      }
    M[jl]:=makelist(0,1,nc);
    nl:=nl+1;
    }
   }
    //ds tous les cas,le numero de colonne et 
    //le numero de ligne augmente de 1
    jc:=jc+1;  jl:=jl+1;
    //il faut faire toutes les colonnes 
    if (jl==nl and jl<nc) { M[nl]:=makelist(0,1,nc);nl:=nl+1;}
}
noyau:=[];
//on enleve les lignes en trop pour avoir 
//une matrice carree de dim nc
//on retranche la matrice identite
M:=M[0..nc-1]-idn(nc);
for(j:=0;j<nc;j++){
if (M[j,j]==-1) {noyau:=append(noyau,M[0..nc-1,j]);}
}
return noyau;
}
Remarque
On peut écrire le même programme en supprimant la variable jl puisque jl = jc (on met jc à la place de jl et on supprime jl : = 0 et jl : = jl + 1).
On met ce programme dans un niveau éditeur de programmes (que l'on ouvre avec Alt+p), puis on le teste et on le valide avec OK.
On tape :
gaussjordan_noyau([[1,2,3],[1,3,6],[2,5,9]])
On obtient :
[[-3,3,-1]]
On tape :
gaussjordan_noyau([[1,2,3,4],[1,3,6,6],[2,5,9,10]])
On obtient :
[[-3,3,-1,0],[0,2,0,-1]]
next up previous contents index
suivant: Résolution d'un système linéaire monter: Méthode pour résoudre des précédent: La méthode de Gauss   Table des matières   Index
Documentation de giac écrite par Renée De Graeve