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
Soit une application linéaire f de
n dans
p,
de matrice A dans la base canonique de
n et de
p.
Trouver le noyau de f revient à résoudre f (X) = 0 ou encore
à résoudre AX = 0 pour
X
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
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]]
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