Vous êtes sur la page 1sur 10

Mthode de Danilevski

Probleme 5

Dossier MAPLE

2004-2005

I.

Introduction

II. Expos mathmatique III. Algorithme dtaill IV. Procdures et rsultats


Fonction permettant de crer une matrice de Frobenius
On initialise la session de travail en incluant la bibliothque de gestion des matrices > restart: > with(linalg):
Warning, the protected names norm and trace have been redefined and unprotected

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);

Calcule l'inverse de la matrice P M:=inverse(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]);

> Danilevski(A); > charpoly(A,x);

> > 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.

Premire procdure de Danilevski

> 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.

Deuxime procdure de Danilevski

> 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.

Troisime procdure de Danilevski

> Danilevski(msym);charpoly(msym,x);

> Danilevski(masym);charpoly(masym,x);

> Danilevski(mdiagbas);charpoly(mdiagbas,x); [22,-167,482,-336]

> Danilevski(mdiaghaut);charpoly(mdiaghaut,x); [11,-42,64,-32]

La dernire procdure de Danilevski permet de trouver le polynme caractristique de nimporte quelle matrice.

VI. Conclusion