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

[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...

Vecteurs

> vec1:= <1,2,3> ; vec2:= <x|y|z> ;

vec1 := _rtable[13110304]

vec2 := _rtable[13110384]

Produits

> vec1 . vec2 ; vec2 . vec1;

_rtable[13128124]

x+2*y+3*z

Matrices : ne pas confondre lignes et colonnes !!!

> ma:= < < 1,2> | <3,4>>;
mb:= < <1|2> , <3|4>>;

ma := _rtable[13130436]

mb := _rtable[13132604]

Autre syntaxe

> Matrix([[1,2], [3,4]]);

_rtable[13136940]

Pour les nostalgiques

> matrix(3, 3, [53, 61, 23, 37, -31, 34, 42, -88, 76]); ma:= Matrix(%);

matrix([[53, 61, 23], [37, -31, 34], [42, -88, 76]]...

ma := _rtable[13139124]

> convert(ma, listlist);

[[53, 61, 23], [37, -31, 34], [42, -88, 76]]

> Dimension(vec1); Dimension(ma);

3

3, 3

>

Polynôme caractéristique

Définition

> linalg[det](x-ma): sort(%);

x^3-98*x^2-202*x+95658

> Determinant(ma); Trace(ma);

-95658

98

> CharacteristicPolynomial(ma, x): sort(%); fso:= fsolve(%);

x^3-98*x^2-202*x+95658

fso := -28.32866003, 38.40527260, 87.92338743

> fso;

-28.32866003, 38.40527260, 87.92338743

Valeur propre dominante

> Digits:=20:

> v0:= <1.,1.,1.>;

v0 := _rtable[13110664]

> ma . v0 : v1:= %/Norm(%) ;

v1 := _rtable[13110744]

> ma . v1 : v2:= %/Norm(%) ;

v2 := _rtable[13110784]

On construit une procédure pour faciliter les répétitions

> iter_ma := proc(v1);
ma .v1 : %/Norm(%) ;
end;

iter_ma := proc (v1) ma.v1; %/LinearAlgebra:-Norm(%...

L'opérateur @ est la composition et
@@ est la puissance de composition

> vec30:= (iter_ma@@30)(v0); vec31:= iter_ma(%); vec31-vec30;

vec30 := _rtable[13110864]

vec31 := _rtable[13110944]

_rtable[13111024]

> vp1:= Norm(ma . vec31);

vp1 := 87.9233874290694076

>

Valeur propre proche de 0

> mb:= 1./ma; iter_mb := proc (v1) mb.v1; %/LinearAlgebra:-Norm(%) end proc ;

mb := _rtable[13157236]

iter_mb := proc (v1) mb.v1; %/LinearAlgebra:-Norm(%...

> vec50:= (iter_mb@@50)(v0); vec51:= iter_mb(%); vec52:= iter_mb(%);

vec50 := _rtable[13111144]

vec51 := _rtable[13111224]

vec52 := _rtable[13111304]

> vec52-vec50;

_rtable[13111384]

> vp3:= 1/ Norm((mb . vec52));

vp3 := 28.328659143019950438

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 ;

major := proc (vec) local tri, liste; tri := proc (...
major := proc (vec) local tri, liste; tri := proc (...
major := proc (vec) local tri, liste; tri := proc (...
major := proc (vec) local tri, liste; tri := proc (...

> iter_mc := proc (v1) ; mc.v1; return %/major(%) ; end;

iter_mc := proc (v1) mc.v1; return %/major(%) end p...

On fait en sorte que la valeur propre devienne dominante

> mc:= 1/(ma-20);

mc := _rtable[13168668]

> vec50:= (iter_mc@@50)(v0); vec51:= iter_mc(%);

vec50 := _rtable[13111504]

vec51 := _rtable[13111584]

Et on transforme en sens inverse (ne pas oublier !!!)

> major(mc . vec51); 20 + 1/%;

.543322569321043267e-1

38.405272603522404300

> fso;

-28.32866003, 38.40527260, 87.92338743

>

Et pour une matrice quelconque

>

> mm:= RandomMatrix(4,4) + I*RandomMatrix(4,4) ;

mm := _rtable[13177020]

> v0:= RandomVector(4) + I* RandomVector(4)*1.;

v0 := _rtable[13111704]

> CharacteristicPolynomial(mm, x): poly:= sort(collect(%, x));

poly := x^4+(125-110*I)*x^3+(3412+1258*I)*x^2+(1833...

> fso:= fsolve(poly, x, complex);

fso := -133.99149898243370156+96.882419161030702518...
fso := -133.99149898243370156+96.882419161030702518...

> iter_mp := proc (v1) ; mp.v1; return %/major(%) ; end;

iter_mp := proc (v1) mp.v1; return %/major(%) end p...

On fait en sorte que la valeur propre devienne dominante

> mp:= 1/(mm-100*I) : evalf(%, 5);

_rtable[13183660]

> vec50:= (iter_mp@@50)(v0); vec51:= iter_mp(%); Norm(vec51-vec50 );

vec50 := _rtable[13111824]

vec51 := _rtable[13111904]

.496506830649454624e-15

Et on transforme en sens inverse (ne pas oublier !!!)

> major(mp . vec51); lambda:= 100*I + 1/%;

.205758420409893652e-1+.358467214176433086e-2*I

lambda := 47.169022071273780473+91.7823300239025503...

On vérifie en reportant

> subs(x=lambda, poly);

-.5103e-7+.113e-8*I

>

Matrice associée à un polynôme

Attention : polynôme unitaire uniquement

> poly:= x^4+randpoly(x, degree=3);

poly := x^4+77*x^3+66*x^2+54*x-5

> cm:= CompanionMatrix(poly);

cm := _rtable[13193244]

> CharacteristicPolynomial(cm, x) ;

x^4+77*x^3+66*x^2+54*x-5

>