diff --git a/exercises/metodi_diretti_ex3_10.m b/exercises/metodi_diretti_ex3_10.m new file mode 100644 index 0000000..79b76dc --- /dev/null +++ b/exercises/metodi_diretti_ex3_10.m @@ -0,0 +1,44 @@ +U=[1.2,2.1,4.5;1.1,1.4,2.7;0.11,0.7,1.8] +b=[7.8;5.2;2.61] + +exact=[1,1,1]; + +%verifica singoalarita +if det(U) ~= 0 + disp('non singolare') +else + disp('singolare') +end + + +% 3 equazioni, 3 incognite +if det(U) ~= 0 + disp('ammette singola soluzione') +else + disp('nessuna o infinite soluzioni') +end + +%verifica condizionamento +condition= cond(U) + + + +%applico gauss naif +[x1,y1]=convert_matrix_to_triangular_matrix_gauss_naif(U,b) +s1=[linear_system_resolver_triangular_matrix(x1,y1)] + + +%applico gauss parziale +[x2,y2]=convert_matrix_to_triangular_matrix_gauss_pivoting(U,b) +s2=[linear_system_resolver_triangular_matrix(x2,y2)] + + + +% verifico errore tra soluzione calcolata e esatta +error_s1= norm(s1-exact,inf)/norm(exact,inf) +error_s2= norm(s2-exact,inf)/norm(exact,inf) + + + + + diff --git a/exercises/metodi_diretti_ex3_5.m b/exercises/metodi_diretti_ex3_5.m new file mode 100644 index 0000000..19eff28 --- /dev/null +++ b/exercises/metodi_diretti_ex3_5.m @@ -0,0 +1,38 @@ +U=[2,5,4;0,0,10;8,2,20] +b=[11;10;30] + +exact=[1,1,1]; + +%verifica singoalarita +if det(U) ~= 0 + disp('non singolare') +else + disp('singolare') +end + + + +if det(U) ~= 0 + disp('ammette singola soluzione') +else + disp('nessuna o infinite soluzioni') +end + +%verifica condizionamento +cond(U) + + +%applico gauss naif +convert_matrix_to_triangular_matrix_gauss_naif(U,b) + + +%applico gauss parziale +[x,y]=convert_matrix_to_triangular_matrix_gauss_pivoting(U,b) +x1=[linear_system_resolver_triangular_matrix(x,y)] + +% verifico errore tra x calcolata e esatta + +norm(x1-exact,inf)/norm(exact,inf) + + + diff --git a/exercises/metodi_diretti_ex3_7.m b/exercises/metodi_diretti_ex3_7.m new file mode 100644 index 0000000..f26cae0 --- /dev/null +++ b/exercises/metodi_diretti_ex3_7.m @@ -0,0 +1,37 @@ +U=[3,0.1,2;0.3,4,-1;3.3,4.1,1] +b=[5.1;3.3;8.4] + + + +%verifica singoalarita +if det(U) ~= 0 + disp('non singolare') +else + disp('singolare') +end + + + +if det(U) ~= 0 + disp('ammette singola soluzione') +else + disp('nessuna o infinite soluzioni') +end + +%verifica condizionamento +condition= cond(U) + + +%applico gauss naif +%[x1,y1]=convert_matrix_to_triangular_matrix_gauss_naif(U,b) +%s1=[linear_system_resolver_triangular_matrix(x1,y1)] + + +%applico gauss parziale +[x2,y2]=convert_matrix_to_triangular_matrix_gauss_pivoting(U,b) +s2=[linear_system_resolver_triangular_matrix(x2,y2)] + + + + + diff --git a/exercises/metodi_diretti_ex3_8.m b/exercises/metodi_diretti_ex3_8.m new file mode 100644 index 0000000..b4e7637 --- /dev/null +++ b/exercises/metodi_diretti_ex3_8.m @@ -0,0 +1,17 @@ +U=[3,0.1,0.2;0.3,4,-0.1;3.3,4.1,0.1] +b=[3.3;4.3;7.5] + + +%verifica singolarita +if det(U) ~= 0 + disp('non singolare') +else + disp('singolare') +end + + + + + + + diff --git a/exercises/metodi_diretti_test.m b/exercises/metodi_diretti_test.m new file mode 100644 index 0000000..b838284 --- /dev/null +++ b/exercises/metodi_diretti_test.m @@ -0,0 +1,38 @@ +U=[1e-15,5,4;3,2,10;8,2,20] +b=[11;10;30] + +exact=[1,1,1]; + +%verifica singoalarita +if det(U) ~= 0 + disp('non singolare') +else + disp('singolare') +end + + + +if det(U) ~= 0 + disp('ammette singola soluzione') +else + disp('nessuna o infinite soluzioni') +end + +%verifica condizionamento +cond(U) + + +%applico gauss naif +convert_matrix_to_triangular_matrix_gauss_naif(U,b) + + +%applico gauss parziale +[x,y]=convert_matrix_to_triangular_matrix_gauss_pivoting(U,b) +x1=[linear_system_resolver_triangular_matrix(x,y)] + +% verifico errore tra x calcolata e esatta + +norm(x1-exact,inf)/norm(exact,inf) + + + diff --git a/functions/convert_matrix_to_triangular_matrix_gauss_naif.m b/functions/convert_matrix_to_triangular_matrix_gauss_naif.m index 1940302..9f7ccdd 100644 --- a/functions/convert_matrix_to_triangular_matrix_gauss_naif.m +++ b/functions/convert_matrix_to_triangular_matrix_gauss_naif.m @@ -10,25 +10,18 @@ function [U,b] = convert_matrix_to_triangular_matrix_gauss_naif (U,b) n= length(b); % lunghezza del vettore dei termini noti o numero equazioni + norma = norm(U,inf); U= [U,b]; % uniamo la matrice con la colonna dei termini noti ok=1; - %check 0 sulla diagonale - for i=1:n - if U(i,i) == 0 - ok=0; - break - end - end - - if ok == 0 - disp('impossibile convertire') - b=[]; - U=[]; - else % convertiamo la matrice in una triangolare superiore for i=1:1:n-1 + + if abs(U(i,i)) <= eps * norma + disp('WARNING: Elemento prossimo allo zero sulla diagonale') + end + if U(i,i) == 0 ok=0; break @@ -42,15 +35,16 @@ function [U,b] = convert_matrix_to_triangular_matrix_gauss_naif (U,b) end - if ok == 0 || U(n,n)== 0 + if ok == 0 || U(n,n) == 0 disp('impossibile convertire') b=[]; U=[]; else - + if abs(U(n,n)) <= eps * norma + disp('WARNING: Elemento prossimo allo zero sulla diagonale') + end b=U(:,n+1); U=U(:,1:n); end - end end diff --git a/functions/convert_matrix_to_triangular_matrix_gauss_pivoting.m b/functions/convert_matrix_to_triangular_matrix_gauss_pivoting.m index 986dcfb..9bc146f 100644 --- a/functions/convert_matrix_to_triangular_matrix_gauss_pivoting.m +++ b/functions/convert_matrix_to_triangular_matrix_gauss_pivoting.m @@ -10,6 +10,7 @@ function [U,b,pivot] = convert_matrix_to_triangular_matrix_gauss_pivoting (U,b) n= length(b); % lunghezza del vettore dei termini noti o numero equazioni + norma = norm(U,inf); U= [U,b]; % uniamo la matrice con la colonna dei termini noti pivot = 1:1:n; pivot = pivot'; @@ -17,9 +18,15 @@ function [U,b,pivot] = convert_matrix_to_triangular_matrix_gauss_pivoting (U,b) % convertiamo la matrice in una triangolare superiore for i=1:1:n-1 x_max = max ( abs(U(i:n,i)) ); + + if x_max <= eps * norma + disp('WARNING: Elemento prossimo allo zero sulla diagonale') + end + if x_max == 0 break else + %trovo gli indici di tutti i numeri uguali a max [x,y]= ind2sub(size(U), find (abs(U(i:n,i)) == x_max) ); x=x(1);%prendo solo il primo indice @@ -51,6 +58,9 @@ function [U,b,pivot] = convert_matrix_to_triangular_matrix_gauss_pivoting (U,b) U=[]; pivot = []; else + if abs(U(n,n)) <= eps * norma + disp('WARNING: Elemento prossimo allo zero sulla diagonale') + end b=U(:,n+1); U=U(:,1:n); end