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:
@@ -6,7 +6,7 @@
|
|||||||
%U=[10,20,30;1,5,3;4,56,34]; matrice di input
|
%U=[10,20,30;1,5,3;4,56,34]; matrice di input
|
||||||
%b=[1;2;17]; termini noti
|
%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
|
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
|
end
|
||||||
b=U(:,n+1);
|
b=U(:,n+1);
|
||||||
U=U(:,1:n);
|
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
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
55
functions/jacobi_ordered_csr.m
Normal file
55
functions/jacobi_ordered_csr.m
Normal 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
|
||||||
27
functions/matrix_to_ordered_csr.m
Normal file
27
functions/matrix_to_ordered_csr.m
Normal 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
|
||||||
|
|
||||||
9
samples/applicazione_algoritmi_time.m
Normal file
9
samples/applicazione_algoritmi_time.m
Normal 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
10
samples/floating_rule.m
Normal 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
|
||||||
15
samples/general_commands.m
Normal file
15
samples/general_commands.m
Normal 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
|
||||||
Reference in New Issue
Block a user