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

View File

@@ -0,0 +1,9 @@
sostituzione allindietro n^2
gauss naif e pivot n^3
kramer fattoriale
thomas lineare
diag dominante e simemtrica positiva - gauss naif stabile
diag dominante- jacobi e gauss seidel convergenti
simmetrica positiva - gauss seidel convergente

10
samples/floating_rule.m Normal file
View File

@@ -0,0 +1,10 @@
realmin 2.23 e-308 min normalizzato
realmax 1.79 e308 max normalizzato
eps 2.2 e-16
format long e
minimo numero in matlab 4.9e-324 - non normalizzato
se pi<EFBFBD> piccolo <EFBFBD> 0
se due numeri distano per pi<EFBFBD> di e-16 in pratica non vengono sentiti nella somma

View File

@@ -0,0 +1,15 @@
diag (diag(...)) (estrae una matrice diagonale)
tril(...) (estrae il triangolo inferiore)
inv(...) (inversa di una matrice)
max (...) (massimo di un vettore)
abs(...) (valore assoluto di un vettore componenteper componente)
eig(...) (autovalori di una matrice)
cond(...) (indice di condizionamento di una matri
chol(...) (fattorizzazione di Cholesky di una matrice
lu(...) (fattorizzazione lu di una matrice)
norm (norma di un vettore o di una matrice)
' (trasposta di una matrice)
. (operazioni componente per componente)
help (fornisce informazioni sui comandi in linea di matlab
clear all (cancella tutte le variabili)
clc