function [sol,iter,err]=GaussSeidel(A,b,x0,tol,kmax)
% ----------------------------------------------
% Funzione che implementa il metodo iterativo
% di Gauss-Seidel
%-----------------------------------------------
% Inputs
% A, b: matrice e termine noto, rispettivamente
% x0  : guess iniziale
% tol : tolleranza calcoli
% 
% Outputs
% sol : vettore soluzione
% iter: numero delle iterazioni
%-----------------------------------------------
n=length(x0);

D=diag(diag(A));
L=tril(A)-D;
U=triu(A)-D;
DI=inv(D+L);
GS=-DI*U;
disp('raggio spettrale matrice iterazione di Gauss-Seidel');
max(abs(eig(GS)))
b1=DI*b;

x1=GS*x0+b1;
k=1;
err(k)=norm(x1-x0,inf); 

while(err(k)>tol*norm(x0,inf) & k<=kmax)
    x0=x1;
    for i=1:n,
     xx1=0; xx2=0;
     xx1=-sum(A(i,1:i-1)/A(i,i)*x1(1:i-1));
     xx2=-sum(A(i,i+1:n)/A(i,i)*x0(i+1:n));
     x1(i)=xx1+xx2+b(i)/A(i,i);
    end
    k=k+1;
    err(k)=norm(x1-x0,inf);
end

sol=x1;
iter=k-1;
