function A = qr_shift (A, mu, tol)
%
% function A = qr_shift (A, mu, tol)
%
% Applica il metodo QR con shift. Se mu = 'auto', mu viene scelto come
% l'ultimo elemento diagonale corrente. Gli elementi minori in modulo
% di tol vengono posti a zero. ATTENZIONE: l'algoritmo non termina, ha
% solo scopo illustrativo.
%
if ((nargin <= 1) || isempty (mu))
  mu = 0;
  mu_n = mu;
elseif (isscalar (mu))
  mu_n = mu;
end
if (nargin <= 2)
   tol = 1e-6;
end
n = length (A);
I = eye (size (A));
its = 1;
b = 'a';
while ~strcmp(b, 'q')
  if (strcmp (mu, 'auto'))
    mu_n = A(n,n);
    mu_n
  end
  [Q, R] = qr (A - mu_n * I);
  A = R * Q + mu_n * I;
  its
  A(abs(A)<tol) = 0
  b = input ('Invio per continuare, q per interrompere: ', 's');
  its = its + 1;
end
%!demo % converge a triangolare
%! A = [1, 2; 2, 1];
%! qr_shift (A, 0)
%!demo % converge a triangolare a blocchi
%! A = [0, 0, 2; 1, 0, 1; 0, 1, 1];
%! qr_shift (A, 0)
