Algebra.m % RISOLUZIONE DI SISTEMI
LINEARI E FATTORIZZAZIONI DI MATRICI help
algebra; dom=0; while dom==0
clear;
dom=0;
disp('Scegli il problema da risolvere : ');
err=0;
while err==0
disp('1.
Calcolo di fattorizzazioni di matrici');
disp('2. Risoluzione di sistemi lineari');
s=input('Introduci il numero corrispondente
: ');
if s~=1 & s~=2
disp('Il
valore introdotto é errato.Ricomincia');
else
err=1;
end end
if s==1
A=input('Introduci la matrice da
fattorizzare : ');
else
A=input('Introduci la matrice dei
coefficienti : ');
end
err=0;
while err==0
[m,n]=size(A);
if m<n
disp('Il numero di righe deve essere
maggiore o uguale a quello delle colonne');
A=input('Introducila nuovamente : ');
else
err=1;
end
end
%
verifica del tipo di matrice :
if n~=m
quadrata=0;
else
% se é quadrata;
quadrata=1;
end
rango=rank(A);
if rango<n
singolare=1;
else
%
se é singolare;
singolare=0;
end
if singolare==0
& quadrata==1
i=1;
tridiagonale=1;
while i<=n
j=1;
while j<=n
if j~=i & j~=i-1 & j~=i+1
% se é triangolare;
if A(i,j)~=0
tridiagonale=0;
j=n;
i=n;
end
end
j=j+1;
end
i=i+1;
end
i=1;
jac=1;
while i<=n
if A(i,i)==0
% se ha gli elementi della diagonale non
nulli;
jac=0;
i=n;
end
i=i+1;
end
i=1;
simmetrica=1;
while i<=n
j=1;
while j~=i & j<=n
if A(i,j)~=A(j,i)
simmetrica=0;
% se é simmetrica;
j=n;
i=n;
end
j=j+1;
end
i=i+1;
end
i=1;
if simmetrica==1
defpos=1;
while i<n
if det(A(1:i,1:i))<=0
% se é simmetrica definita positiva;
defpos=0;
i=n;
end
i=i+1;
end else
defpos=0;
end else
simmetrica=0;
defpos=0;
jac=0;
tridiagonale=0;
end
if s==1
disp('Scegli
il tipo di fattorizzazione : ');
if singolare==1 | quadrata==0
disp('1. Fattorizzazione LU (non
applicabile per questo tipo di matrice)');
else
disp('1. Fattorizzazione LU');
end
disp('2.
Fattorizzazione QR');
if defpos==0 | quadrata==0
disp('3. Fattorizzazione di Cholesky (non
applicabile per questo tipo di matrice)');
else
disp('3. Fattorizzazione di Cholesky ');
end
fatt=input('Introduci
il numero corrispondente : ');
err=0;
while err==0
if (fatt~=1 & fatt~=2 & fatt~=3)|(fatt==1
& (singolare==1 | quadrata==0))...
|(fatt==3 & (defpos==0 | quadrata==0))
fatt=input('Il valore introdotto é
errato.Introducilo di nuovo : ');
else
err=1;
end
end
%
Fattorizzazioni di matrici
if fatt==1
disp('Scegli il metodo di calcolo della
fattorizzazione LU : ');
disp('1. Utilizzando il metodo di
eliminazione di Gauss');
disp('2. Utilizzando la dimostrazione del
teorema di esistenza ed unicità della fattorizzazione ');
disp('3. Tecnica compatta');
disp('4. Metodo di Doolittle');
if simmetrica==0
disp('5. Metodo per matrici simmetriche
(non applicabile in questo caso)');
else
disp('5. Metodo per matrici simmetriche');
end
if tridiagonale==0
disp('6.
Metodo per matrici tridiagonali (non applicabile in questo caso)');
else
disp('6. Metodo
per matrici tridiagonali');
end
metlu=input('Introduci
il numero corrispondente : ');
err=0;
while err==0
if (metlu~=1 & metlu~=2 & metlu~=3
& metlu~=4 & metlu~=5 & metlu~=6)|...
(metlu==5
& simmetrica==0)|(metlu==6 & tridiagonale==0)
metlu=input('Il valore introdotto é
errato.Introducilo di nuovo : ');
else
err=1;
end
end
if
metlu==1
[L,U,risp]=lugauss(A,n);
% Metodo di eliminazione di Gauss
end
if metlu==2
[L,U,risp]=ludimost(A,n);
% Utilizzando la dimostrazione
end
if metlu==3
[L,U,risp]=lucompat(A,n);
% Tecnica compatta
end
if metlu==4
[L,U,risp]=ludoolit(A,n);
% Metodo di Doolittle
end
if metlu==5
fc=0;
[L,U,C,risp,r]=lusimm(A,n,fc);
% Metodo per matrici simmetriche
if r==1
disp('La
matrice di Cholesky di A é :');
C
end
end
if metlu==6
[L,U,risp]=lutrid(A,n);
% Metodo per matrici tridiagonali
end
if risp==0
disp('la
fattorizzazione LU della matrice : ');
disp(A);
disp('é la seguente : ');
L
U
dom=1;
else
disp('La fattorizzazione LU per questa
matrice non si può ottenere ');
err=0;
while err==0
disp('Scegli tra : ');
disp('1. Calcolare la fattorizzazione QR');
disp('2. Uscire dal programma');
s2=input('Introduci il numero
corrispondente : ');
if s2~=1
& s2~=2
disp('Il valore introdotto é errato.Ricomincia');
else
err=1;
end
end
if s2==1
fatt=2;
else
dom=1;
end
end end if fatt==2
[Q,R,risp]=fattqr(A,m,n);
if risp==0
disp('la fattorizzazione QR della matrice :
');
disp(A);
% Fattorizzazione QR
disp('é
la seguente : ');
Q
R
else
disp('La
fattorizzazione QR non si può ottenere');
disp('Ricomincia e utilizza un altro
metodo.');
end
dom=1;
end if fatt==3
disp('Scegli
il metodo di calcolo della fattorizzazione di Cholesky : ');
err=0;
while err==0
disp('1.
Tecnica compatta');
%
Fattorizzazione di Cholesky
disp('2. Metodo di Doolittle');
s2=input('Introduci il numero
corrispondente : ');
if s2~=1
& s2~=2
disp('Il valore introdotto é errato.Ricomincia');
else
err=1;
end
end
if s2==1
L=chocomp(A,n);
else
L=chodool(A,n);
end
disp('La
matrice di Cholesky della matrice : ');
disp(A);
disp('é la seguente : ');
L
dom=1;
end end
if s==2 & singolare==0
% Risoluzione di sistemi lineari
dom=1;
b=input('Introduci il vettore colonna
: ');
err=0;
while err==0
[o,h]=size(b);
if o~=m | h~=1
disp('Il
vettore introdotto ha dimensioni errate.Ricomincia');
b=input('Introduci nuovamente il vettore
colonna : ');
else
err=1;
end end
if quadrata==1
if b==zeros(m,1)
disp('L''unica soluzione é il vettore
nullo');
else
disp('Scegli
il metodo di risoluzione : ');
err2=0;
risp2=0;
while err2==0
disp('Utilizzare
:');
if risp2==0
disp('1. - Il metodo di eliminazione Gauss');
else
disp('1. - Il metodo di eliminazione Gauss
(Non applicabile in questo caso)');
end
disp('2.
- La strategia di pivoting parziale nel metodo di eliminazione di Gauss');
disp('3. - La strategia di pivoting totale
nel metodo di eliminazione di Gauss');
disp('4. - La fattorizzazione delle
matrici');
if jac==0 disp('5. -
Metodo di Jacobi (Non applicabile in questo caso.Fare un opportuno scambio di
righe)');
else disp('5. -
Metodo di Jacobi ');
end
if defpos==1
disp('6.
- Metodo di più ripida discesa');
else
disp('6. - Metodo di più
ripida discesa (non applicabile per questo tipo di matrici)');
end
sist=input('Introduci il numero
corrispondente : ');
err=0;
while err==0
if (sist~=1 & sist~=2 & sist~=3
& sist~=4 & sist~=5 & sist~=6)|(sist==1 & risp2==1)|...
(sist==5 & jac==0)|(sist==6 & defpos==0)
sist=input('Il
valore introdotto é errato.Introducilo di nuovo : ');
else
err=1;
end
end
if
sist==1
% Metodo di eliminazione Gauss
[x,risp]=gauss(A,b,n);
if risp==0
disp('Il vettore soluzione del sistema lineare é : ');
x
err2=1;
else
disp('Metodo non
applicabile ');
disp('Utilizzare le strategie di pivoting
oppure la fattorizzazione QR ');
risp2=1;
end
end
if sist==2
% Strategia di pivoting parziale
x=lupivpar(A,b,n);
disp('Il vettore soluzione del sistema
lineare é : ');
x
err2=1;
end
if sist==3
% Strategia di pivoting totale
x=lupivtot(A,b,n);
disp('Il vettore soluzione del sistema
lineare é : ');
x
err2=1;
end if
sist==4
% La fattorizzazione delle matrici
disp('Scegli il tipo di
fattorizzazione : ');
if risp2==1
disp('1.Fattorizzazione LU (non applicabile
in questo caso)');
else
disp('1. Fattorizzazione LU');
end
disp('2. Fattorizzazione
QR');
if defpos==0
disp('3. Fattorizzazione di Cholesky (non
applicabile in questo caso)');
else
disp('3. Fattorizzazione di Cholesky ');
end
sistf=input('Introduci il
numero corrispondente : ');
err=0;
while err==0
if (sistf~=1 & sistf~=2 & sistf~=3
& sistf~=4) | (sistf==1 & risp2==1) |...
(sistf==3
& defpos==0)
sistf=input('Il valore introdotto é
errato.Introducilo di nuovo : ');
else
err=1;
end
end
if sistf==1
% Utilizzando la fattorizzazione LU
if tridiagonale==1
% più conveniente
[L,U,risp]=lutrid(A,n);
else
if
simmetrica==1
fc=1;
[L,U,C,risp,r]=lusimm(A,n,fc);
else
[L,U,risp]=ludoolit(A,n);
end
end
if risp==0 & tridiagonale==1
z(1)=b(1);
for
i=2:n
z(i)=b(i)-L(i,i-1)*z(i-1);
end
x(n)=z(n)/U(n,n);
for i=n-1:-1:1
x(i)=(z(i)-U(i,i+1)*x(i+1))/U(i,i);
end
end
if risp==0 & tridiagonale==0
x=lurisol(L,U,b,n);
end
if risp==0
disp('Il vettore soluzione del sistema lineare é : ');
x
err2=1;
else
disp('Metodo
non applicabile ');
disp('Utilizzare le strategie di pivoting
oppure la fattorizzazione QR ');
risp2=1;
end
end
if sistf==2
% Utilizzando la fattorizzazione QR
[x,a,risp]=minquad(A,b,m,n);
disp('Il vettore soluzione del sistema
lineare é : ');
x
err2=1;
end
if sistf==3
% Utilizzando la fattorizzazione di
Cholesky
L=chodool(A,n);
disp('Il vettore soluzione del sistema lineare é : ');
x=lurischo(L,b,n)
err2=1;
end
end
if sist==5
[x,risp]=jacobi(A,b,n);
%
Metodo di Jacobi
if risp==0
disp('Il vettore soluzione del sistema
lineare é : ');
x=x';
x
err2=1;
else
disp('Metodo non
applicabile perché non convergente');
disp('Utilizzare altri metodi');
end end if
sist==6
% Metodo di più ripida discesa
e=input('Introduci l''errore massimo che si
può commettere (al massimo 0.1) : ');
err=0;
while err==0
if
e>0.1
| e<=0
disp(' Il valore dell''errore massimo
introdotto non é corretto');
e=input('Introducilo
nuovamente : ');
else
err=1;
end
end
disp('Il vettore soluzione del sistema lineare é : ');
x=meripdis(A,b,n,e)
err2=1;
end
end
end else
B=A;
B(1:m,n+1)=b;
if rank(B)==n+1
disp('Il
sistema non ammette soluzioni');
disp('Verrà calcolata quindi la soluzione
di minima norma ');
disp('utilizzando il problema dei minimi
quadrati ');
[x,a,risp]=minquad(A,b,m,n);
disp('la soluzione ai minimi quadrati é :');
x
disp('dove il vettore residuo ha norma 2
pari a : ');
a
else
[x,a,risp]=minquad(A,b,m,n);
disp('la soluzione é :');
x
end
end end
if s==2 & singolare==1
% caso di matrice singolare disp('Il
sistema non si può risolvere perché la matrice dei coefficienti non ha rango
massimo');
disp('Infatti ha rango :');
rango
dom=1;
end if
dom==1
fine=input('Se
vuoi ricominciare nuovamente premi il tasto ''1'' :');
if fine==1
dom=0;
end
end
|