% Valeurs propres et vecteurs propres d'une matrice
clear all   % supprimer toutes les variables A

format short

disp('-----------------------------------------------');
fprintf(' \n')
disp('Valeurs propres et vecteurs propres d''une matrice')
% disp('Cas 1: Eigenvalues and Eigenvectors of Matrix')
fprintf(' \n \n')
disp('Utiliser la fonction ''gallery'' pour créer une matrice.')
disp('(La fonction ''gallery'' génère plusieurs matrices intéressantes; voir la ');
disp(' documentation pour la liste complète d''exemples.)')

%disp('(1.1) Use gallery to create a circulant matrix:')
%disp('           (gallery function generates GALLERY Higham test matrices)')
% fprintf(' \n')
disp('>> A = gallery(''circul'',3) ')

A = gallery('circul',3)

disp('-----------------------------------------------');
pause;

 fprintf(' \n')
disp('Calculer les valeurs propres et les vecteurs propres de A:')
% fprintf(' Calculate the eigenvalues and right eigenvectors of A.\n')
disp('>> [V,D] = eig(A)  :  la colonne i de V est un vecteur propre de A')
disp('                      et sa valeur propre correspondante est D(i,i)')
[V,D] = eig(A)

disp('-----------------------------------------------');

 pause

fprintf(' \n')
disp('Vérifier que V et D obtenus satisfont AV=VD:')
disp('>> A*V - V*D')
A*V - V*D

disp('Comme toujours, puisqu''il s''agit d''erreures d''arrondissement,')
disp('A*V - V*D n''est pas exactement 0.  Il faut juger si l''erreure est ')
disp('suffisament petite pour vos besoins.')

disp('-----------------------------------------------');

pause
fprintf(' \n')

disp('Le cas d''une matrice non diagonalisable (défectueuse)')
% disp(' Cas 3: Eigenvalues of Nondiagonalizable (Defective) Matrix')

fprintf(' \n')
disp(' >> B = [3 1 0; 0 3 1; 0 0 3];')

B = [3 1 0; 0 3 1; 0 0 3];

fprintf(' \n')

disp('Considèrons la matrice de vecteurs propres qu''on obtient avec eig(B):')
disp(' >> [V,D] = eig(A); V')

[V,D] = eig(B); V

disp(' Les vecteurs propres en V ne sont pas indépendants.  Cependant, AV=VD!')
disp(' Que V n''est pas inversible signifie que B n''est pas diagonalisable.')
  
disp('-----------------------------------------------');
pause
fprintf(' \n')

disp('Le cas défectueux:  Forme de Jordan')

disp('Si vous n''avez pas le Symbolic Math Toolbox, l''étape suivante')
disp('va donner une erreure; utiliser l''autre méthode à sa place.')

disp('>> C=    [ 0     0     1;     -7     2     3;   -10    -1     7]')

C=    [ 0     0     1;     -7     2     3;   -10    -1     7]

[U,J]=jordan(C)

disp('-----------------------------------------------');
pause
fprintf(' \n')
disp('On vérifie que CU=UJ:')
disp('>> norm(C*U-U*J)  ---- pour décider si la différence est petite.');

norm(C*U-U*J)

disp('Notons que la première colonne de U est le seule vecteur propre de C');
disp('>> [V,D]=eig(C); V(:,1)-U(:,1)   ---- comparer les premières colonnes');

[V,D]=eig(C); V(:,1)-U(:,1) 

disp('-----------------------------------------------');
pause
fprintf(' \n')

disp('Vous avez également accès au polynôme caractéristique et au polynôme')
disp('minimal, avec le symbolic math toolbox:')

disp('>> P=charpoly(A)  ---- donne le vecteur de coéfficients de p')

P=charpoly(A)

disp('>> syms x    --- cré le variable x')
syms x

disp('>> PA=charpoly(A,x)   ---- donne le polynôme caractéristique en x')

PA=charpoly(A,x)

disp('>> MA=minpoly(A,x)  ---- on peut également avoir le polynôme minimal.')
MA=minpoly(A,x)

fprintf(' \n')
disp('Fin de vecprop') 


