% gauss seidel algorithm %input %U= matrice di input compattata %b=[1;2;17]; termini noti %x0 vettore di partenza %toll tolleranza relativa , esempio 1e-4 %nmax numero massimo di passaggi, esempio 500 %Ooutput %x0 soluzione computata %err errore relativo computato %niter numero di interazioni eseguite %ier 1 se il numero di iterazioni ha raggiunto nmax, 0 altrimenti function [x0,err,niter,ier] = gauss_seidel_abs_compact (U,b,x0,toll,nmax) n= length(b); % lunghezza del vettore dei termini noti o numero equazioni niter = 0; ier = 0; err = inf;% err infinito per superare subito toll %detect right and left x=1; y=1; right= 0; while U(x,y)==0 right = right + 1; x=x+1; end dim= size(U); dimx=dim(1); left = dimx - right - 1; %begin iterations while ( niter < nmax ) && ( err >= toll) x0_old = x0; for i=1:n partial_sum = 0; partial_sum2 = 0; kend = min (left, i - 1); for k=1:kend partial_sum = partial_sum + ( U(right +1 +k,i-k) * x0(i-k)); end kend = min (right, n - i); for k=1: kend partial_sum2 = partial_sum2 + ( U(right+1-k,i+k) * x0(i+k)); end x0(i) = (b(i) - partial_sum - partial_sum2)/U(right +1,i) ; end niter = niter + 1; err = norm(x0_old - x0,inf)/norm(x0,inf); mex = [' Iterazione ', num2str(niter),' : ',mat2str(x0), ' Errore relativo : ', num2str(err)]; disp (mex) end if niter == nmax disp('Warning: Massimo numero di step raggiunti') ier = 1; end end