> restart:
TP 02
Valeurs propres, Vecteurs propres
Rappel de consignes
(1) titre en "Times New Roman", corps 36,
NOM Prénom - groupe
tp02 - date
(2) sauvegarder "souvent"
(3) imprimer : paginer (Format/Page_Number)
puis File/Preview.
enfin imprimer en deux colonnes
>
Matrices
> with(LinearAlgebra);
Vecteurs
> vec1:= <1,2,3> ; vec2:= <x|y|z> ;
Produits
> vec1 . vec2 ; vec2 . vec1;
Matrices : ne pas confondre lignes et colonnes !!!
>
ma:= < < 1,2> | <3,4>>;
mb:= < <1|2> , <3|4>>;
Autre syntaxe
> Matrix([[1,2], [3,4]]);
Pour les nostalgiques
> matrix(3, 3, [53, 61, 23, 37, -31, 34, 42, -88, 76]); ma:= Matrix(%);
> convert(ma, listlist);
> Dimension(vec1); Dimension(ma);
>
Polynôme caractéristique
Définition
> linalg[det](x-ma): sort(%);
> Determinant(ma); Trace(ma);
> CharacteristicPolynomial(ma, x): sort(%); fso:= fsolve(%);
> fso;
Valeur propre dominante
> Digits:=20:
> v0:= <1.,1.,1.>;
> ma . v0 : v1:= %/Norm(%) ;
> ma . v1 : v2:= %/Norm(%) ;
On construit une procédure pour faciliter les répétitions
>
iter_ma := proc(v1);
ma .v1 : %/Norm(%) ;
end;
L'opérateur @ est la composition et
@@ est la puissance de composition
>
vec30:= (iter_ma@@30)(v0); vec31:= iter_ma(%); vec31-vec30;
> vp1:= Norm(ma . vec31);
>
Valeur propre proche de 0
> mb:= 1./ma; iter_mb := proc (v1) mb.v1; %/LinearAlgebra:-Norm(%) end proc ;
> vec50:= (iter_mb@@50)(v0); vec51:= iter_mb(%); vec52:= iter_mb(%);
> vec52-vec50;
> vp3:= 1/ Norm((mb . vec52));
On a donc un problème de signe
>
Définir la bonne fonction de normalisation
La fonction de normalisation doit donner 1 comme valeur de plus grand module, et pas seulement un nombre de module 1
>
major:= proc(vec) local tri, liste ;
tri:= (a,b) -> evalb( evalf(abs(a)) > evalf(abs(b)) );
convert(vec, list); liste:= sort(%, tri);
return liste[1] ;
end ;
> iter_mc := proc (v1) ; mc.v1; return %/major(%) ; end;
On fait en sorte que la valeur propre devienne dominante
> mc:= 1/(ma-20);
> vec50:= (iter_mc@@50)(v0); vec51:= iter_mc(%);
Et on transforme en sens inverse (ne pas oublier !!!)
> major(mc . vec51); 20 + 1/%;
> fso;
>
Et pour une matrice quelconque
>
> mm:= RandomMatrix(4,4) + I*RandomMatrix(4,4) ;
> v0:= RandomVector(4) + I* RandomVector(4)*1.;
> CharacteristicPolynomial(mm, x): poly:= sort(collect(%, x));
> fso:= fsolve(poly, x, complex);
> iter_mp := proc (v1) ; mp.v1; return %/major(%) ; end;
On fait en sorte que la valeur propre devienne dominante
> mp:= 1/(mm-100*I) : evalf(%, 5);
> vec50:= (iter_mp@@50)(v0); vec51:= iter_mp(%); Norm(vec51-vec50 );
Et on transforme en sens inverse (ne pas oublier !!!)
> major(mp . vec51); lambda:= 100*I + 1/%;
On vérifie en reportant
> subs(x=lambda, poly);
>
Matrice associée à un polynôme
Attention : polynôme unitaire uniquement
> poly:= x^4+randpoly(x, degree=3);
> cm:= CompanionMatrix(poly);
> CharacteristicPolynomial(cm, x) ;
>