function r=rayonspectral (A,X,k); 

% r= rayonspectral(A,X,k); 
% Calcule (de manière approchée) le rayon spectral
% d'une matrice A (réelle ou complexe) de taille (N,N), diagonalisable et
% présentant une unique valeur propre de module maximal, à partir de
% l'algorithme itératif initié au vecteur X et itéré k fois.

x=X; 
for i=1:k
    y=A*x;
    x=y/norm(y); 
end
r=norm(y); 


function [r,Niter]=rayonspectral1(A,X,epsilon,k); 

% [r,Niter] = rayonspectral1 (A,X,epsilon,k); 
%Calcule de manière approchée le rayon spectral d'une matrice 
%réelle ou complexe A de taille (N,N). L'algorithme est initié 
%au vecteur X (de taille (N,1). Le nombre d'itérations 
%autorisées est k. La sortie Niter correspond au nombre d'itérations nécessaires 
%pour que abs(r(k+1)-r(k) finisse par devenir inférieur ou égal au seuil epsilon. 

x=X;
r=1; 
err=2*epsilon; 
Niter=0; 
while (err>epsilon) && (Niter<k) 
    rold=r; 
    y=A*x;
    r=norm(y);
    x=y/r; 
    err=abs(r-rold); 
    Niter=Niter+1; 
end 

function [VP,Niter]=AppVPdom(A,X,epsilon,k); 

% [VP,Niter] = AppVPdom(A,X,epsilon,k); 
%Calcule le vecteur propre approchant un vecteur propre associé au rayon
%spectral r d'une matrice A de taille (N,N)) (correspondant à une valeur
%propre réelle). L'algorithme est initié au vecteur X (de taille (N,1)). Le
%nombre d'itérations autorisées est k. La sortie Niter correspond au nombre
%d'itérations nécessaires avant que : 
% min(norm(VP(p+1)-VP(p)),norm(VP(p+1)+VP(p))) <=epsilon. 

VP=X/norm(X); %ligne modifiee (cf. rayonspectral1)   
err=2*epsilon; 
Niter=0; 
while (err>epsilon) && (Niter<k) 
    VPold=VP; %ligne modifiee (cf. rayonspectral1)
    y=A*VPold; %ligne modifiee (cf. rayonspectral1)  
    r=norm(y);
    VP=y/r; %ligne modifiee (cf. rayonspectral1)
    err=min(norm(VP-VPold),norm(VP+VPold)); %ligne modifiee (cf. rayonspectral1) 
    Niter=Niter+1; 
end 


function [VP,Niter,errY]=AppVPdom1(A,X,Y,epsilon,k); 

% [VP,Niter,errY] = AppVPdom1(A,X,Y,epsilon,k); 
%Calcule le vecteur propre approchant un vecteur propre associé au rayon
%spectral r d'une matrice A de taille (N,N) (correspondant à une valeur
%propre réelle). L'algorithme est initié au vecteur X (de taille (N,1)). Le
%nombre d'itérations autorisées est k. La sortie Niter correspond au nombre
%d'itérations nécessaires avant que : 
% min(norm(VP(p+1)-VP(p)),norm(VP(p+1)+VP(p))) <=epsilon.
%La liste errY figure la liste des erreurs :
% min(norm(VP(k)-Y),norm(VP(k)+Y)), k=1,...,Niter. 

VP=X/norm(X);  
err=2*epsilon; 
Niter=0; 
errY=[]; %ligne ajoutee (cf. AppVPdom)
while (err>epsilon) && (Niter<k) 
    VPold=VP; 
    y=A*VPold;
    r=norm(y);
    VP=y/r; 
    err=min(norm(VP-VPold),norm(VP+VPold)); 
    errY=[errY,min(norm(VP-Y),norm(VP+Y))]; %ligne ajoutee (cf. AppVPdom) 
    Niter=Niter+1; 
end 

function [VP,Niter,errY]=AppVPdom1bis(A,X,Y,epsilon,k); 

% [VP,Niter,errY] = AppVPdom1bis(A,X,Y,epsilon,k); 
%Calcule le vecteur propre approchant un vecteur propre associé au rayon
%spectral r d'une matrice A de taille (N,N)) (correspondant à une valeur
%propre réelle). L'algorithme est initié au vecteur X (de taille (N,1)). Le
%nombre d'itérations autorisées est k. La sortie Niter correspond au nombre
%d'itérations nécessaires avant que : 
% min(norm(VP(p+1)-VP(p)),norm(VP(p+1)+VP(p))) <=epsilon.
%La liste errY figure la liste des erreurs :
% min(norm(VP(k)-Y,inf),norm(VP(k)+Y,inf)), k=1,...,Niter. 

VP=X/norm(X,inf); %changement de norme 
err=2*epsilon; 
Niter=0; 
errY=[]; %ligne ajoutee (cf. AppVPdom)
while (err>epsilon) && (Niter<k) 
    VPold=VP; 
    y=A*VPold;
    r=norm(y,inf); %changement de norme 
    VP=y/r; 
    err=min(norm(VP-VPold,inf),norm(VP+VPold,inf)); %changement de norme 
    errY=[errY,min(norm(VP-Y,inf),norm(VP+Y,inf))]; %ligne ajoutee (cf. AppVPdom)
    %+ changement de norme  
    Niter=Niter+1; 
end 

