Autoval.m % CALCOLO DEGLI
AUTOVALORI DI UNA MATRICE help
autoval; inizio=0; while inizio==0 clear; inizio=0; A=input('Introduci
la matrice (di ordine almeno 2x2) : '); dom=0; while dom==0
[n,m]=size(A);
if m~=n | n==1
disp('La
matrice deve essere quadrata e di ordine almeno 2x2');
A=input('Introduci nuovamente la matrice:');
else
dom=1;
end end if rank(A)==0
disp('Hai
introdotto una matrice nulla per cui i suoi autovalori sono tutti nulli'); else singolare=1; if rank(A)<n
singolare=0; end i=1;
% verifica del tipo di matrice: simmetrica=1; while
i<=n
j=1;
% se é simmetrica
while j~=i & j<=n
if A(i,j)~=A(j,i)
simmetrica=0;
tridiagonale=0;
j=n;
i=n;
end
j=j+1;
end
i=i+1; end if
simmetrica==1
% se é tridiagonale simmetrica
i=3;
tridiagonale=1;
while i<=n
j=1;
while j<=i-2
if A(i,j)~=0
tridiagonale=0;
j=i;
i=n;
end
j=j+1;
end
i=i+1;
end end disp('Scegliere
tra i seguenti metodi di calcolo degli autovalori: '); dom=0; while dom==0
disp('1.
Metodo delle potenze (per il calcolo dell''autovalore di modulo minimo)');
if singolare==0
disp('
(non applicabile per questo tipo di matrice) ');
end
disp('2. Metodo
delle potenze (per il calcolo dell''autovalore di modulo massimo)');
disp('3. Metodo delle potenze inverse (per
il calcolo di un particolare autovalore)');
disp('4. Metodo di calcolo di tutti gli
autovalori reali di matrici triangolari simmetriche');
if tridiagonale==0
disp('
(non applicabile per questo tipo di matrice) ');
end
if simmetrica==1
disp('5.
Metodo di calcolo dell''autovalore minimo per matrici simmetriche');
disp('6. Metodo di calcolo dell''autovalore
massimo per matrici simmetriche');
else disp('5.
Metodo di calcolo dell''autovalore
di modulo minimo per matrici simmetriche ');
disp('
(non applicabile per questo tipo di matrice)'); disp('6.
Metodo di calcolo dell''autovalore massimo per matrici simmetriche');
disp('
(non applicabile per questo tipo di matrice)');
end
disp('7. Metodo
QR (per il calcolo di tutti gli autovalori)');
if simmetrica==0
disp(' ATTENZIONE : i primi 3 metodi
convergono sempre SOLO SE la matrice ha solo autovalori reali ');
end
s=input('Introduci
il numero corrispondente : ');
err=0;
while err==0
if (s~=1 & s~=2 & s~=3 & s~=4
& s~=5 & s~=6 & s~=7 ) | (s==1 & singolare==0) | ...
(s==4 & tridiagonale==0) | ((s==5 | s==6) & simmetrica==0)
s=input('Il
valore introdotto é errato.Introducilo di nuovo : ');
else
err=1;
end end % METODO DELLE POTENZE
PER IL CALCOLO DELL'AUTOVALORE DI MODULO MINIMO oppure % CALCOLO DELL'
AUTOVALORE DI MODULO MINIMO DI UNA MATRICE SIMMETRICA
if s==1 | s==5
if simmetrica==0
[l,risp]=autmin(A,n);
else
[l,risp]=autmin(A,n);
end
if risp==1
disp('Metodo
non applicabile');
disp('Utilizzare altri metodi se possibile');
else
dom=1;
disp('L''autovalore di modulo minimo della
matrice : ');
disp(A);
disp('é il seguente : ');
l
end
end % METODO DELLE POTENZE
PER IL CALCOLO DELL'AUTOVALORE DI MODULO MASSIMO oppure % CALCOLO DELL'
AUTOVALORE DI MODULO MINIMO DI UNA MATRICE SIMMETRICA
if s==2 | s==6
if simmetrica==0
l=autmax(A,n);
else
l=autmaxsi(A,n);
end
dom=1;
disp('L''autovalore di modulo massimo della
matrice : ');
disp(A);
disp('é il seguente : ');
l
end % METODO DELLE POTENZE
INVERSE
if s==3
[H,risp]=aupotinv(A,n,simmetrica);
if risp==1
disp('Metodo non applicabile');
disp('Utilizzare altri metodi se possibile
oppure fissare un autovalore approssimato diverso :');
disp('Scegli nuovamente : ');
else
dom=1;
disp('L''autovalore della matrice : ');
disp(A);
disp('é il seguente : ');
H
end
end % METODO DI CALCOLO DI
TUTTI GLI AUTOVALORI REALI DELLE MATRICI TRIDIAGONALI SIMMETRICHE
if s==4
e=input('Introduci l''errore massimo che si
può commettere (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('Tutti gli autovalori della matrice
:');
disp(A);
disp('sono i seguenti : ');
l=auttrsim(A,n,e);
l=l'
dom=1;
end % METODO QR
if s==7
[l,risp]=autmetqr(A,n);
dom=1;
if risp==0
disp('Tutti
gli autovalori della matrice :');
disp(A);
disp('sono i seguenti : ');
l=l'
else
disp('Metodo
non applicabile. Provare con gli altri se é possibile');
end end end end inizio=input('Se
vuoi ricominciare nuovamente premi il tasto ''0'' :'); end
|