clear
%---------------------------------------------------
% Metodo QR con shift per il calcolo di tutti gli autovalori di 
% una data matrice quadrata A
%---------------------------------------------------
tol=1.e-10;
A=[30 1 2 3;4 15 -4 -2; -1 0 3 5; -3  5 0 -1];

% Altre matrici interesanti
%--------------------------------------------------
%alfa=input('Dammi alfa = ')
%A=[alfa 2 3 10; 5 12 10 7; 9 7 6 13; 4 16 18 0];
%------------------------------------------------
% -> Matrice testo Quarteroni e Saleri, 
%                                  pag. 149 <--
%A=[alfa 2 3 13; 5 11 10 8; 9 7 6 12; 4 14 15 1];
%------------------------------------------------
% -> Matrice testo Quarteroni e Saleri,
%                                   pag. 155 <--
% A=[30 1 2 3; 4 15 -4 -2; -1 0 3 5; -3 5 0 -1];
%------------------------------------------------
%------------------------------------------------
% -> Matrice testo Quarteroni, Sacco e Saleri, 
%---------------------------------------------------------
%                                   pag. 178 <--
% A=[17 24 1 8 15; 23 5 7 14 16; 4 6 13 20 22; 10 12 19 21 3; 11 18 25 2 9];
%------------------------------------------------
iter_max=1000;
n=max(size(A));
[Q,R]=qr(A);
T=Q*R;
iter=1;
for k=n:-1:2,
    I=eye(k);
    while convergenzaQRShift(T,tol,k)==0 & iter <= iter_max,
     mu=T(k,k);
     [Q,R]=qr(T(1:k,1:k)-mu*I);
     T(1:k,1:k)=R*Q+mu*I;
     iter=iter+1;
    end
T(k,k-1)=0;
end

% Alla fine T rappresenta la matrice triangolare superiore 
% avente gli autovalori di A lungo la diagonale.
iter

% Verifica
disp('Calcolo del residuo diag(T)-eig(A) ' )
norm(diag(T),2)-norm(eig(A),2)



