Problema. Para matrices simétricas, algunas veces, la necesaria

Anuncio
Problema. Para matrices simétricas, algunas veces, la necesaria normalización (factor
de escala) asociada al método de la potencia viene dada por el denominado cociente de
Rayleigh. En concreto, se establece la recurrencia
xn+1 =
1
xt Axn
Axn , donde ρn = nt
,
ρn
xn xn
y bajo las condiciones habituales sobre A (matriz con un único autovalor dominante de
módulo máximo λ1 ) se tiene que la sucesión (ρn ) converge prácticamente siempre a dicho
λ1 .
1. Diseñe una función de Matlab que implemente el anterior método de la potencia
con el cociente de Rayleigh como factor de escala. Los argumentos de entrada
deben ser la correspondiente matriz A, el vector inicial x0 y el número máximo de
iteraciones MaxIter.
2. Siendo N ≥ 2 un número natural y
⎡
2
⎢ −1
⎢
⎢
CN = N 2 ⎢
⎢
⎣
AN (t) =
∙
10
10cN
x ∈ R, considere las matrices
⎤
−1
⎥
2 −1
⎥
⎥
... ... ...
⎥ ∈ RN×N ,
⎥
1
2 −1 ⎦
−1 2
¸
10ctN
∈ R(N +1)×(N +1) ,
BN (t)
donde BN (t) = CN − 30 sen(t)IN , IN es la matriz identidad de orden N y cN =
[1, 1/2, ..., 1/N]t .
Para N = 4 y t = 0.2, calcule los autovalores de AN (t) con la orden eig y compruebe
que la función del apartado uno aplicado a AN (t) con x0 = [1, 1, 1, 1, 1] y MaxIter =
20, 30, 40, estima varias cifras correctas del autovalor dominante de módulo máximo
de AN (t).
3. Estime el autovalor dominante de módulo máximo de la matriz AN (t) con N = 103
y t = 0.2. Para ello, utilice la función del apartado uno con x0 = [1, 1, ..., 1] ∈ RN+1
y MaxIter = 100.
Asimismo, estime también el autovalor dominante de módulo mínimo de dicha matriz AN (t). Para ello, utilice la correspondiente versión del método de potencia con
factor de escala la componente de módulo máximo y con x0 = [1, 1, ..., 1] ∈ RN+1 y
MaxIter = 100.
(1)
function rh0=rayleigh(A,x0,maxiter)
x0=x0(:);
for k=1:maxiter
x=A*x0;
rh0=(x0’*x)/(x0’*x0);
x0=(1/rh0)*x;
end
(2) Primero creamos un fichero que genere la matriz AN (t).
function A=matriz(N,t)
e=ones(N,1);
C=spdiags([-e,2*e,-e,],-1:1,N,N);
C=N^2*C;
d=1./(1:N)’;
A=[10,10*d’;10*d,C-30*sin(t)*eye(N)];
Abordamos el apartado 2 con el correspondiente fichero de ejecución.
function ap2
A=matriz(4,0.2);
format long
display(’Autovalores de A’)
eig(A)
format
pause
x0=ones(5,1);
for k=2:4
N=10*k;
autovalor=rayleigh(A,x0,N);
fprintf(’N=%2.0f Estimacion=%16.15f\n’,N,autovalor)
pause(0.1)
end
Ejecutamos el fichero.
>> ap2
Autovalores de A
ans =
-6.255639778215888
11.561206306633474
20.069927853365435
36.772394372080086
52.011791550729470
N=20 Estimacion=52.008565124529589
N=30 Estimacion=52.011788408661957
N=40 Estimacion=52.011791547670242
2
Admitiendo los valores proporcionados por eig como vemos que con N = 20 obtenemos
3 cifras correctas, con N = 30 obtenemos 6 cifras correctas y con N = 40 obtenemos 9
cifras correctas.
(3) Comenzamos con el fichero que implementa el método de potencia con factor
de escala la componente de módulo máximo para el cálculo del autovalor dominante de
módulo mínimo (si lo hay, claro).
function autovalor=potencia_min(A,x0,maxiter)
x0=x0(:);
for k=1:maxiter
x=A\x0;
[m,j]=max(abs(x));
x0=(1/x(j))*x;
end
autovalor=1/(x(j));
Abordamos el apartado 3 con el correspondiente fichero de ejecución.
function ap3(N,t,maxiter)
A=matriz(N,t);
v=eig(A);
[m,j]=max(abs(v));
disp(’Autovalor dominante de módulo máximo’)
fprintf(’Estimacion con eig=%20.10f\n’,v(j))
pause
x0=ones(N+1,1);
autovalor=rayleigh(A,x0,maxiter);
fprintf(’Estimacion con rayleigh=%20.10f\n’,autovalor)
pause
disp(’Autovalor dominante de módulo mínimo’)
[m,j]=min(abs(v));
fprintf(’Estimacion con eig=%16.15f\n’,v(j))
pause
autovalor=potencia_min(A,x0,maxiter);
fprintf(’Estimacion con PotMin=%16.15f\n’,autovalor)
Ejecutamos el fichero.
>> ap3(1e3,0.2,100)
Autovalor dominante de módulo máximo
Estimacion con eig= 3999984.1900333995
Estimacion con rayleigh= 3969843.3309101081
Autovalor dominante de módulo mínimo
Estimacion con eig=3.779227317655030
Estimacion con PotMin=3.779227318020457
3
Descargar