Está en la página 1de 4

Práctica de Matlab.

Autovalores y autovectores
Álgebra Lineal. Curso 2010-11

En esta práctica vamos a ver algunas funciones que nos permiten calcular los autovalores y autovectores
de una matriz. Además, expondremos un método numérico para calcularlos y lo programaremos en
Matlabr.

1. Algunos comandos útiles


La orden

>> poly(a)

aplicada a una matriz a devuelve el polinomio caracterı́stico. Y hemos visto que la orden roots permite
calcular sus raı́ces (los autovalores). Pero Matlabr dispone de órdenes más directas. Escribiendo

>> eig(a)

encontramos los autovalores de a, y con una orden del tipo

>> [x,d]=eig(a)

los autovectores y autovalores. En general, la orden anterior devuelve una matriz x y una matriz diagonal
d, con la condición de que x*d=a*x. Pero esta matriz x no tiene por qué ser inversible, es decir, realiza
esta computación aunque a no sea diagonalizable. Esto se debe al carácter numérico de los cálculos
que hace Matlabr y a la alta sensibilidad de la condición de diagonalización de una matriz por pequeños
cambios en los coeficientes.
Ejercicio 1
Escribe una matriz A aleatoria, del tamaño que quieras. Calcula una matriz P y una matriz
diagonal D tales que A = P DP −1 , y compruébalo.

Matlabr ofrece la posibilidad de realizar cálculos exactos de manera simbólica. Para ellos, podemos
definir la matriz empleando la orden

>> b=sym([2 1 0 4 7; 0 2 4 1 -3; 0 0 1 8 -2; 0 0 0 1 5;0 0 0 0 3])

b =

[2 1 0 4 7]
[ ]
[0 2 4 1 -3]
[ ]
[0 0 1 8 -2]
[ ]
[0 0 0 1 5]
[ ]
[0 0 0 0 3]

1
Observemos que la matriz está expresada de manera diferente a la habitual. Ahora, la orden

>> [x,d]=eig(b)

x =

[105/2 1 4]
[ ]
[71/2 0 -4]
[ ]
[ 9 0 1]
[ ]
[ 5/2 0 0]
[ ]
[ 1 0 0]

d =

[3 0 0 0 0]
[ ]
[0 2 0 0 0]
[ ]
[0 0 2 0 0]
[ ]
[0 0 0 1 0]
[ ]
[0 0 0 0 1]

proporciona una lista máxima de autovectores independientes.

2. Método de las potencias


Describimos en esta sección un método numérico para calcular el autovalor de módulo máximo de una
matriz. Supongamos que A es una matriz diagonalizable de tamaño n, con autovalores verificando

|λ1 | > |λ2 | ≥ |λ3 | ≥ · · · ≥ |λn | ,

es decir, con un único autovalor de módulo máximo, y con multiplicidad algebraica 1. Esta situación es
genérica si se toma una matriz arbitraria de tipo numérico.
Sea x0 un vector “casi” arbitrario, y xk = Ak x0 . En las condiciones del enunciado, puede demostrarse
que la dirección de xk se aproxima a la de un autovector correspondiente al autovalor λ1 , a condición de
que, si {v1 , v2 , . . . , vn } es una base de autovectores, vi asociado a λi , y escribimos x0 = α1 v1 + α2 v2 +
· · · + αn vn , se tenga que α1 6= 0. Asimismo, xk+1 ∼ λ1 xk . Esto es la base del método de las potencias
que pasaremos a implementar.
Este vector xk puede tender a cero o a infinito, con lo que hay que normalizarlo para que esto no
ocurra. Para ello hay varias posibilidades: una de ellas es reducir al valor 1 la componente de x0 de mayor
valor absoluto, dividiendo por ella. Nos pueden ser útiles los comandos abs y max de Matlabr. Otra es
dividir por la norma de x0 . La orden norm es entonces necesaria.
Ejercicio 2
Busca en la ayuda de Matlabr información sobre los comandos abs, max, y norm aplicados a
vectores o a matrices. Escribe un programa en Matlabr que tome un vector y lo divida por una
componente cuyo módulo sea máximo.

2
Vamos a programar el método de las potencias siguiendo el siguiente esquema, que corresponde a la
primera de las técnicas de normalización que hemos comentado:

Dados A, x0 , numiter
Desde k = 1 hasta numiter

xk = Axk−1
Definimos αk como una componente de xk de módulo máximo.
xk = xk /αk % Normalizamos el vector xk .
Fin del bucle.
Devuelve xnumiter , αnumiter .

Es un esquema muy simple, donde numiter es el número de iteraciones que efectuamos, que es fijo en
r
este programa. En código de Matlab tenemos lo siguiente:

function [x,l]=potencia(a,v)
% Metodo de las potencias aplicado a una matriz a, a partir de un vector v
% Devuelve un autovector x y el autovalor l de modulo maximo
numiter=100;
x=v(:); %Esta orden hace de v un vector columna, y lo llama x
for k=1:numiter
x=a*x;
[m,p]=max(abs(x));
l=x(p);
x=1/l*x;
end
return

Como hemos dicho, una forma alternativa de programar es dividir en cada paso el vector por su
norma. Es decir, a partir del vector yk , de norma 1, calculamos xk+1 = Ayk . Para valores de k grandes
se tiene que xk+1 ∼ λ1 yk , y como yk tiene norma 1, λ1 resulta ser aproximadamente el producto escalar
r
de xk+1 y yk . En código de Matlab :

function [y,l]=potencia2(a,v)
% Metodo de las potencias
% En cada paso se divide el vector que se obtiene por su norma
% El numero de iteraciones es fijo
numiter=100;
x=v(:);
y=x/norm(x);
for k=1:numiter
x=a*y;
y=x/norm(x);
end
l=x.’*y;

Fijar el número de iteraciones no es habitualmente una buena estrategia. Es más eficaz poner un lı́mite
a dicho número, y fijar una precisión. Cuando se considere que esta precisión se ha alcanzado, detenemos
el proceso. Una posibilidad es ir calculando los valores del autovalor en cada paso, y detenernos cuando
este valor apenas se modifique. Modificamos el código de Matlabr:

3
function [y,l]=potencia3(a,v)
% Metodo de las potencias
% En cada paso se divide el vector que se obtiene por su norma
% numiter es el numero m\’{a}ximo de iteraciones
% eps es la precision fijada
%
% Si la diferencia entre dos valores consecutivos calculados de l
% es menor que eps, el programa se detiene
numiter=100;
eps=1e-10;
x=v(:);
y=x/norm(x);
l=0;
for k=1:numiter
x=a*y;
y=x/norm(x);
lc=x.’*y;
if abs(l-lc)<eps
return
end
l=lc;
end
return

3. Ejercicios
1. La orden compan construye, a partir de un polinomio, una matriz cuyo polinomio caracterı́stico es
el dado.
a) Usa dicha orden para construir una matriz cuyo polinomio caracterı́stico sea x5 −32x4 +23x3 −
10x + 9.
b) Calcula la raı́z de módulo más grande de dicho polinomio, empleando alguno de las rutinas
expuestas en esta práctica.
c) Verifica el resultado obtenido con la orden roots.
2. Elabora un programa que, a partir de un polinomio, calcule su raı́z de módulo más grande.
3. El método de las potencias, aplicado a la inversa de una matriz A, permite calcular el autovalor de
módulo mı́nimo, pues λ es un autovalor de A si y sólo si λ−1 lo es de A−1 . Modifica alguno de los
programas de esta práctica para que pueda calcularse el autovalor de módulo mı́nimo de A.
4. Por último, observa que λ es un autovalor de A si y sólo si λ − α lo es de A − αI. Esto permite
calcular el autovalor más alejado a α. Modifica el programa para que realice esta operación.

También podría gustarte