Probleme 5
Dossier MAPLE
2004-2005
I.
Introduction
Procdure qui cre une matrice A, carr d'odre 5 d'elements f(i,j) > f:= proc(i,j) if i<5 then a[i,j] else if j=4 then 1 else 0 fi; fi; end: > > A:= matrix(5,5,f);
Construction de la matrice identit P, carre d'ordre 5, d'lments p[i,j] avec p[i,j]= delta[i,j] > P:=diag(1$5);
On valorise toutes les colonnes de la 3me ligne de P > for j to 5 do P[3,j]:=A[4,j]; od;
> evalm(P);
c) Calcul de B=A * M Combin l'inverse de P (dans M), le produit de A et M permet d'obtenir s'approchant du rsultat final. > B:=multiply(A,M);
Si l'on gnralise ce traitement jusqu' la premire ligne, on obtient sur celle-ci les coefficients recherchs.
2) Cette procdure Danilevski, d'argument A, retourne la liste des coefficients p1,...,pn, en supposant les pivots non nuls > Danilevski:=proc(A) local B,n,k,a,i,j; B:=copy(A); n:=rowdim(A); i:=1; for k from n by -1 to 2 do a:= subvector(B,k,1..n); for i to n do B[i,k-1]:=B[i,k-1]/B[k,k-1]; for j to n do if j <> k-1 then
B[i,j]:=B[i,j]-(B[k,j]*B[i,k-1]); fi; od; od; for j to n do B[k-1,j]:=dotprod(a,subvector(B,1..n,j)); od; od; [seq(B[1,j],j=1..n)]; end: > C:=matrix([[1,2,3,4],[2,1,2,3],[3,2,1,2],[4,3,2,1]]);
Appel de la procdure Danilevski qui permet de dduire les coefficients du polynme caractristique de la matrice C. Le rsultat de la fonction diffre du rsultat de l'ordinateur de (-1^n) avec n ordre de la matrice > Danilevski(C); Comparaison avec le polynme caractristique fournit par maple > charpoly(C,x);
Fonction IndCol, d'arguments A, k, qui retourne l tel que |a(k,l)| = max |a(k,j)| pour 1<= j<k-1 retourne l'indice de l'lment maximum de la ligne entre en parametre. > IndCol:=proc(A,k) local l,max,j,m; l:=1; max:=abs(A[k,1]); for j to k-2 do m:=abs(A[k,j]); if m>max then max:=m; l:=j; fi; od; l; end: > IndCol(A,2);
> Danilevski:=proc(A) local B,n,k,i,j,l,a; global L; B:=copy(A); n:=rowdim(A); for k from n to 2 by -1 do if B[k,k-1]=0 then l:=IndCol(B,k); B:=swapcol(B,l,k-1); B:=swaprow(B,l,k-1); fi; a:=subvector(B,k,1..n); for i from 1 to n do B[i,k-1]:=B[i,k-1]/B[k,k-1]; for j from 1 to n do if j<>k-1 then B[i,j]:=B[i,j]-B[i,k-1]*B[k,j]; fi; od; od; for j from 1 to n do B[k-1,j]:=dotprod(a,subvector(B,1..n,j)); od; od; [seq(B[1,j],j=1..n)]; end: > A:=matrix(4,4,[1,2,3,4,2,1,2,3,5,2,-4,2,2,4,3,1]);det(A);
> Danilevski(A); > matrix([[1, 2, 3, 4], [2, 1, 2, 3], [5, 2, -4, 2], [2, 4, 3, 1]]);
> IndCol(A,4);
> charpoly(A,x);
> A:=matrix(3,3,[1,2,4,2,1,2,5,2,-4]);
> > with(linalg): Derniere fonction Danilevski permettant de traiter tous les cas et renvoie les coefficients du polynme caractristique factoris > Danilevski:=proc(A) local B,n,k,a,i,j,decomp,l: global S: B:=copy(A): n:=rowdim(A): decomp:=false: for k from n to 2 by -1 while not decomp do if B[k,k-1]=0 then l:=IndCol(B,k) ; if B[k,l] <> 0 then B:=swapcol(B,l,k-1); B:=swaprow(B,l,k-1); else decomp:=true; fi; fi; if not decomp then a:=subvector(B,k,1..n); for i to n do B[i,k-1]:=B[i,k-1]/B[k,k-1]; for j to n do if j<>k-1 then B[i,j]:=B[i,j]-B[i,k-1]*B[k,j]; fi; od; od; for j to n do
B[k-1,j]:=dotprod(a,subvector(B,1..n,j)); od; fi; od; if decomp then S:=[seq(B[k+1,j],j=k+1..n)],S; Danilevski(submatrix(B,1..k,1..k)); else S:=[seq(B[1,j],j=1..n)],S; fi; S; end: > A:=matrix(4,4,[1,2,3,4,2,1,2,3,5,2,-4,2,4,3,2,1]);
> Danilevski(A);
[-1,61,198,120]
> X:=charpoly(A,x);
> factor(X);
V. Jeux de tests
Pour raliser ce jeu de test, nous allons dclarer plusieurs matrices de test afin de vrifier lefficacit des diffrentes procdures implmentes. - une matrice symtrique : msym - une matrice asymtrique : masym - une matrice dont la diagonale infrieure est nulle : mdiagbas - une matrice dont la diagonale suprieur est nulle : mdiaghaut msym:=matrix([[9,4,6,5],[4,9,8,3],[6,8,9,2],[5,3,2,9]]);
> masym:=matrix([[5,4,3,1],[6,4,7,8],[1,3,4,7],[4,4,6,2]]);
> mdiagbas:=matrix(4,4,[1,2,3,4,0,7,5,8,0,0,6,1,0,0,0,8]);
> mdiaghaut:=matrix(4,4,[4,0,0,0,3,2,0,0,2,5,4,0,5,4,3,1]);
1.
> Danilevski(msym);charpoly(msym,x);
> Danilevski(masym);charpoly(masym,x);
> Danilevski(mdiagbas);
Error, (in Danilevski) numeric exception: division by zero
Ce rsultat est tout fait logique car cette premire version de la procdure de Danilevski ne traite pas les matrices ayant des pivots nuls.
2.
> Danilevski(msym);charpoly(msym,x);
> Danilevski(masym);charpoly(masym,x);
> Danilevski(mdiagbas);
Error, (in Danilevski) numeric exception: division by zero
> Danilevski(mdiaghaut);charpoly(mdiaghaut,x);
3.
> Danilevski(msym);charpoly(msym,x);
> Danilevski(masym);charpoly(masym,x);
La dernire procdure de Danilevski permet de trouver le polynme caractristique de nimporte quelle matrice.
VI. Conclusion