suivant: Tridiagonalisation des matrices symétriques
monter: Réduction de Hessenberg
précédent: La méthode
Table des matières
Index
//A est mise sous forme de hessenberg B avec
//P matrice de passage
//p indique si il y a eu une permutation de lignes
//a chaque etape la matrice inv(R)
// met des zeros sous la "sous diagonale"
//B=P^-1AP ex A:=[[5,2,1],[5,2,2],[-4,2,1]]
//A:=[[5,2,1,1],[5,2,2,1],[5,2,2,1],[-4,2,1,1]]
hessenbg(A):={
local B,R,P,n,j,k,l,temp,p;
n:=size(A);
P:=idn(n);
p:=seq(k,k,0,n-1);
B:=A;
l:=1;
while (l<n) {
R:=idn(n);
if (B[l,l-1]!=0){
for (k:=l+1;k<n;k++){
R[k,l]:=B[k,l-1]/B[l,l-1];
//on multiplie B a droite par inv(R)
for (j:=l;j<n;j++){
B[k,j]:=B[k,j]-B[l,j]*B[k,l-1]/B[l,l-1];
}
B[k,l-1]:=0;
}
//on multiplie B et P a gauche par R
B:=B*R;
P:=P*R;
l:=l+1;
}
else {
k:=l;
while ((k<n-1) and (B[k,l-1]==0)) {
k:=k+1;
}
if (B[k,l-1]==0) {l:=l+1;}
else{
//B[k,l]!=0) on echange ligne l et k ds B
for (j:=l-1;j<n;j++){
temp:=B[k,j];
B[k,j]:=B[l,j];
B[l,j]:=temp;
};
//A[k,l]!=0) on echange colonne l et k ds B et P
for (j:=0;j<n;j++){
temp:=B[j,k];
B[j,k]:=B[j,l];
B[j,l]:=temp;
};
for (j:=0;j<n;j++){
temp:=P[j,k];
P[j,k]:=P[j,l];
P[j,l]:=temp;
};
temp:=p[k];
p[k]:=p[l];
p[l]:=temp;
}
}
}
return(p,P,B);
};
p nous dit les échanges effectués et on a
B = P-1*A*P.
Attention !! si A est symétrique, cette transformation détruit la
symétrie et on n'a donc pas une tridiagonalistion d'une matrice symtrisue par cette méthode.
Documentation de giac écrite par Renée De Graeve