diff --git a/functions/gauss_seidel_abs_ordered_csr.m b/functions/gauss_seidel_abs_ordered_csr.m new file mode 100644 index 0000000..63af2ea --- /dev/null +++ b/functions/gauss_seidel_abs_ordered_csr.m @@ -0,0 +1,54 @@ + +% gauss seidel algorithm + +%input +%elementi,colonne,indice_riga=ordered csr +%b=[1;2;17] termini noti +%x0 vettore di partenza +%toll tolleranza assoluta , esempio 1e-4 +%nmax numero massimo di passaggi, esempio 500 + + +%Ooutput +%x0 soluzione computata +%err errore assoluto 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_ordered_csr (elementi,colonne,indice_riga,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 + + while ( niter < nmax ) && ( err >= toll) + x0_old = x0; + for i=1:n + partial_sum = 0; + partial_sum2 = 0; + + start = indice_riga(i); + stop = start; + while colonne(stop)~= i + stop = stop +1; + end + for k=start:(stop -1) + partial_sum = partial_sum + (elementi(k) * x0(colonne(k))); + end + for k=(stop +1):(indice_riga(i+1) - 1) + partial_sum2 = partial_sum2 + (elementi(k) * x0(colonne(k))); + end + x0(i) = (b(i) - partial_sum - partial_sum2)/ elementi(stop) ; + end + niter = niter + 1; + err = norm(x0_old - x0,inf); + mex = [' Iterazione ', num2str(niter),' : ',mat2str(x0), ' Errore assoluto : ', num2str(err)]; + disp (mex) + end + if niter == nmax + disp('Warning: Massimo numero di step raggiunti') + ier = 1; + end + +end diff --git a/functions/gauss_seidel_rel_ordered_csr.m b/functions/gauss_seidel_rel_ordered_csr.m new file mode 100644 index 0000000..827c6e7 --- /dev/null +++ b/functions/gauss_seidel_rel_ordered_csr.m @@ -0,0 +1,54 @@ + +% gauss seidel algorithm + +%input +%elementi,colonne,indice_riga=ordered csr +%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_rel_ordered_csr (elementi,colonne,indice_riga,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 + + while ( niter < nmax ) && ( err >= toll) + x0_old = x0; + for i=1:n + partial_sum = 0; + partial_sum2 = 0; + + start = indice_riga(i); + stop = start; + while colonne(stop)~= i + stop = stop +1; + end + for k=start:(stop -1) + partial_sum = partial_sum + (elementi(k) * x0(colonne(k))); + end + for k=(stop +1):(indice_riga(i+1) - 1) + partial_sum2 = partial_sum2 + (elementi(k) * x0(colonne(k))); + end + x0(i) = (b(i) - partial_sum - partial_sum2)/ elementi(stop) ; + 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 diff --git a/functions/jacobi_ordered_csr.m b/functions/jacobi_abs_ordered_csr.m similarity index 89% rename from functions/jacobi_ordered_csr.m rename to functions/jacobi_abs_ordered_csr.m index eee75dc..fb4b8c4 100644 --- a/functions/jacobi_ordered_csr.m +++ b/functions/jacobi_abs_ordered_csr.m @@ -2,8 +2,8 @@ % jacobi algorithm %input -%U=ordered csr -%b=[1;2;17]; termini noti +%elementi,colonne,indice_riga=ordered csr +%b=[1;2;17] termini noti %x0 vettore di partenza %toll tolleranza assoluta , esempio 1e-4 %nmax numero massimo di passaggi, esempio 500 @@ -15,7 +15,7 @@ %niter numero di interazioni eseguite %ier 1 se il numero di iterazioni ha raggiunto nmax, 0 altrimenti -function [x0,err,niter,ier] = jacobi_ordered_csr (elementi,colonne,indice_riga,b,x0,toll,nmax) +function [x0,err,niter,ier] = jacobi_abs_ordered_csr (elementi,colonne,indice_riga,b,x0,toll,nmax) n= length(b); % lunghezza del vettore dei termini noti o numero equazioni niter = 0; diff --git a/functions/jacobi_rel_ordered_csr.m b/functions/jacobi_rel_ordered_csr.m new file mode 100644 index 0000000..21806ed --- /dev/null +++ b/functions/jacobi_rel_ordered_csr.m @@ -0,0 +1,55 @@ + +% jacobi algorithm + +%input +%elementi,colonne,indice_riga=ordered csr +%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] = jacobi_rel_ordered_csr (elementi,colonne,indice_riga,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 + x1 = x0;% solo per inizializzare + + while ( niter < nmax ) && ( err >= toll) + for i=1:n + partial_sum = 0; + partial_sum2 = 0; + + start = indice_riga(i); + stop = start; + while colonne(stop)~= i + stop = stop +1; + end + for k=start:(stop -1) + partial_sum = partial_sum + (elementi(k) * x0(colonne(k))); + end + for k=(stop +1):(indice_riga(i+1) - 1) + partial_sum2 = partial_sum2 + (elementi(k) * x0(colonne(k))); + end + x1(i) = (b(i) - partial_sum - partial_sum2)/ elementi(stop) ; + end + niter = niter + 1; + err = norm(x1 - x0,inf) / norm (x1,inf); + x0=x1; + 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