aggiunto alcune info di promemoria, migliorato il ritorno di gauss pivoting con matrice di permutazione corretta, algoritmo di conversione matriciale in csr e primo abbozzo di ja jacobi su csr

This commit is contained in:
2014-11-08 16:23:08 +01:00
parent fa0d6f3f4f
commit c681da8b3c
6 changed files with 124 additions and 1 deletions

View File

@@ -6,7 +6,7 @@
%U=[10,20,30;1,5,3;4,56,34]; matrice di input
%b=[1;2;17]; termini noti
function [U,b,pivot] = convert_matrix_to_triangular_matrix_gauss_pivoting (U,b)
function [U,b,pivotp] = convert_matrix_to_triangular_matrix_gauss_pivoting (U,b)
n= length(b); % lunghezza del vettore dei termini noti o numero equazioni
@@ -63,6 +63,13 @@ function [U,b,pivot] = convert_matrix_to_triangular_matrix_gauss_pivoting (U,b)
end
b=U(:,n+1);
U=U(:,1:n);
pivotp=zeros(n);
theone= diag(diag(ones(n)));
for i=1:n
move = pivot(i);
pivotp(i,:)= theone(move,:);
end
end

View File

@@ -0,0 +1,55 @@
% jacobi algorithm
%input
%U=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] = jacobi_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);
x0=x1;
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

View File

@@ -0,0 +1,27 @@
function [array_elementi,array_colonna, array_inizio_riga ] = matrix_to_ordered_csr( A )
%conversione matrice in formato ordinato csr usando 3 array
sizem = size(A);
nelemento = 1;
array_elementi=[];
array_colonna=[];
array_inizio_riga=[];
for j=1:sizem(1)
array_inizio_riga(j)= nelemento;
for i=1:sizem(2)
if A(j,i)~= 0
array_elementi( nelemento)= A(j,i);
array_colonna ( nelemento) = i;
nelemento=nelemento + 1;
end
end
end
array_inizio_riga(j +1 )= nelemento;
end