function [xapp,r,delta]=iterativi_SistLin(A,b,x0,toll,label)
%% Approssimazione della soluzione di
% Ax=b    (A invertibile)
% INPUT:  A, b, x0, vettore con le tolleranze, metodo
% OUTPUT: soluzione approssimata, residuo,
%         differenza tra due iterate successive (in norma)
% Implementare il metodo di Jacobi
% Costruire una successione x_k
%
% Test d'arresto sul residuo e su ||x_k+1-x_k||
% RESIDUO al passo k: ||A*x_k-b||


toll1=toll(1) ;
tollr=toll(2) ;
normb=norm(b,2) ;
r=norm(A*x0-b,2)/normb ;
disp(['Residuo iniziale: ' num2str(r)])
n=length(x0) ;  % n=length(A(1,:)) ;
% Inizializzazioni
xapp=x0 ;   
x=zeros(n,1) ;
k=0 ;
Kmax=500 ;
delta=10 ;
if label==1
   % Matrice di iterazione (Jacobi)
   % B=I-(D^(-1))*A
   B=eye(n)-diag(1./diag(A))*A ;
   disp(['Matrice di iterazione: ' mat2str(B)])
   % Calcolo del raggio spettrale di B
   v=eig(B) ;
   ro=max(abs(v)) ;
   disp(['Raggio spettrale della matrice di iterazione (Jacobi): ' num2str(ro)])
   if ro>=1
       Kmax=0 ;
       disp('Il metodo di Jacobi non converge')
   end
end

while r>=tollr && k<Kmax && delta>=toll1
% Calcolo iterata successiva
% x(i)_(k+1)=(b(i)-sum(A(i,j)*x(j)_k)_(j diverso da i))/A(i,i)
% x_(k+1)=B*x_(k)+D^(-1)*b
 if label==1
    for i=1:n
      x(i)=(b(i)-A(i,1:i-1)*xapp(1:i-1)-A(i,i+1:n)*xapp(i+1:n))/A(i,i) ;
    end
 elseif label==2
    for i=1:n
      x(i)=(b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*xapp(i+1:n))/A(i,i) ;
    end
 else
     disp('Altri metodi...')
 end
  delta=max(abs(x-xapp))/max(abs(xapp)) ;
  xapp=x ;
  r=norm(A*xapp-b,2)/normb ;
  k=k+1 ;    
end
disp(['Numero di iterazioni: ' num2str(k)])
if k<Kmax || r<tollr || delta<toll1
    disp('*****  ***** Il metodo CONVERGE *****  *****')
end

end


