function [xv,res,flag]=jacobi(A,b,x0,toll,nmax)

% Dati di ingresso:
% A: matrice n x n.
% b: vettore colonna n x 1
% x0: vettore colonna n x 1
% toll: tolleranza del criterio di arresto
% nmax: numero massimo di iterazioni.
% Dati di uscita:
% xv: vettore colonna n x 1 contenente un'approssimazione della soluzione.
% res: vettore contenente i residui.
% flag: 1 il processo non e' terminato correttamente.
%         0 altrimenti.

% controllo determinante di A
if det(A) == 0, xv=[]; res=[]; flag=1; 
    fprintf('\n \t La matrice A non risulta invertibile')
    return; end

% controllo determinante di M
M=diag(diag(A)); if det(M) == 0, xv=[]; res=[]; flag=1; 
    fprintf('\n \t Il metodo di Jacobi non risulta applicabile')
    return; end

xv=x0; N=M-A; invM=inv(M); B=invM*N; c=invM*b;

for k=1:nmax
    xv0=xv; % vecchia iterata
    xv=B*xv0+c; % nuova iterata
    res(k)=norm(A*xv-b,2); % step
    if res(k) <= toll
        flag=0;
        fprintf('\n \t Il metodo di Jacobi termina correttamente')
        return;
    end
end

flag=1;
fprintf('\n \t Il metodo di Jacobi non termina correttamente')

