function [xv,step,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.
% step: vettore contenente gli step.
% flag: 1 il processo non e' terminato correttamente.
%         0 altrimenti.

% controllo determinante di A
if det(A) == 0, xv=[]; step=[]; flag=1; return; end

% controllo determinante di M
M=diag(diag(A)); if det(M) == 0, xv=[]; step=[]; flag=1; 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
    step(k)=norm(xv-xv0,2); % step
    if step(k) <= toll
        flag=0;
        return;
    end
end

flag=1;

