You are on page 1of 20

Métodos de Cálculo en Ingenierı́a

Quı́mica

Curso 2017–2018

Práctica 3
Cálculo de autovalores y autovectores.
Factorización QR
rev. 21 de noviembre de 2017

César F. Talavera
1. Cálculo de autovalores y autovectores
1.1. El método de potencia
Si A es una matriz real y simétrica que posee un autovalor máximo, el método de potencia
permite obtener iterativamente dicho autovalor:

x0 ∈ Rn tal que kx0 k2 = 1 (Inicialización)


FOR k ≥ 1 DO
y k ← A xk−1
k
xk ← kyyk k2
IF kxk − xk−1 k2 ≤  THEN STOP (Test de convergencia)
ENDFOR

Ejemplo 1. Sea la matriz (real y simétrica)


 
5 1 2 1
1 6 2 1
A= 2
.
2 7 1
1 1 1 10

Realizaremos paso a paso las primeras iteraciones del método de potencia:

>> A = [ 5 1 2 1 ; 1 6 2 1 ; 2 2 7 1 ; 1 1 1 10 ]
A =

5 1 2 1
1 6 2 1
2 2 7 1
1 1 1 10

>> eig(A) % Espectro de A


ans =

3.7055
4.6580
8.1188
11.5177 % <=== ¡¡ autovalor máximo !!

>> x = [ 0 1 0 0 ]’; % Vector inicial (arbitrario)

>> norm(x) % Comprobamos que está normalizado


ans = 1
>> y = A*x % Primera iteración
y =

1
6
2
1

2
>> lambda = norm(y)
lambda = 6.4807
>> x = y / lambda
x =

0.15430
0.92582
0.30861
0.15430

>> y = A*x % Segunda iteración


y =

2.4689
6.4807
4.4748
2.9318

>> lambda = norm(y)


lambda = 8.7587
>> x = y / lambda
x =

0.28188
0.73992
0.51090
0.33473

>> y = A*x; lambda = norm(y) ; x = y / lambda ; disp(lambda)


10.417
>> y = A*x; lambda = norm(y) ; x = y / lambda ; disp(lambda)
11.077
>> y = A*x; lambda = norm(y) ; x = y / lambda ; disp(lambda)
11.320
>> y = A*x; lambda = norm(y) ; x = y / lambda ; disp(lambda)
11.422
>> y = A*x; lambda = norm(y) ; x = y / lambda ; disp(lambda)
11.471
>> y = A*x; lambda = norm(y) ; x = y / lambda ; disp(lambda)
11.494
>> y = A*x; lambda = norm(y) ; x = y / lambda ; disp(lambda)
11.506
>> y = A*x; lambda = norm(y) ; x = y / lambda ; disp(lambda)
11.512

Se observa la convergencia al autovalor máximo de A.

A efectos prácticos, el método se implementa mediante la siguiente función:

function [lambda x iter] = mPotencia(A, x0, tol, MAXITER, info)


%% Power method for the computation of maximum eigenvalue of A

3
x = x0 / norm(x0);
xold = x;
for iter=1:MAXITER
x = A*x;
lambda = norm(x);
x = x / lambda;
err = norm(x - xold);
%% OPTIONAL: print intermediate steps
if ( nargin > 4 && info > 0 )
printf(’Iter = %d, lambda = %f, err = %e\n’, ...
iter, lambda, err);
disp(’x = ’); disp(x);
end
if ( err < tol )
break;
end
xold = x;
end

end

Ejemplo 2. Si aplicamos la anterior función al Ejemplo 1, se obtiene el siguiente resultado:

>> A = [ 5 1 2 1 ; 1 6 2 1 ; 2 2 7 1 ; 1 1 1 10 ] ;
>> x0 = [ 0 1 0 0 ]’;

>> [lambda x iter] = mPotencia(A, x0, 1.0E-5, 100)


lambda = 11.518
x =

0.31196
0.35983
0.46290
0.74762

iter = 31

>> A*x - lambda*x % Comprobación


ans =

-1.9640e-05
-2.5938e-05
-4.0552e-05
4.5789e-05

En la última lı́nea hemos comprobado que en efecto se verifica la definición de autovalor y


autovector, dentro de la tolerancia pedida.

1.2. El método de potencia inversa


Cuando A es real y simétrica y su autovalor mı́nimo es > 0, el método de potencia inversa
permite hallar, iterativamente, dicho autovalor mı́nimo:

4
x0 ∈ Rn tal que kx0 k2 = 1 (Inicialización)
FOR k ≥ 1 DO
Resolver A y k = xk−1
k
xk ← kyyk k2
IF kxk − xk−1 k2 ≤  THEN STOP (Test de convergencia)
ENDFOR

Veamos su aplicación a la misma matriz del Ejemplo 1. Notar que:


1. Si aplicamos el Teorema de Gerschgorin a la matriz A, es inmediato obtener que todos los
autovalores de A son > 0 (sin conocer explı́citamente el espectro de A); en particular, A es
definida positiva.
2. Hallaremos previamente la factorización P A = L U para resolver el sistema lineal que
aparece en cada iteración.
La siguiente función implementa el algoritmo del método:

function [lambda x iter] = mPotenciaInv(A, x0, tol, MAXITER, info)


%% Inverse power method for the computation of the
%% minimum eigenvalue of A symmetric positive definite

[L U P] = LUfact(A); % Computes P*A=L*U factorization


x = x0 / norm(x0);
xold = x;
for iter=1:MAXITER
%% Solves A*x -> x
x=P*x;
y=LSolve(L,x);
x=USolve(U,y);
ilambda = norm(x);
x = x / ilambda;
err = norm(x - xold);
%% OPTIONAL: print intermediate steps
if ( nargin > 4 && info > 0 )
printf(’Iter = %d, lambda = %f, err = %e\n’, ...
iter, 1.0/ilambda, err);
disp(’x = ’); disp(x);
end
if ( err < tol )
break;
end
xold = x;
end
%%
lambda = 1.0 / ilambda;

end

Su aplicación al Ejemplo 1 conduce al siguiente resultado:

5
>> [ lambda x iter ] = mPotenciaInv(A, x0, 1.0E-5, 100, 1)
Iter = 1, lambda = 5.154261, err = 2.667279e-01
x =
-0.083030
0.964428
-0.242704
-0.063869
Iter = 2, lambda = 4.711921, err = 1.542673e-01
x =
-0.091161
0.914180
-0.388006
-0.073596
Iter = 3, lambda = 4.560631, err = 1.052897e-01
x =
-0.053373
0.874298
-0.477644
-0.067893

... ETCÉTERA ...

lambda = 3.7055
x =

0.796121
0.181146
-0.573820
-0.064095

iter = 52

>> A*x - lambda*x % COMPROBACIÓN !!!


ans =

-1.3005e-05
2.5017e-05
-1.0106e-05
-3.5687e-07

1.3. La factorización QR
Dada A ∈ Mn (R), la factorización QR consiste en aplicar transformaciones ortogonales a la
matriz A que, de izquierda a derecha, hagan cero las entradas por debajo de la diagonal principal,
llegando ası́ a una matriz triangular superior R. Una posible transformación ortogonal viene dada
por las matrices de Householder.

1.3.1. Matrices de Householder


Recordemos las siguientes definiciones de las Notas del Curso. La matriz de Householder de
base el vector v ∈ Rn es:

6
function A = Householder(v)
%% Householder matrix of base v

v=vec(v); % v is now a column vector


A = eye(length(v)) - 2* v*v’ /norm(v)^2;

end

El vector de Householder v para el vector x ∈ Rn se define como:

function v = VecHh(x)
%% v is the Householder vector for vector x

if ( x(1) ~= 0 )
alpha = -sign(x(1))*norm(x);
else
alpha = norm(x);
end
v = x;
v(1) = x(1) - alpha;

end

La matriz de Householder de base el vector de Householder para x es por tanto


H = Householder(VecHh(x))
y verifica las siguientes propiedades:
1. H es real y simétrica,
2. H es ortogonal, H T H = H H T = In ,
3. La actuación de H sobre x da lugar a un vector de entradas cero excepto la primera,
 
α
0
H x = . .
 
 .. 
0

Ejemplo 3. Comprobemos las definiciones con un ejemplo:

>> x = [ 1 1 1 ]’;

>> H = Householder(VecHh(x))
H =

-0.57735 -0.57735 -0.57735


-0.57735 0.78868 -0.21132
-0.57735 -0.21132 0.78868

>> H*H’ % H es ortogonal

7
ans =

1.0000e+00 -3.6082e-16 -3.3307e-16


-3.6082e-16 1.0000e+00 -1.1102e-16
-3.3307e-16 -1.1102e-16 1.0000e+00

>> H’*H
ans =

1.0000e+00 -3.6082e-16 -3.3307e-16


-3.6082e-16 1.0000e+00 -1.1102e-16
-3.3307e-16 -1.1102e-16 1.0000e+00

>> H*x % Actuación de H sobre x


ans =

-1.7321e+00
3.0531e-16
3.3307e-16

1.3.2. La factorización QR
Utilizaremos ahora las matrices de Householder para hallar la factorización QR de cualquier
matriz cuadrada A = Q R, Q ortogonal, R triangular superior.
Ejemplo 4. Consideremos la matriz
 
1 2 1
A = 2 1 0 .
1 −1 1

Aplicaremos matrices de Householder de manera que, de izquierda a derecha, las columnas pri-
mera y segunda tengan ceros por debajo de la diagonal principal.

>> A = [ 1 2 1 ; 2 1 0 ; 1 -1 1 ]
A =

1 2 1
2 1 0
1 -1 1

%%% PRIMERA COLUMNA DE A

>> x = A(:,1)
x =

1
2
1

%% Matriz de Householder de base x


>> P1 = Householder(VecHh(x))
P1 =

8
-0.40825 -0.81650 -0.40825
-0.81650 0.52660 -0.23670
-0.40825 -0.23670 0.88165

>> P1*x % COMPROBACIÓN


ans =

-2.44949
-0.00000
0.00000

>> A1 = P1 * A % Primera columna de A1 con ceros


A1 =

-2.44949 -1.22474 -0.81650


-0.00000 -0.86969 -1.05320
0.00000 -1.93485 0.47340

%%% SEGUNDA COLUMNA DE A1

>> x = A1(2:3,2) % COLUMNA 2 EMPEZANDO EN DIAGONAL


x =

-0.86969
-1.93485

%% Matriz de Householder de base x


>> H = Householder(VecHh(x))
H =

-0.40998 -0.91210
-0.91210 0.40998

>> H*x % COMPROBACIÓN


ans =

2.1213e+00
2.2204e-16

%% COMPLETAMOS PARA FORMAR UNA MATRIZ 3x3


>> P2 = blkdiag(1, H)
P2 =

1.00000 0.00000 0.00000


0.00000 -0.40998 -0.91210
0.00000 -0.91210 0.40998

>> A2 = P2 * A1 % Segunda columna de A2 con 0’s


A2 =

-2.4495e+00 -1.2247e+00 -8.1650e-01


1.2517e-16 2.1213e+00 2.2204e-16

9
2.7847e-16 2.2204e-16 1.1547e+00

%% A2 YA ES UNA MATRIZ TRIANGULAR SUPERIOR !!!

>> R = A2 ;

>> Q = ( P2 * P1 )’ % Q ES LA TRANSF. ORTOGONAL


Q =

-4.0825e-01 7.0711e-01 5.7735e-01


-8.1650e-01 -5.5511e-17 -5.7735e-01
-4.0825e-01 -7.0711e-01 5.7735e-01

>> Q*R % COMPROBACIÓN FINAL: Q*R=A


ans =

1.00000 2.00000 1.00000


2.00000 1.00000 0.00000
1.00000 -1.00000 1.00000

Nota: Utilizaremos también la función interna [Q R] = qr(A) que calcula la factorización


QR de A mediante subrutinas de LAPACK [1] (empleando matrices de Householder).
Ejemplo 5. Cuando se usa un método directo para resolver un sistema lineal A x = b, se suele
recurrir a la eliminación Gaussiana/factorización LU (que es el procedimiento estandar). Una
alternativa (que goza de mejores propiedades de estabilidad) es mediante la factorización QR de
la matriz de coeficientes A: si A = QR con Q ortogonal entonces el sistema A x = b es equivalente
al sistema
R x = QT b
que, al ser R una matriz triangular (superior) se resuelve de forma inmediata por sustitución
regresiva.
Sea por ejemplo el sistema lineal
    
1 2 1 x1 5
2 1 0 x2  =  5  .
1 −1 1 x3 −4
T
Si A es la matriz de coeficientes y b = 5 5 −4 es el lado derecho del sistema, hallamos la
solución del sistema lineal mediante la factorización QR de A:

>> [Q R] = qr(A)
Q =

-0.40825 0.70711 0.57735


-0.81650 0.00000 -0.57735
-0.40825 -0.70711 0.57735

R =

-2.44949 -1.22474 -0.81650


0.00000 2.12132 0.00000

10
0.00000 0.00000 1.15470

>> b = [ 5 5 -4 ]’;

>> x = USolve(R, Q’*b)


x =

1.00000
3.00000
-2.00000

>> b - A*x % COMPROBACIÓN


ans =

-8.8818e-16
0.0000e+00
-8.8818e-16

1.3.3. Matrices de Hessenberg


Una matriz (superior) de Hessenberg es aquella que tiene ceros por debajo de la primera
subdiagonal. Muchos algoritmos numéricos requieren menos esfuerzo computacional cuando son
aplicados a matrices de Hessenberg (en concreto, el método iterativo QR de obtención de auto-
valores).
Dada una matriz A, aplicaremos matrices de Householder para transformar A en una matriz
semejante à de Hessenberg:

à = Q A QT , siendo Q matriz ortogonal, Q−1 = QT , y simétrica.

La idea es introducir ceros por debajo de la subdiagonal, columna a columna.


Ejemplo 6. Sea la siguiente matriz (real y simétrica)
 
1 3 −1 −3
 3 −1 0 −5
A= −1 0
.
9 2
−3 −5 2 6

>> A = [ 1 3 -1 -3 ; 3 -1 0 -5 ; -1 0 9 2 ; -3 -5 2 6 ];

%% PRIMERA COLUMNA DE A, VECTOR EMPEZANDO EN LA SUBDIAGONAL

>> x = A(2:4,1)
x =

3
-1
-3

>> H = Householder(VecHh(x)) % MATRIZ DE HOUSEHOLDER


H =

-0.688247 0.229416 0.688247

11
0.229416 0.968825 -0.093526
0.688247 -0.093526 0.719422

>> Q1 = blkdiag(1,H) % COMPLETAMOS LA MATRIZ A BLOQUES


Q1 =

1.00000 0.00000 0.00000 0.00000


0.00000 -0.68825 0.22942 0.68825
0.00000 0.22942 0.96882 -0.09353
0.00000 0.68825 -0.09353 0.71942

>> A1 = Q1 * A * Q1’ % TRANSFORMACIÓN DE SEMEJANZA


A1 =

1.0000e+00 -4.3589e+00 4.9960e-16 1.7764e-15


-4.3589e+00 8.2105e+00 1.9514e+00 3.5601e+00
4.9960e-16 1.9514e+00 8.2996e+00 -4.6900e-01
1.7764e-15 3.5601e+00 -4.6900e-01 -2.5101e+00

%% A1 TIENE CEROS (APROX.) EN LA PRIMERA COLUMNA,


%% POR DEBAJO DE LA SUBDIAGONAL.
%% SEGUNDA COLUMNA DE A1, VECTOR EMPEZANDO EN LA SUBDIAGONAL

>> x = A1(3:4,2)
x =

1.9514
3.5601

>> H = Householder(VecHh(x)) % MATRIZ DE HOUSEHOLDER


H =

-0.48067 -0.87690
-0.87690 0.48067

>> Q2 = blkdiag(eye(2), H) % COMPLETAMOS LA MATRIZ A BLOQUES


Q2 =

1.00000 0.00000 0.00000 0.00000


0.00000 1.00000 0.00000 0.00000
0.00000 0.00000 -0.48067 -0.87690
0.00000 0.00000 -0.87690 0.48067

>> A2 = Q2 * A1 * Q2’ % TRANSFORMACIÓN DE SEMEJANZA


A2 =

1.0000e+00 -4.3589e+00 -1.7978e-15 4.1573e-16


-4.3589e+00 8.2105e+00 -4.0598e+00 8.8818e-16
-1.7978e-15 -4.0598e+00 -4.0801e-01 4.3040e+00
4.1573e-16 8.8818e-16 4.3040e+00 6.1975e+00

%% A2 TIENE CEROS (APROX.) EN LA SEGUNDA COLUMNA,


%% POR DEBAJO DE LA SUBDIAGONAL:

12
%% A2 ES UNA MATRIZ DE HESSENBERG !!!

%% Q ES LA MATRIZ ORTOGONAL QUE RELACIONA A CON A2:

>> Q = ( Q2 * Q1 )’
Q =

1.00000 0.00000 0.00000 0.00000


0.00000 -0.68825 -0.71380 0.12964
0.00000 0.22942 -0.38367 -0.89452
0.00000 0.68825 -0.58591 0.42781

%% COMPROBAMOS LA ORTOGONALIDAD DE Q:

>> Q*Q’
ans =

1.00000 0.00000 0.00000 0.00000


0.00000 1.00000 -0.00000 -0.00000
0.00000 -0.00000 1.00000 -0.00000
0.00000 -0.00000 -0.00000 1.00000

>> Q’*Q
ans =

1.00000 0.00000 0.00000 0.00000


0.00000 1.00000 0.00000 -0.00000
0.00000 0.00000 1.00000 -0.00000
0.00000 -0.00000 -0.00000 1.00000

%% COMPROBAMOS QUE EL RESULTADO ES CORRECTO:

>> Q’*A*Q
ans =

1.0000e+00 -4.3589e+00 -1.5543e-15 4.4409e-16


-4.3589e+00 8.2105e+00 -4.0598e+00 1.3323e-15
-1.5543e-15 -4.0598e+00 -4.0801e-01 4.3040e+00
4.4409e-16 9.5757e-16 4.3040e+00 6.1975e+00

Se observa que como A es una matriz real y simétrica la matriz semejante A2 también es real
y simétrica (dentro de la precisión del ordenador), luego es una matriz tridiagonal.

1.4. El método iterativo QR


La idea del método iterativo QR es aplicar a una matriz A una secuencia de transforma-
ciones de semejanzas que la aproximen a una matriz triangular superior, cuyos autovalores son
inmediatos. Las transformaciones de semejanzas vendrán dadas por matrices de Householder.
Por razones de eficiencia numérica el primer paso del método consiste en transformar la matriz
A en una de Hessenberg, tal y como vimos en el punto anterior.

13
Ejemplo 7. Sea la matriz real y simétrica y de Hessenberg (luego tridiagonal)
 
2 3 0 0 0
3 −1 7 0 0
 
A = 0 7 4 8
 0.
0 0 8 −4 −2
0 0 0 −2 1

Veamos los primeros pasos del método iterativo QR:

>> A = [ 2 3 0 0 0
3 -1 7 0 0
0 7 4 8 0
0 0 8 -4 -2
0 0 0 -2 1 ];

%% Sus autovalores son simples y > 0 en valor absoluto:

>> eig(A) ’

-10.9561 -3.5255 1.2557 3.1385 12.0875

%% PRIMERA ITERACIÓN:

>> [ Q R ] = qr(A)
Q =

-0.55470 0.33244 0.41330 -0.59273 -0.24423


-0.83205 -0.22162 -0.27554 0.39515 0.16282
-0.00000 0.91672 -0.21649 0.31048 0.12793
-0.00000 0.00000 -0.84047 -0.50100 -0.20643
-0.00000 0.00000 -0.00000 -0.38097 0.92459

R =

-3.60555 -0.83205 -5.82435 0.00000 0.00000


0.00000 7.63595 2.11550 7.33373 0.00000
0.00000 0.00000 -9.51849 1.62993 1.68094
0.00000 0.00000 0.00000 5.24973 0.62102
0.00000 0.00000 0.00000 0.00000 1.33745

>> A1 = R * Q
A1 =

2.69231 -6.35349 0.00000 0.00000 0.00000


-6.35349 0.24701 -8.72575 0.00000 0.00000
0.00000 -8.72575 0.69078 -4.41224 0.00000
0.00000 0.00000 -4.41224 -2.86668 -0.50953
0.00000 0.00000 0.00000 -0.50953 1.23659

%% SEGUNDA ITERACIÓN:

>> [ Q R ] = qr(A1)

14
Q =

-0.39017 -0.50685 0.45337 0.61479 0.08577


0.92074 -0.21478 0.19212 0.26052 0.03635
-0.00000 -0.83485 -0.32467 -0.44028 -0.06142
-0.00000 0.00000 0.80755 -0.58414 -0.08150
-0.00000 0.00000 -0.00000 -0.13818 0.99041

R =

-6.90039 2.70636 -8.03419 0.00000 0.00000


0.00000 10.45190 1.29742 3.68355 -0.00000
0.00000 0.00000 -5.46373 -0.88246 -0.41147
0.00000 0.00000 0.00000 3.68755 0.12677
0.00000 0.00000 0.00000 0.00000 1.26625

>> A2 = R * Q
A2 =

5.18417 9.62353 0.00000 -0.00000 0.00000


9.62353 -3.32800 4.56139 0.00000 -0.00000
0.00000 4.56139 1.06130 2.97789 0.00000
0.00000 0.00000 2.97789 -2.17157 -0.17497
0.00000 0.00000 0.00000 -0.17497 1.25411

%% TERCERA ITERACIÓN:

>> [ Q R ] = qr(A2)
Q =

-0.47426 0.80169 0.19278 -0.30817 -0.01563


-0.88038 -0.43187 -0.10385 0.16601 0.00842
-0.00000 0.41327 -0.48249 0.77129 0.03911
-0.00000 0.00000 -0.84809 -0.52917 -0.02683
-0.00000 0.00000 -0.00000 -0.05064 0.99872

R =

-10.93105 -1.63414 -4.01578 -0.00000 0.00000


0.00000 11.03738 -1.53131 1.23066 0.00000
0.00000 0.00000 -3.51128 0.40491 0.14839
0.00000 0.00000 0.00000 3.45480 0.02907
0.00000 0.00000 0.00000 0.00000 1.25719

>> A3 = R * Q
A3 =

6.62284 -9.71714 0.00000 0.00000 0.00000


-9.71714 -5.39951 -1.45110 0.00000 0.00000
0.00000 -1.45110 1.35074 -2.92999 -0.00000
0.00000 0.00000 -2.92999 -1.82964 -0.06367
0.00000 0.00000 0.00000 -0.06367 1.25558

Etcétera. Se requiere una función que implemente el método iterativo QR con una cierta

15
tolerancia (que caracteriza si la matriz de la iteración es suficientemente parecida a una matriz
triangular inferior) y un número máximo de iteraciones:

function [A iter] = autovaloresQR(A, tol, MAXITER)


%% Iterative QR method

for iter=1:MAXITER
[Q R] = qr(A);
A = R*Q;
%% Frobenius norm of lower triangular part of A
err = norm(tril(A,-1), ’fro’);
if ( err < tol )
break;
end
end

end

Ejemplo 8. Aplicamos la función autovaloresQR a la matriz del ejemplo anterior (recordar que
era una matriz de Hessenberg):

>> [A2 iter] = autovaloresQR(A, 1.0E-5, 1000)


A2 =

12.08746 -0.00001 -0.00000 -0.00000 0.00000


-0.00001 -10.95612 -0.00000 -0.00000 0.00000
0.00000 0.00000 -3.52554 -0.00000 0.00000
0.00000 0.00000 -0.00000 3.13854 -0.00000
0.00000 0.00000 0.00000 0.00000 1.25566

iter = 147

>> diag(A2) % Los autovalores son la diagonal de A2


ans =

12.0875
-10.9561
-3.5255
3.1385
1.2557

16
2. Problemas
Problema 1. Sean las siguientes matrices reales y simétricas:
 
−4 −7 0 0
−7 −4 0 0
A1 =  ,
0 0 6 −5
0 0 −5 6
 
6,5 4,5 0 0
4,5 6,5 0 0
A2 =  ,
0 0 −7 3 
0 0 3 −7
 
7 4 0 0
4 7 0 0 
A3 = 
0 0 −1,5 −2,5 ,

0 0 −2,5 −1,5
 
−4 −7 0 0
−7 −4 0 0
A4 =  ,
0 0 1 −1
0 0 −1 1
 
−1 −1 0 0
−1 −1 0 0
A5 =  .
0 0 6 −5
0 0 −5 6

1. Para cada una de las anteriores matrices:


a) Calcular analı́ticamente el espectro de la matriz y establecer entonces si A verifica las
condiciones del Teorema 7, Tema 3, del método de potencia.
b) Sólo si A verifica las condiciones del método de potencia, aplicar la función mPotencia()
para el cálculo de su autovalor máximo. Tómese los valores tol=10−5 , MAXITER=1000,
y un vector inicial al azar x0=rand(4,1).
2. Repetir el apartado anterior aplicando el método de potencia inversa para el cálculo del
autovalor mı́nimo de cada matriz.
Problema 2. (La técnica de deflación) El método de potencia puede usarse (bajo ciertas con-
diciones) para hallar más de un valor/vector propio mediante la técnica de deflación (matrix
deflation). La idea es desactivar el autovalor dominante (haciéndolo cero) de manera que el
autovalor siguiente (subdominante) pase a ser el dominante.
Supongamos que A ∈ Mn (R) es una matriz simétrica cuyo espectro σ(A) = {λ1 , λ2 , . . . , λn }
verifica
0 < λ1 < λ2 < · · · < λn−1 < λn .
Si, mediante el método de potencia, determinamos el autovalor dominante λn y su correspondien-
te autovector v normalizado (es decir, con v T v = 1), el método de deflación consiste en sustraer
a la matriz A la corrección (de rango uno)

à = A − λn v v T .

17
Entonces à posee los mismos valores y vectores propios que A, excepto que λn es reemplazado
por cero, es decir σ(Ã) = {λ1 , . . . , λn−1 , 0}. Podemos por tanto aplicar el método de potencia
a la matriz à y obtener el autovalor subdominante λn−1 y su autovector correspondiente. El
procedimiento se puede repetir para obtener los siguientes autovalores1 .
Entonces:

1. Demostrar que, bajo las anteriores condiciones, las matrices A y à = A − λn v v T poseen


los mismos vectores propios y que el espectro de à es el mismo que el de A excepto que su
autovalor dominante es reemplazado por 0.
2. Sea A la matriz tridiagonal del Problema 2 de la Práctica 2, que conocemos verifica las
hipótesis anteriores. Combinar el método de potencia con la técnica de deflación y realizar
un programa que calcule todos los valores propios de A, cuando su dimensión es n = 5 y n =
30, respectivamente (tomar tol=10−5 , MAXITER=1000 y un vector inicial aleatorio). Verificar
que el resultado es correcto comparando con los autovalores obtenidos analı́ticamente en
las Notas del Curso:
n π 2π
σ(A) = λ1 = 4 sen2 < λ2 = 4 sen2 < ···
2(n + 1) 2(n + 1)
kπ nπ o
· · · < λk = 4 sen2 < · · · < λn = 4 sen2 .
2(n + 1) 2(n + 1)

Problema 3. Definir una función [Q R] = miqr(A) que implemente en Octave la factorización


QR de A (matriz cuadrada y real) mediante matrices de Householder. Seguir para ello el siguiente
patrón de programación:
function [Q R] = miqr(A)
Hallar el número de filas nr y de columnas nc de A (¡deben coincidir!)
Definir Q como la matriz identidad eye(nr)
Para k= columna primera hasta columna penúltima de A:
Sea x el vector columna k-ésima de A, desde su diagonal hasta el final
Sea H la matriz de Householder de base x
Sea P la matriz cuya diagonal son dos bloques:
la matriz identidad y la matriz H
A=P*A; (hacemos cero las entradas por debajo de la diagonal)
Q=P*Q; (almacenamos en Q las matrices ortogonales)
Finalmente, A es una matriz triangular luego R=A
Y la matriz ortogonal buscada es la transpuesta de Q
end

Nota: La función A = blkdiag(B1,B2) crea una matriz definida a bloques cuya diagonal está
formada por las matrices B1 y B2 y cuya dimensión es la suma de las dimensiones de las dos
matrices:
| B1 | 0 |
A = |---------|
| 0 | B2 |

1 Debido a que los errores de redondeo se van acumulando en cada deflación, el procedimiento se usa en la

práctica para el cálculo de unos pocos autovalores.

18
Verificar el correcto funcionamiento de la función aplicándola a una matriz A = rand(5) escogida
al azar: si [Q R] = miqr(A) entonces se ha de verificar que i) R es una matriz triangular superior,
ii) Q es una matriz ortogonal (Q*Q’=eye(5) y Q’*Q=eye(5)), iii) Q*R=A. Comparar también el
resultado con la función interna de Octave [Q R] = qr(A).
Problema 4. Sea A = rand(5) una matriz cuadrada de dimensión 5, cuyas componentes son
números aleatorios distribuidos uniformemente en el intervalo [0, 1]. Calcular los autovalores de
la matriz parte simétrica de A,
1
As = (A + AT ) ,
2
mediante el método iterativo QR. Para ello se han de seguir los siguientes pasos:
1. Calcular, mediante matrices de Householder, la forma de Hessenberg de la matriz As (al
ser As simétrica, la matriz semejante resultará ser una matriz tridiagonal).
2. Aplicar el método iterativo QR para el cálculo de los autovalores de la forma de Hessenberg
de As . En el método iterativo tomar los valores tol=10−5 , MAXITER=1000.
Nota: En el caso (altamente improbable) que As sea singular, se tomará otra matriz al azar.
Problema 5. Veamos con un ejemplo que las buenas propiedades numéricas de la factoriza-
ción A = Q R permiten resolver satisfactoriamente sistemas lineales A x = b para los que la
factorización P A = L U produce soluciones poco precisas.
Sea el sistema lineal A x = b de dimensión n, siendo A la matriz del Problema 4, Práctica 1
(que recordemos poseı́a un factor de crecimiento ρ galopante):

A = eye(n) - tril(ones(n), -1); A(:,n) = 1;

y siendo el lado derecho del sistema un vector de componentes aleatorias en el intervalo [0, 1]:

b = rand(n,1);

Entonces:
1. Resolver el sistema lineal empleando la factorización P A = L U cuando la dimensión del
problema es n = 50. Para comprobar la bondad de la solución numérica hallada xLU ,
calcular su residuo rLU := b − A xLU . Cuando más próximo a cero esté su norma krLU k2 ,
mejor será la aproximación a la solución (obviamente, la solución exacta verifica r = b −
A x = 0).
2. Resolver el mismo sistema lineal empleando ahora la factorización A = Q R. Hallar la
norma del residuo rQR = b − A xQR de la solución hallada.
3. ¿Qué procedimiento conduce a una solución más próxima a la exacta? Repetir el cálculo
con varios vectores aleatorios b=rand(n,1) para verificar que en todos los casos la respuesta
es la misma.

19
Referencias
[1] LAPACK Users’ Guide, Third Edition, http://www.netlib.org/lapack/lug/lapack_lug.
html.

20