1.
Autpotinv.m % METODO DELLE POTENZE INVERSE PER IL CALCOLO DEGLI
AUTOVALORI function [H,risp]=aupotinv(A,n,simmetrica); % H
é l'autovalore da calcolare % risp
controlla se il metodo é applicabile % A
é la matrice in cui calcoliamo l'autovalore % n
é la dimensione della matrice A % simmetrica tiene
conto del fatto che A può essere simmetrica lc=input('Inserisci
il valore approssimato dell''autovalore da calcolare : '); B=A-lc*eye(n); if
rank
( B )<n risp=1; else
if simmetrica==1
[l,risp]=autminsi(B,n);
else
[l,risp]=autmin(B,n); end
if risp==0 H=lc+l; else
H=0; end end % QUESTO ALGORITMO DETERMINA L'AUTOVALORE DI MODULO PIU'
GRANDE DI UNA MATRICE function
l=autmaxmo(A,n); % l
é l'autovalore da calcolare % A
é la matrice in cui calcoliamo l'autovalore % n
é la dimensione della matrice A x=diag(eye(n)); Kmax=input('Introduci
il numero massimo di iterate : '); err=0; while
err==0
if Kmax<=0
| round(Kmax)~=Kmax
disp(' ');
disp(' Il valore introdotto non é
corretto');
Kmax=input('Introducilo nuovamente : ');
else
err=1; end end
for
k=0:Kmax y=A*x; j=0; i=1; while j==0 if
abs(x(i))==1
j=i; end
i=i+1; end
l=y(j)/x(j); x=y/max(abs(y)); end 3. Autmaxsi.m % QUESTO ALGORITMO DETERMINA L' AUTOVALORE DI MODULO PIU'
GRANDE DI UNA MATRICE
% SIMMETRICA function
l=autsimm(A,n); % l
é l'autovalore da calcolare % A
é la matrice in cui calcoliamo l'autovalore % n é
la dimensione della matrice A x=diag(eye(n)); Kmax=input('Introduci
il numero massimo di iterate : '); err=0; while
err==0
if Kmax<=0
| round(Kmax)~=Kmax
disp(' ');
disp(' Il valore introdotto non é
corretto');
Kmax=input('Introducilo nuovamente : ');
else
err=1; end end
for
k=0:Kmax y=A*x;
l=(x'*y)/(norm(x))^2; x=y/norm(y); end 4.
Autmetqr.m % CALCOLO DEGLI AUTOVALORI DI UNA MATRICE CON IL METODO QR function
l=autmetqr(A,n); % l
é il vettore con tutti gli autovalori da calcolare % A
é la matrice in cui calcoliamo l'autovalore % n
é la dimensione della matrice A kmax=input('Introduci
il numero massimo di iterate : '); err=0; while
err==0
if kmax<=0
| round(kmax)~=kmax
disp(' ');
disp(' Il valore introdotto non é
corretto');
kmax=input('Introducilo nuovamente : ');
else
err=1; end end
i=1; while
i<=kmax
[Q,R,risp]=fattqr(A,n,n);
%
Calcolo della fattorizzazione QR
if risp==0
% ad ogni passo
A=R*Q;
i=i+1; else
l=0; i=kmax+1; end end if
risp==0 i=2; while
i<=n if abs(A(i,i-1))>=eps
b=A(i-1,i-1)+A(i,i);
c=A(i-1,i-1)*A(i,i)-A(i-1,i)*A(i,i-1);
Delta=sqrt(b*b-4*c);
l(i-1)=(b-Delta)/2;
% estrapolazione dalla matrice
l(i)=(b+Delta)/2;
% ottenuta all'ultima iterata
i=i+2;
else
l(i-1)=A(i-1,i-1);
if
i==n l(i)=A(i,i); end
i=i+1; end end if
i==n+1 l(n)=A(n,n); end end % QUESTO ALGORITMO DETERMINA L'AUTOVALORE DI MODULO PIU'
PICCOLO DI UNA MATRICE function
[l,risp]=autminmo(A,n); % l
é l'autovalore da calcolare % risp
controlla se il metodo é applicabile % A
é la matrice in cui calcoliamo l'autovalore % n
é la dimensione della matrice A risp=0; [L,U,risp]=lucompat(A,n);
% Calcolo della fattorizzazione LU if
risp==0 x=diag(eye(n));
Kmax=input('Introduci
il numero massimo di iterate : ');
err=0; while err==0 if
Kmax<=0 | round(Kmax)~=Kmax
disp(' ');
disp(' Il valore introdotto non é
corretto');
Kmax=input('Introducilo nuovamente : ');
else
err=1; end
end
for k=0:Kmax
y=lurisol(L,U,x,n);
j=0; i=1; while j==0 if
abs(x(i))==1
j=i; end
i=i+1; end
l=y(j)/x(j);
x=y/max(abs(y));
end
l=1/l; end % QUESTO ALGORITMO DETERMINA L'AUTOVALORE DI MODULO PIU'
PICCOLO DI UNA MATRICE
% SIMMETRICA function [l,risp]=autminsi(A,n); % l
é l'autovalore da calcolare % risp
controlla se il metodo é applicabile % A
é la matrice in cui calcoliamo l'autovalore % n
é la dimensione della matrice A risp=0; fc=1; [L,U,C,risp,r]=lusimm(A,n,fc);
% fattorizzazione LU per matrici
simmetriche if
risp==0 x=diag(eye(n));
Kmax=input('Introduci
il numero massimo di iterate : ');
err=0; while err==0 if
Kmax<=0 | round(Kmax)~=Kmax
disp(' ');
disp(' Il valore introdotto non é
corretto');
Kmax=input('Introducilo nuovamente : ');
else
err=1; end
end
for k=0:Kmax
y=lurisol(L,U,x,n);
l=(x'*y')/(norm(x))^2;
x=y'/norm(y);
end
l=1/l; end % CALCOLO DI TUTTI GLI AUTOVALORI REALI DELLE MATRICI
TRIDIAGONALI SIMMETRICHE function l=auttrsim(A,n,e); % l
é l'autovalore da calcolare % A
é la matrice in cui calcoliamo l'autovalore % n
é la dimensione della matrice A % e
é l'errore massimo
che si deve commettere inf1(1)=A(1,1)-abs(A(1,2)); sup1(1)=A(1,1)+abs(A(1,2)); for i=2:n-1
% calcolo dell'intervallo contenente
k=abs(A(i,i-1))+abs(A(i,i+1));
% tutti gli autovalori della matrice
inf1(i)=A(i,i)-k;
sup1(i)=A(i,i)+k; end inf1(n)=A(n,n)-abs(A(n,n-1)); sup1(n)=A(n,n)+abs(A(n,n-1)); inf1=min(inf1); sup1=max(sup1); k=(log((sup1-inf1)/e))/log(2);
% calcolo del numero di iterate da
effettuare k=ceil(k); for i=1:n
inf2=inf1;
% determinazione di tutti gli
sup2=sup1;
% autovalori della matrice
for
j=1:k c=(inf2+sup2)/2; w=camsegn(A,n,c); if
w>=i sup2=c; else
inf2=c; end
end
l(i)=(inf2+sup2)/2; end % CALCOLO DEL NUMERO DI CAMBIAMENTI DI SEGNO DELLA
SUCCESSIONE DI STURM function
w=camsegn(A,n,x); % w
rappresenta il numero di cambiamenti di segno della successione di Sturm
calcolata in x % A
é la matrice triangolare simmetrica per la quale calcoliamo tale
successione % n
é la dimensione della matrice A % x
punto in cui calcoliamo la successione di Sturm p(1)=1; p(2)=A(1,1)-x; if
p(2)==0 p(2)=1; end for
i=3:n+1
p(i)=(A(i-1,i-1)-x)*p(i-1)-((A(i-1,i-2))^2)*p(i-2);
if p(i)==0
p(i)=p(i-1);
end end w=0; for
i=2:n+1 if p(i)*p(i-1)<0 w=w+1; end end % FATTORIZZAZIONE DI CHOLESKY CON LA TECNICA COMPATTA function
L=chocomp(A,n); % L
matrice ottenuta dalla fattorizzazione di Cholesky % A
matrice da fattorizzare % n
dimensione della matrice for
i=1:n for j=1:i-1 a=0; for
k=1:j-1
a=a+L(i,k)*L(j,k);
end
L(i,j)=(A(i,j)-a)/L(j,j);
end
a=0;
for k=1:i-1
a=a+(L(i,k))^2;
end
L(i,i)=sqrt(A(i,i)-a); end % FATTORIZZAZIONE DI CHOLESKY CON IL METODO DI DOOLITTLE function
L=chodool(A,n); % L matrice
ottenuta dalla fattorizzazione di Cholesky % A matrice
da fattorizzare % n dimensione
della matrice for
j=1:n a=0; for k=1:j-1 a=a+(L(j,k))^2; end
L(j,j)=sqrt(A(j,j)-a); for i=j+1:n a=0; for
k=1:j-1 a=a+L(i,k)*L(j,k); end
L(i,j)=(A(i,j)-a)/L(j,j);
end end
|