Vous êtes sur la page 1sur 67

Proyecto #2: Programacion avanzada en Matlab.

Metodos iterativos para sistemas de ecuaciones lineales


Vctor Domnguez
http://www.unavarra.es/personal/victor dominguez/
9 de marzo de 2005
Captulo 1
Introduccion
Well, in our country said Alice, still panting a little, Youd
generally get to somewhere elseif you ran very fast for a long
time as weve been doing.
A slow sort of country! said the Queen. Now, here, you see,
it takes all the running you can do, to keep in the same place. If
you want to get somewhere else, you must run at least twice as
fast as that.
Lewis Carroll, Through the Looking Glass
En el primer apartado entraremos en aspectos mas avanzados sobre vectores y matrices
en Matlab haciendo un hincapie especial en la manipulacion de matrices sparse. Veremos
tambien como se puede implementar funciones donde el n umero de argumentos de entrada
y salida son variables.
En la parte matematica, tocaremos la teora basica de metodos iterativos para siste-
mas de ecuaciones lineales. Empezaremos con lo metodos clasicos: Jacobi, Gauss-Seidel
y Relajaci on, para pasar luego a metodos mas modernos y elaborados, el metodo del
gradiente y especialmente, el metodo del Gradiente Conjugado.
#2 1
Parte I
Matlab: programacion avanzada
#2 3
Captulo 2
Las matrices revisitadas
A estas alturas el lector ya debera estar convencido sobre las capacidades de Matlab
en lo que se reere al manejo de enormes cantidades de memoria. En esta seccion expon-
dremos algunos comandos adicionales y entraremos con cierto detalle en la manipulacion
de matricessparse
1
.
2.1. Acceso a partes estructuras de una matriz
En ocasiones es importante tomar partes precisas de una matriz que no son necesaria-
mente partes de las, columnas o simplemente submatrices (estas acciones ya se trataron
en el Proyecto #1). Para este n nos pueden servir las siguientes instrucciones
diag triu tril
La primera toma la diagonal de una matriz, la segunda y tercera la parte triangular
superior (upper) e inferior (lower). Sin embargo los comandos son algo mas exibles de lo
que pueda parecer a simple vista.
Empecemos introduciendo una matriz
>> a=[11 12 13; 21 22 23; 24 25 26];
El resultado los siguientes comandos es, a la luz de lo anterior, esperable
>> diag(a)
ans =
11
22
26
>> triu(a)
ans =
1
Aceptaremos este anglicismo en lo que sigue. En ocasiones este vocablo se traduce por matrices huecas
o matrices dispersas.
#2 5
2.1 Acceso a partes estructuras de una matriz PROYECTO #2
11 12 13
0 22 23
0 0 26
>> tril(a)
ans =
11 0 0
21 22 0
24 25 26
El usuario puede especicar que diagonal toma, o a partir de que diagonal corta la ma-
triz. La diagonal principal es la cero, subdiagonales inferiores (respectivamente superiores)
se numeran consecutivamente con n umeros enteros negativos (respectivamente positivos).
Las siguientes instrucciones ilustran estas caractersticas.
>> diag(a,-1)
ans =
21
25
>> tril(a,-1)
ans =
0 0 0
21 0 0
24 25 0
>> triu(a,0)
ans =
11 12 13
0 22 23
0 0 33
Ejercicio 1 Programar una funcion que dada una matriz a devuelva un vector d con
los elementos de la diagonal, una matriz triangular superior u con todos los elementos
de a situados encima de la diagonal superior y l con todas las entradas de debajo de la
diagonal principal

#2 6
PROYECTO #2 Cap

tulo 2. Las matrices revisitadas


Ejercicio 2 Que sucede si aplicamos las instrucciones anteriores a matrices rectangula-
res?

Con diag podemos tambien construir a partir de un vector una matriz diagonal
>> diag([1 2 ]) % es lo mismo que diag([1 2],0)
ans =
1 0
0 2
>> diag([1 2 ],1)
ans =
0 1 0
0 0 2
0 0 0
>> diag([1 2 ],-1)
ans =
0 0 0
1 0 0
0 2 0
Observese que sucede cuando se aplica dos veces el comando diag.
>> a=[1 2 3; 4 5 6; 7 8 9];
>> diag(diag(a))
ans =
1 0 0
0 5 0
0 0 9
Trasposicion de matrices
Entre todas las operaciones que cambian la estructura de matriz, podemos armar que
la mas com un es la transposicion. Esta operacion se suele denotar (matematicamente) con
un apostrofe
2
. Consiste en intercambiar las y columnas de una matriz, de forma que
las las de a pasan a ser las columnas de a. Este mismo smbolo es utilizado por Matlab:
2
Otras notaciones son

, com un sobre todo en aritmetica con n umeros complejos.


#2 7
2.1 Acceso a partes estructuras de una matriz PROYECTO #2
>> a=[1 2 3; 0 2 4]
a =
1 2 3
0 2 4
>> a
ans =
1 0
2 2
3 4
Tambien se aplica sobre vectores:
>> b=[1;2;3]; % vector COLUMNA con tres elementos
>> b % vemos ahora un vector FILA
ans =
1 2 3
De nuevo nos encontramos con esta propiedad sobre la que ya hemos incidido: Matlab
distingue entre vectores las y columnas, y esta diferencia se hace especialmente palpable
(y en ocasiones molesta) a la hora de realizar operaciones como productos matriz-vector.
Nota. En Matlab existe tambien el operador .. Sobre matrices reales funciona exac-
tamente igual que el comando anterior., pero no as sobre n umeros complejos. Mientras
conjuga ademas todas las entradas
3
, . se limita a cambiar la forma de matriz sin
tocar los elementos de esta.
>> clear i % i es ahora la unidad imaginaria
>> a=[i 1-i; 1+i i];
>> a.
ans =
0 + 1.0000i 1.0000 + 1.0000i
1.0000 - 1.0000i 0 + 1.0000i
>> a
3
es decir, cambia el signo a la parte imaginaria de cada elemento. Matematicamente hablando, este es
el operador de transposicion o conjugacion.
#2 8
PROYECTO #2 Cap

tulo 2. Las matrices revisitadas


ans =
0 - 1.0000i 1.0000 - 1.0000i
1.0000 + 1.0000i 0 - 1.0000i

Cuando sobre una matriz a utilizamos la instruccion a(:) obtenemos un vector


columna construido concatenando las columnas de a. Tecnicamente hablando, nos esta mos-
trando la matriz tal como se guarda en memoria. Por ejemplo, con a como antes,
>> a=[1 2 3; 0 2 4];
>> a(:)
ans =
1
0
2
2
3
4
>> a=a; % (trasponemos a)
>> a(:)
ans =
1
2
3
0
2
4
Esto puede utilizarse para hacer un par de trucos.
En ocasiones la entrada de una funcion es un vector, sin importar si este es la o
columna
4
Si deseamos pasarlo a columna para as manipularlo a nuestro antojo podemos
utilizar
>> b=b(:);
que hara de b un vector columna, sea cual sea su formato inicial. Si lo que se desea
es un vector la, basta con transponer
4
Por ejemplo, si implementamos una funcion con el metodo de Gauss, deberamos exigir que el termino
independiente fuera un vector columna.
#2 9
2.2 Mas operaciones sobre matrices PROYECTO #2
>> b=b(:).;
Se puede utilizar para introducir las entradas de una matriz por columna. A modo
de ejemplo, observese
>> a=zeros(4,3);
>> a(:)=[1 2 3 4 5 6 7 8 9 10 11 12]
a =
1 5 9
2 6 10
3 7 11
4 8 12
>> a2=zeros(2,6);
>> a2(:)=a(:)
a2=
1 3 5 7 9 11
2 4 6 8 10 12
Nota. El comando reshape permite modicar las dimensiones de una matriz (o array
en general). Es mas exible que el comando :.
2.2. Mas operaciones sobre matrices
Hasta ahora las operaciones matriciales que han centrado nuestra atencion son las
fundamentales: suma y producto.
En Matlab estan tambien implementadas otras operaciones comunes en el algebra
lineal. Destacamos:
dot: Calcula el producto escalar de dos vectores:
>> dot([1 2 3],[4 5 6])
ans =
32
Devuelve el produto 4 +2 5 +3 6 = 32. Este comando no distingue entre vectores
las y columnas, y es aplicable siempre que tengan la misma longitud.
#2 10
PROYECTO #2 Cap

tulo 2. Las matrices revisitadas


La funcion se puede aplicar a matrices bien por columnas, que es la estandar
5
o por
las.
>> a=[1 2 3; 4 5 6]; a2=[1 1 1; 1 1 1];
>> dot(a,a2) % producto por columnas
ans =
5 7 9
>> dot(a,a2,2) % producto por filas
ans =
6
15
sum: calcula la suma de un vector. Es aplicable tambien a matrices, en el sentido de la
instruccion anterior
>> v=[1 2 3]; a=[1 2 3; 4 5 6];
>> sum(v)
ans =
6
>> sum(a)
ans =
5 7 9
>> sum(a,2)
ans =
6
15
kron: producto tensorial de Kronecker.
norm: norma de una matriz o vector. Se puede escoger entre varias normas.
5
Recuerdese la predileccion de Matlab por las columnas.
#2 11
2.2 Mas operaciones sobre matrices PROYECTO #2
>> v=[1 2 3];a=[1 2; 3 4];
>> [norm(v) norm(v,1) norm(v,inf)] % norma 2, 1 e infinito de v
ans =
3.7417 6.0000 3.0000
>> [norm(a) norm(a,1) norm(a,inf)]
ans =
5.4650 6.0000 7.0000
En la seccion 6.1 comentaremos brevemente la denicion de estas normas
rank: rango numerico de una matriz
6
.
cond: condicionamiento de una matriz. Es equivalente a a calcular norm(a)*norm(inv(a))
y da una medida de la sensibilidad del sistema a perturbaciones en el termino
independiente. Tambien es importante en la convergencia de multitud de metodos
iterativos.
rcond: estimador del inverso del condicionamiento de una matriz. Es sensiblemente mas
econ omico de calcular que cond
Nota sobre dot. Cuando el comando se aplica a dos vectores complejos, procede siem-
pre a conjugar el primer vector. Es decir, matematicamente
dot(u, v)
n

i=1
u
i
v
i
.
As, se puede observar la diferencia entre
>> u=[1+i 2+2i]; v=[2 1];
>> dot(u,v)
ans =
4.0000 - 4.0000i
>> dot(v,u)
ans =
4.0000 + 4.0000i
6
Esto es, el n umero maximo de las linealmente independientes. Una matriz tiene, en general, ran-
go maximo por los errores de precision de la maquina. Este comando hace una estimacion del rango,
eliminando este factor.
#2 12
PROYECTO #2 Cap

tulo 2. Las matrices revisitadas


2.3. Matrices sparse
Las matrices sparse son un importante subgrupo de matrices que surgen en diferentes
ambitos del analisis numerico y de las Matematicas en general (elementos nitos, teora
de grafos,...).
En la gura 2.1 se puede ver un ejemplo de una matriz sparse simetrica donde los
puntos indican las entradas diferentes de cero. Desde una optica puramente computacional
hace falta desarrollar sistemas de almacenamiento especial dado que la inmensa mayora
de las entradas no deben ser almacenados porque son nulas.
Figura 2.1: Matriz sparse 400 400 con 2690 entradas no nulas
Matlab provee de forma muy sencilla de ese almacenamiento. Con
>>a=sparse(100,100); b=sparse(100,1);
declaramos a como una matriz sparse 100100 y un vector columna de 100 terminos.
Todas las entradas son inicialmente ceros, pero se ha creado la estructura basica para
introducir los elementos no nulos
>> a=sparse(100,100)
a =
All zero sparse: 100-by-100
>> a(4,4)=1; a(8,9)=-4; a(80,45)=-1; a(99,100)=4;
>> a
a =
#2 13
2.3 Matrices sparse PROYECTO #2
(4,4) 1
(8,9) -4
(80,45) -1
(99,100) 4
Cuando se aplica a una matriz llena, transforma esta en una matriz sparse
>> a=diag([1 2 3 4 5])
a =
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5
>> a=sparse(a)
a =
(1,1) 1
(2,2) 2
(3,3) 3
(4,4) 4
(5,5) 5
Con full realizamos la operacion inversa: transforma una matriz sparse en una matriz
llena, convencional
>> a=full(a)
a =
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5
Un dibujo con el esquema de una matriz sparse (patern) (que se utilizo para crear
Figura 2.1), se obtiene con
>> spy(a)
La graca se muestra en una ventana separada
7
.
El resto de operaciones que hemos visto estan adaptados al nuevo entorno. As, los
operadores
7

Esta es, sorprendentemente, nuestra primera salida graca en Matlab.


#2 14
PROYECTO #2 Cap

tulo 2. Las matrices revisitadas


: triu tril diag
devuelven matrices sparse. Las operaciones
* + .* dot
estan asimismo optimizadas
8
.
Por otro lado, aparecen una nueva serie de comandos entre los que merecen la pena
destacarse
spdiags speye spones sprand sprandn sprandsym
La primera devuelve una matriz con la diagonal (o diagonales) especicada, la segunda
devuelve la matriz identidad, en formato sparse, y la tercera, aplicada a una matriz,
devuelve una matriz sparse con 1s en las mismas entradas que la matriz argumento. Las
tres ultimas generan matrices sparse aleatorias.
Ejercicio 3 Con la ayuda de Matlab, deduce la sintaxis concreta de los comandos ante-
riores y comprueba con alg un ejemplo como funcionan.

8
La forma de generar codigo eciente no es tan simple como pudiera parecer. Por ejemplo, si se aplica
la funcion dot a dos vectores sparse es preciso saber antes que entradas hay que multiplicar. De otra forma
podramos estar dedicando un alto porcentaje de nuestro esfuerzo en simplemente calcular productos por
cero. Afortunadamente, Matlab hace ese trabajo por nosotros.
#2 15
2.3 Matrices sparse PROYECTO #2
#2 16
Captulo 3
Programacion de funciones
Veremos a continuacion como se pueden programar funciones con el n umero de argu-
mentos de entrada como de salida sean variables. Esta caracterstica dota de una mayor
exibilidad a la programacion en Matlab.
Los comandos esenciales que precisamos son
varargin nargin varargout nargout
La instrucciones nargin y nargout informan respectivamente sobre el n umero de variables
de entrada y el n umero de variables de salida (variable in put argument) y variable out
put argument).
La funcion puede aceptar una serie de argumentos obligatorios, al estilo de las funcio-
nes que programamos en el proyecto anterior, y un conjunto de argumentos opcionales,
que pueden ser o no especicados por el usuario. Para acceder a estos ultimos se utili-
zan respectivamente varargin (variable input argument) y varargout variable output
argument) mediante llaves { }.
Listamos a continuacion un ejemplo de utilizacion conjunta de estas nuevas ordenes.
En la cabecera se informa
1
que hace la funcion, dependiendo de los argumentos de entrada
y salida.
01 % MILU
02 %
03 % [L,U] = MILU(A) Devuelve U triang superior, L permutacion de
04 % una triang inferior con 1s en la diagonal tal
05 % que A=LU
06 % [L,U,X] = MILU(A,B) Devuelve U triang superior, L permutacion de
07 % una triang.inferior con 1s en la diagonal tal
08 % que A=LU y la solucion del sistema AX=B
09
10 function varargout=milu(a,varargin)
11
1
Es importante que cualquier funcion en Matlab, por muy trivial que sea, cuente con una ayuda breve
y concisa sobre su nalidad e incluso detalles sobre su implementacion. Es util no solo para el usuario
sino de cara a posibles modicaciones que hagamos sobre el codigo mas adelante. La capacidad de olvido
de uno mismo no debe nunca ser minimizada
#2 17
PROYECTO #2
12 [l,u]=lu(a); % descomposicion LU
13
14 if nargin==1 & nargout==2
15 varargout{1}=l;
16 varargout{2}=u;
17 elseif nargin==2 & nargout==3
18 b=varargin{1}; % leemos el primer argumento opcional...
19 b=b(:); % y lo transformamos en un vector columna
20 varargout{1}=l; varargout{2}=u;
21 varargout{3}=u\(l\b); % solucion del sistema
22 end
23 end
Como puede comprobarse, la funcion precisa de un argumento obligatorio, la matriz a
y devuelve dos o tres argumentos seg un se requiera. Observese los resultados que se han
obtenido
2
.
>> a=[1 3; 2 4];
>> [l,u]=milu(a)
l =
0.5000 1.0000
1.0000 0
u =
2 4
0 1
>> [l,u,x]=milu(a,[1 2])
l =
0.5000 1.0000
1.0000 0
u =
2 4
0 1
x =
2
Observa como la lnea 19 permite introducir un vector la como termino independiente. El programa
lo pasa a columna automaticamente.
#2 18
PROYECTO #2 Cap

tulo 3. Programacion de funciones


1
0
>> [l,u]=milu(a,[1 2]) %falta un arg. de salida
??? Error using ==> milu
Too many output arguments.
>> [l,u,x]=milu(a) %faltan arg. de entrada
??? Error using ==> milu
Too many output arguments.
Ejercicio 4 A partir de la funcion anterior implementar una funcion que opera seg un la
siguiente cabecera
% MILU2
%
% R = MILU(A) Si A es simetrica definida positiva devuelve
% R triang superior tal que A=RR
% [R,x] = MILU(A,B) Si A es simetrica definida positiva devuelve
% R triang superior tal que A=RR y la solucion
% del sistema AX=B
% [L,U] = MILU(A) Devuelve U triang superior, L permutacion de
% una triang. inferior con 1s en la diagonal
% tal que A=LU
% [L,U,X]= MILU(A,B) Devuelve U triang superior, L permutacion de
% una triang. inferior con 1s en la diagonal
% tal que A=LU y la solucion del sistema AX=B
Nota: Realizar la comparacion A==A para testar si la matriz es
simetrica. Que devuelve esta comparacion? Como se puede utilizar para ver si efectivamente
la matriz es simetrica?. Que otras posibilidades podras utilizar?..
#2 19
PROYECTO #2
#2 20
Parte II
Matrices sparse en Matematicas.
Metodos iterativos para sistemas de
ecuaciones lineales
#2 21
Captulo 4
Matrices sparse en Matematicas
Este captulo sirve para ilustrar algunos usos del almacenamiento sparse. En la primera
seccion tratamos el metodo de Gauss para este tipo de matrices y revisamos de nuevo el
problema del relleno y como se puede minimizar con reordenamientos adecuados. Sirve
asimismo para ahondar en la problematica de los metodos directos y allanar y fundamentar
los metodos iterativos que se tratan en los siguientes captulos.
En el segundo ejemplo mostramos como los grafos se representan mediante una ma-
triz sparse, y como Matlab permite una manipulacion sencilla. En este apartado, casi
podramos decir que de caracter divulgativo, gira en torno a Google y su algoritmo de
puntuacion pagerank que se fundamenta en identicar la red con un (enorme) grafo diri-
gido y proceder a baremar las paginas de una forma ingeniosa.
4.1. Metodo de Gauss con matrices sparse
Recordemos que en Matlab la resolucion de sistemas de ecuaciones lineales mediante
el metodo de Gauss se efect ua con el operador \:
>> x=a\b;
Puede plantearse la cuestion de si es adecuado utilizar \ para matrices especiales, como
por ejemplo, matrices triangulares o permutaciones de estas, para los que la eliminacion
gaussiana no es necesaria puesto que las variables se pueden despejar de formar progesiva.
Estos temores son infundados: Matlab reconoce alguna de las estructura basicas y resuelve
de una manera optima el sistema
1
.
Ya hemos visto que el metodo de Gauss es matematicamente equivalente a calcular
dos matrices L y U triangular inferior y superior respectivamente con 1s en la diagonal
de L de forma que
A = LU.
1
Si se consulta la ayuda para este comando se puede leer que se reconocen tipos diferentes de matriz.
Por ejemplo, sparse o llena, simetrica o no simetrica, triangular o permutacion de esta, bandeada (los
elementos concentrados en torno a la diagonal), de Hessemberg (con todos los elementos por debajo de
la subdiagonal inferior nulos),... y aplica el metodo directo mas conveniente en cada caso. Testar si una
matriz pertenece a uno de estos tipos se puede realizar en un n umero de operaciones despreciable respecto
a las del metodo de Gauss.
#2 23
4.1 Metodo de Gauss con matrices sparse PROYECTO #2
En este caso, si se dispone de esta descomposicion, la resolucion del sistema se reduce a
la de dos sistemas triangulares,
Ax = b, Ly = b, Ux = y.
o en Matlab,
>> [l,u]=lu(a);
>> x=u\(l\b));
Si se aplica el metodo de Gauss con pivotaje parcial, la matriz L pasa a ser ahora una
permutaci on de una matriz triangular inferior ( de nuevo con 1s en la diagonal).
Los dos sistemas triangulares se resuelve en O(2n
2
) operaciones mientras que la des-
composicion, precisa de O(4n
3
/3). Ahora bien, esta descomposicion se puede utilizar rei-
teradamente con diferentes terminos independientes.
Una caracterstica muy habitual del metodo de Gauss para matrices sparse es el efecto
relleno (en ingles ll in), esto es, la insercion de nuevos elementos. Por ejemplo, tras un
unico paso del metodo de Gauss
_

_
x x x x x x
x x
x x
x x
x x
x x
_

_
x x x x x x
x x x x x
x x x x x
x x x x x
x x x x x
x x x x x
_

_
y la matriz es ahora llena. Sin llegar a esos extremos, si es habitual que las necesidades
de memoria se multipliquen al aplicar la eliminacion gaussiana. En la descomposicion LU
esto se reeja en un incremento en el n umero de entradas no nulas de la matriz con los
problemas que ello lleva consigo (mayores requerimientos de memoria, mayor n umero de
operaciones,...).
Figura 4.1: Efecto relleno.
#2 24
PROYECTO #2 Cap

tulo 4. Matrices sparse en Matematicas


La gura 4.1 es un buen ejemplo de este comportamiento. Se puede obtener mediante
las siguientes instrucciones en Matlab (que se pueden recoger para mayor comodidad en
un chero script)
load west0479 % matriz sparse de ejemplo en Matlab
a=west0479
[l,u]=lu(a);
close all
subplot(131)
spy(a)
title(matriz original)
subplot(132)
spy(l)
title(matriz L)
subplot(133)
spy(u)
title(matriz U)
Puede observarse como el n umero de entradas necesarias para guardar la descomposicion
es sensiblemente superior a las entradas de la matriz original.
Una forma de atenuar este efecto es reordenar adecuadamente las ecuaciones e incogni-
tas de la matriz de forma apropiada.
Dado que en aplicaciones practicas las matrices simetricas son muy comunes
2
nos
restringiremos en lo que sigue a esta familia de matrices. Por tanto se plantea la necesidad
de reordenar la matriz para minimizar el efecto relleno de una forma tal que la matriz
continue siendo simetrica. Por tanto es precisa cambiar de orden, permutar, tanto las las
(ecuaciones) como las incognitas.
En Matlab, en los comandos
symrcm symmmd
estan implementados dos algoritmos de reordenacion: el algoritmo inverso de Cuthill-
McKee y el algoritmo de mnimo grado.
Este tipo de tecnicas tuvieron su origen en la resolucion de ecuaciones en derivadas
parciales mediante metodos numericos. Un buen ejemplo lo podemos ver en la gura 4.2
obtenido al aplicar estas dos reordenaciones a matriz proveniente de la resolucion de la
ecuacion de Laplace por elementos nitos. Observa como se reduce el n umero de entradas
en las matrices L y U cuando se aplica alguno de los algoritmos anteriores.
Los algoritmos resultantes se pueden aplicar a matrices no simetricas. En cualquier
caso, debe recordarse que la descomposicion LU debe calcularse sin pivotaje, lo
que se consigue con el comando
3
>> [l,u]=lu(a,0);
2
O al menos matrices con estructura simetrica. Esto es, a(i, j) = 0 a(j, i) = 0. Todo lo que sigue es
igualmente valido para este tipo de matrices.
3
El segundo argumento, que solo esta disponible si la matriz a es sparse, ja un umbral para la
realizacion del pivotaje parcial. El valor 1 es el de defecto. De esta forma, valores proximos a cero obligan
a que el pivotaje se produzca solo cuando el desequilibrio entre el pivote y el resto de elementos de la
columna sea muy acusado.
#2 25
4.1 Metodo de Gauss con matrices sparse PROYECTO #2
Figura 4.2: Resultado de reordenar las las y columnas con symrcm y symmmd.
En cualquier caso, la solucion del (o de los) sistemas se lleva a cabo mediante
Solucion con reordenamiento...
01 p=symmmd(a); % permutacion. vale tb p=symrcm(a);
02 [l,u]=lu(a(p,p)); % l y u son ahora "mas sparse"
03 x=l\b(p); x=u\x; % resolvemos los dos sistemas triangulares
04 x(p)=x; % reordenamos las incognitas
#2 26
PROYECTO #2 Cap

tulo 4. Matrices sparse en Matematicas


En la lnea 01, p recoge una permutacion de 1:n (n es el n umero de las y columnas
de a) que reduce el efecto relleno de L y U.
Notas nales
Si la matriz es ademas simetrica denida positiva podemos utilizar la descomposicion
de Cholesky,
A = LL

donde L es triangular inferior con elementos sobre la diagonal estrictamente positi-


vos. Los sistemas de ecuaciones se reducen ahora a dos sistemas triangulares
Ly = b, Lx = y.
La instruccion correspondiente en Matlab es chol, que devuelve R triangular su-
perior de forma que
A = R

R
(es decir, en la notacion de estos apuntes
4
, L = R

). As, el algoritmo anterior, con


reordenacion adecuada, queda ahora
01 p=symmmd(a); % permutacion.... vale tb p=symrcm(a);
02 l=chol(a(p,p)); % l es ahora "mas sparse"
03 x=l\b(p); x=l\x; % resolvemos los dos sistemas triangulares
04 x(p)=x; % recuperamos la solucion original
La orden x=a\b realiza todo el proceso anterior de forma automatica si a es sparse.
Sin embargo en la forma que lo hemos expuesto podemos resolver reiteradamen-
te sistemas de ecuaciones con la misma matriz de coecientes al disponer de la
descomposicion LU o L

L.
Queda mas alla de los contenidos de este curso explicar como funcionan los algorit-
mos implementados symrcm y symmmd. Se puede se nalar no obstante que ambos se
basan en identicar la estructura de una matriz con la de un grafo no dirigido, donde
dos nodos i y j estan conectados si y solo si a(i,j)=0. El proceso de eliminacion
gaussiana se ve como la eliminacion sistematica de nodos y la creacion de nuevos
enlaces entre los nodos restantes. Concretamente, si hacemos ceros con la la i en
la la j, aparecen nuevos enlaces entre los nodos que estaban unidos con el nodo
i con los que estaban unidos con j. El problema se reescribe ahora en termino de
renumerar los nodos de una forma tal que se minimice el n umero de nuevos ejes
creados (gura 4.3).
Los gracos de la gura 4.2 han sido creados a traves del siguiente chero script.
% Calculamos la matriz de elementos finitos para
% un problema sobre un dominio en forma de L
4
Recuerda que el operador trasposicion

es en Matlab
#2 27
4.1 Metodo de Gauss con matrices sparse PROYECTO #2
[p,e,t]=initmesh(lshapeg,Hmax,0.2); % malla inicial
[p,e,t]=refinemesh(lshapeg,p,e,t); % refinamiento
[a,b]=assempde(lshapeb,p,e,t,1,0,1);
% a es la matriz (sparse) y b el termino independiente
% Primera fila de dibujos
[l,u]=lu(a,0); % no pivotaje
figure(1)
subplot(331)
spy(a); title(matriz original)
subplot(332)
spy(l); title(matriz L)
subplot(333)
spy(u); title(matriz U)
% Segunda fila de dibujos
p=symrcm(a); % reordenamiento filas y columnas
[l,u]=lu(a(p,p),0);
figure(1)
subplot(334)
spy(a(p,p)); title(matriz permutada con symrcm)
subplot(335)
spy(l); title(matriz L)
subplot(336)
spy(u); title(matriz U)
% Tercera fila de dibujos
p=symmmd(a); % reordenamiento filas y columnas
[l,u]=lu(a(p,p),0);
figure(1)
subplot(337)
spy(a(p,p)); title(matriz permutada con symmmd)
subplot(338)
spy(l); title(matriz L)
subplot(339)
spy(u); title(matriz U)
#2 28
PROYECTO #2 Cap

tulo 4. Matrices sparse en Matematicas


x x 0 x 0
x x x 0 x
0 x x 0 0
x 0 0 x 0
0 x 0 0 x
1
2
3
4
5
x x 0 x 0
0 x x x x
0 x x 0 0
0 x 0 x 0
0 x 0 0 x
x x 0 x 0
0 x x x x
0 0 x x x
0 0 x x x
0 0 x 0 x
x x 0 x 0
0 x x x x
0 0 x x x
0 0 0 x x
0 0 0 x x
x x 0 x 0
0 x x x x
0 0 x x x
0 0 0 x x
0 0 0 0 x
2
5
1
3
4
x 0 0 0 x
0 x x 0 x
0 0 x 0 x
0 0 0 x x
0 0 x x x
x 0 0 0 x
0 x x 0 x
0 x x 0 0
0 0 0 x x
x x 0 x x
x 0 0 0 x
0 x x 0 x
0 x x 0 0
0 0 0 x x
0 x 0 x x
x 0 0 0 x
0 x x 0 x
0 0 x 0 x
0 0 0 x x
0 0 0 x x
x 0 0 0 x
0 x x 0 x
0 0 x 0 x
0 0 0 x x
0 0 0 0 x
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
2
5
1
3
4
2
5
1
3
4
2
5
1
3
4
2
5
1
3
4
Figura 4.3: Eliminacion gaussiana y su representacion como un grafo. Efecto del reorde-
namiento
4.2. Matrices sparse y Google
5
Google
6
ha pasado a ser en su corta vida uno de los referentes mundiales de Internet.
Su sistema de b usqueda de paginas en la red ofrece en general unos resultados bastante
precisos. Una de las claves de su sistema es su metodo de evaluacion de las paginas,
denominado Pagerank
tm
. Este sistema eval ua las paginas WEBS seg un el n umero de
enlaces que permiten llegar a ella.
Concretamente, la cuestion es
Si una persona navega de forma continuada en un largo periodo de tiempo
que probabilidades hay de que llegue a una pagina web determinada?
Esta probabilidad es la que se utiliza para clasicar las paginas. A priori hay dos formas
de llegar a una pagina:
i) A traves de un enlace desde otra pagina (probabilidad p)
ii) Directamente (probabilidad (1 p)).
Un valor habitual es tomar p = 0.85.
En la gura 4.4 vemos un (muy) simple ejemplo de una WEB representado como un
grafo dirigido. Una echa de i a j indica que la pagina i tiene un enlace (un link) a la
pagina j.
5
Esta seccion se ha extrado esencialmente del libro Numerical Computing de Cleve Moler, disponible
en http://www.mathworks.com/moler/
6
Por si alg un despistado todava no conoce su direccion electronica, vistese http://www.google.es,
http://www.google.com y muchos mas...
#2 29
4.2 Matrices sparse y Google PROYECTO #2
1
4 2
6
3 5
Figura 4.4: Una web muy sencilla
En este ejemplo n = 6 es el n umero de paginas que cuenta con 9 enlaces. Este grafo
se puede representar matematicamente mediante la matriz 6 6
G = (g
ij
) =
_

_
1 1
1
1
1 1
1
1 1
_

_
donde
g
ij
= 1, Si llegamos a i desde j.
De forma natural esta matriz es sparse, puesto que con n paginas uno puede esperar que
el n umero de enlaces sea del orden de O(n) (esto es, proporcional al n umero de paginas).
Sea
c
j
=
n

i=1
g
ij
(n umero de enlaces que salen de j)
Entonces la probabilidad de llegar a i si estamos en j es
p
g
ij
c
j
..
Siguiendo un enlace desde j
+
1 p
n
. .
Tecleando la direccion
Esta informacion se puede recoger en la matriz A n n
a
ij
= p
g
ij
c
j
+
1 p
n
.
Esta matriz no es sparse, pero se puede escribir
pG +
1 p
n
e
n
e

n
#2 30
PROYECTO #2 Cap

tulo 4. Matrices sparse en Matematicas


donde e
n
es la matriz la 1 n
e
n
=
_
1 1 1

.
De esta forma se puede almacenar la matriz A sin necesidad de requerir grandes cantidades
de memoria. Es mas, el producto por cualquier vector se puede calcular con
Ax = pGx +
1 p
n
e
n
e

n
x = (1 p)Gx +
p
n
e
n
x
. .
Prod. escalar
e
n
.
Si denotamos por x
(0)
j
la probabilidad de estar en la pagina web j en un instante inicial,
entonces la probabilidad de llegar a la pagina web i en el paso primero es
n

j=1
a
ij
x
(0)
j
=: x
(1)
i
y por tanto
_

_
x
(1)
1
x
(1)
2

x
(1)
n
_

_
=
_

_
a
11
a
12
a
1n
a
21
a
22
a
2n
. . . . . . . . . . . . . . . . . .
a
n1
a
n2
a
nn
_

_
_

_
x
(0)
1
x
(0)
2

x
(0)
n
_

_
= Ax
0
.
De esta forma, denotando
x
m
= (x
(m)
1
, x
(m)
2
, . . . , x
(m)
n
)

las probabilidades de estar en una pagina web determinada en el paso m, obtenemos la


relacion
x
m+1
= Ax
m
.
La idea es hacer evolucionar el sistema hasta que se estabilice. Se puede probar que
entonces existe el lmite
x := lm
m
x
m
.
Propiedad Existe un unico x tal que
x = Ax, x

e
n
=
n

i=1
x
i
= 1.
Ademas, comenzando con un x
0
con sus componentes positivas y que sumen uno,
x = lm
m
x
m
.

El resultado es, en palabras llanas, que la probabilidad que estemos en una pagina
web (esto es, x), despues de navegar una cantidad suciente de timpo
7
es independiente
de como hemos empezado (es decir, de x
0
).
Aqu vemos una forma completamente inocente de programar este calculo
7
Ciertamente, podramos tener que dedicar muchas horas...
#2 31
4.2 Matrices sparse y Google PROYECTO #2
% PAGERANK(G)
%
% PAGERANK(G) Calcula el indice de impacto de una WEB dada
% por el grafo G
% El grafo tiene que ser conexo... es decir, no puede haber nodos
% separados el resto
function y=pagerank(g)
p=0.85; %
eps=0.0001; % criterio de parada
nmax=1000; % numero maximo de iteraciones
n=length(g);
x=1/n*ones(n,1);
for j=1:nmax
y=producto(g,x,p);
if norm(x-y)<eps
disp(convergencia)
return
end
x=y;
x=x/sum(x);
end
disp(Convergencia no alcanzada)
return
% funcion auxiliar
% calcula el producto a*x
% notese que la matriz no llega a construirse
%
function y= producto(g,x,p)
c=sum(g); c=c(:);
x=x(:);
n=length(x);
en=ones(n,1);
y=p*g*(x./c)+(1-p)/n*en*(en*x);
return
Desde un punto de vista matematico se trata de calcular el vector propio asociado al
valor propio 1
8
que cumple que

i
x
i
= 1.
Existen medios mas ecientes para el calculo de este vector. El metodo aqu utilizado
es el metodo de potencias. Otra posibilidad es el metodo de potencias desplazado que
8
Notese que la matriz A cumple que todas sus entradas son positivas y que la suma de los elementos
de cada la es 1. Una matriz de esta forma se denomina matriz de Markov, y se sabe por teora que 1 es
valor propio y que el vector propio tiene todas sus entradas positivas.
#2 32
PROYECTO #2 Cap

tulo 4. Matrices sparse en Matematicas


converge en un n umero menor de iteraciones pero aumentando en contrapartida el gasto
por iteraci on.
Notas nales
Aplicada al ejemplo de la gura 4.4, obtenemos este resultado
x =
_

_
0.2147
0.2075
0.2014
0.1427
0.0820
0.1518
_

_
Luego por orden de preferencia nos encontramos los nodos
1, 2, 3, 4, 6, 5
A pesar de que el nodo 2 solo se enlaza a traves de 1, la importancia del nodo 1
inuye en la buena puntuacion del nodo 2.
En problemas reales, las matrices son enormes
9
. Los grafos en general son no conexos
y hay que adaptar los algoritmos anteriores. Antes, hay un ltrado de acuerdo a las
palabras claves con las que se hace la b usqueda, que reducen el tama no. De todas
formas, la estrategia es esencialmente la que hemos expuesto.
Es posible hacer subir la evaluacion de una pagina mediante la creacion de paginas
webs que se enlacen entre ellas y especialmente sobre una. Este tipo de tecnicas,
denominada google bombing (literalmente bombardeo a google) ha sido utili-
zadas reiteradas veces por objetivos de diversa naturaleza, economicos, polticos, de
protesta.... Los algoritmos del buscador tratan de detectar este tipo de trampas y
reconstruir la evaluacion para que sea mas imparcial.
Google fue fundado por Sergey Brin (23 a nos entonces) y Larry Page (24), en 1995,
el primero ingeniero electrico y el segundo licenciado en matematicas. El nombre
proviene del n umero 10
100
que, aunque no ocialmente, se llama Googol
10
El ambiente desenfadado y el origen matematico del buscador tuvo un curioso re-
ejo en la primera oferta p ublica de acciones que tuvo lugar a principios del 2004.
Brin y Page sacaron al mercado una participacion de la compa na cuyo valor era
2.718.281.828 $, el n umero e con 10 cifras decimales
11
.
9
A 25 de Octubre de 2004, google haba catalogado 4.285.199.774 paginas
10
As lo denomino el matematico Edward Kasner. En ingles existe la palabra goggle que son unas gafas
de natacion (?).
11
Muy pocos se dieron cuenta de esta broma. Se hizo de nuevo palpable la escasa cultura cientca
en general y matematica en particular del mundo periodstico (como alegan algunos de ellos, son de
letras, como si el hecho de tener una formacion en ciencias exhimiera a uno de saber leer y escribir).
#2 33
4.2 Matrices sparse y Google PROYECTO #2
#2 34
Captulo 5
Metodos iterativos
5.1. Introduccion
Cuando una matriz es de tama no moderado
1
, casi nadie duda en utilizar el metodo de
Gauss en alguna de sus m ultiples variantes (incluida las descomposiciones matriciales).
Los metodos iterativos sin embargo se vuelven imprescindibles en problemas con ma-
trices grandes y sparse donde el metodo de Gauss presenta las dicultades que ya hemos
se nalado.
Esencialmente, un metodo iterativo toma un sistema lineal
Ax = b
y construye una sucesion de vectores de forma que
x
m
x.
La forma de construir esta sucesion depende, obviamente, de la matriz A y del termino
independiente.
Existen multitud de esquemas diferentes pero todos comparten las siguientes desven-
tajas:
No siempre convergen, dependen de propiedades de la matriz (y no del termino
independiente!).
Los resultados teoricos sobre convergencia son a menudo pobres. Esto es, en general
existe convergencia en situaciones mucho mas generales de lo que la teora predice.
La velocidad de convergencia puede ser extremadamente lenta.
Sin embargo, como aspectos muy positivos conviene citar
Son metodos no destructivos. No modican la matriz del sistema y, en general,
precisan solo multiplicar por la matriz del sistema, o por parte de ella.
Son mas estables frente a los errores de redondeo.
Se dispone en cada paso de una aproximacion de la solucion.
1
es difcil denir que se entiende por tama no moderado. Ciertamente, tama nos enormes en la decada
de los a nos 70 son ahora perfectamente manejables en un peque no PC.
#2 35
5.2 Detalles sobre su implementacion PROYECTO #2
5.2. Detalles sobre su implementacion
A la hora de implementar un metodo iterativo hay que tener en cuenta una serie de
detalles.
En primer lugar, como metodo iterativo que es no podemos esperar calcular exac-
tamente la solucion, sino calcular esta con una tolerancia (aproximacion) prejada. Por
tanto debemos jar un criterio de parada que termine el metodo cuando la solucion se
considere sucientemente buena
2
.
Obviamente, no se puede calcular el error dado que no se dispone de la solucion exacta
3
.
Un buen criterio es medir la diferencia entre dos iteraciones consecutivas
x
m+1
x
m

en alguna norma que queda a eleccion del programador o del usuario. Si la diferencia es
peque na, se considera que estamos cerca de la solucion y se naliza el metodo.
De nuevo nos encontramos con el problema de denir peque no. Por ejemplo, una
diferencia de 1.4 entre dos iteraciones puede ser grande si la solucion tiene un tama no
x 10
1
o peque na si x 10
10
.
Por ello se puede hacer un promedio entre el error absoluto y el relativo. Concreta-
mente, si x y y son dos iteraciones consecutivas, se puede hacer
01 aux=norm(x-y); % norma 2 entre x e y
02 if (aux<eps1+eps2*aux)
03 disp(Convergencia alcanzada...
04 ..........
05 end
En la lnea 02 tenemos en cuenta tanto el error absoluto (eps1) como el error relativo
(eps2). Estos valores son parametros que jan el criterio de parada y pueden ser dados
por el usuario.
Otros criterios se basan en calcular b Ax, el residuo de x, y calcular el tama no. En
este caso tenemos dos componentes, una error absoluto y un error relativo, relacionado
con el tama no del termino independiente b:
01 aux=norm(b-a*x); % norma 2 entre x e y
02 if (aux<eps1+eps2*norm(b))
03 disp(Convergencia alcanzada...
04 ..........
05 end
Por otro lado, y desde un punto de vista computacional, debemos evitar que el metodo
entre en un bucle innito. Es decir, jar un n umero maximo de iteraciones de forma que
si esta se supera, se termine el metodo con un mensaje de error
4
.
2
Esto no es grave. Los sistemas de ecuaciones lineales suelen venir de metodos que calculan soluciones
aproximadas de problemas fsicos e ingenieriles. No tiene pues sentido obcecarse en calcular la solucion
exacta de un problema aproximado
3
Si se dispone de la solucion exacta, para que aplicar un metodo iterativo?
4
Existe otro problema: que la solucion crezca de forma que supere la cantidad maxima representable
en coma otante overow. Matlab devolvera inf o -inf.
#2 36
Captulo 6
Metodos iterativos clasicos
6.1. Conocimientos previos
A la hora de estudiar convergencia, precisamos medir esta. Ello nos obliga a consi-
derar normas con las que recabar informacion sobre el tama no de un vector.
Entre las normas habituales, tenemos para
x := (x
1
, x
2
, . . . , x
n
)

R
n
las siguientes normas
x
1
:= |x
1
| +|x
2
| + . . . +|x
n
|
x
2
:=
_
x
2
1
+ x
2
2
+ . . . + x
2
n
x

:= max
i=1,...,n
|x
i
|
Todas ellas estan implementadas en Matlab, como ya se vio en la pag. 11. Las normas
vectoriales denen a su vez una norma sobre las matrices
A = sup
xR
n
Ax
x
denominada norma inducida
1
. Es facil ver que
A
1
= max
j=1,...,n
n

i=1
|a
ij
|, A

= max
i=1,...,n
n

j=1
|a
ij
|.
La norma
2
tiene una expresion mas complicada que hace difcil su calculo real. En
concreto
A
2
=
_
(A

A)
donde (B), denominado radio espectral, denota el mayor de los valores absolutos de
los valores propios de B
2
. En cualquier caso, la orden norm cuando se aplica a matrices
devuelve las correspondientes normas matriciales.
1
la norma matricial mide cuanto cambia el tama no de un vector al multiplicarlo por la matriz
2
Si A es simetrica se verica facilmente que A
2
= (A)
#2 37
6.2 Denici on y condiciones de convergencia PROYECTO #2
La norma matricial y vectorial se relacionan con
Ax
. .
norma vectorial
A
..
norma matricial
x
..
norma vectorial
6.2. Denicion y condiciones de convergencia
Los metodos iterativos lineales (o basados en iteraciones anes) consiste en considerar
una particion de A tal que
A = M N
con M invertible. As, si x es solucion de Ax = b,
Mx = Nx +b.
El metodo iterativo es
Tomar x
0
una aproximacion de la solucion. Si no se conoce se puede tomar por
ejemplo el vector nulo.
Construir
Mx
m+1
= Nx
m
+b (6.1)
Es facil ver que si (6.1) converge a alg un x, entonces el vector es la solucion del sistema.
A un es mas restando dos iteraciones sucesivas es inmediato comprobar que
x
m+k+1
x
m+k
= (M
1
N)(x
m+k
x
m+k1
) = . . . = (M
1
N)
k
(x
m+1
x
m
).
Denotando por B = M
1
N se tiene el siguiente resultado
Teorema. El metodo iterativo converge si y solo si existe k tal que B
k
< 1.
Un detalle al que a veces se presta poca atencion es que la convergencia del metodo
ocurre sea cual sea x
0
, es decir, independientemente de como se arranque el metodo y
del termino independiente. Obviamente, si se tiene una estimacion buena de la solucion
el metodo convergera en menos iteraciones, pero no es una condicion para asegurar la
convergencia
3
.
No es difcil ver que
(B) B.
para cualquier norma inducida, y por tanto
((B
k
))
1/k
(B
k
)
1/k
k N.
Es mas, se puede probar
lm
k
B
k

1/k
= (B)
3
Esta propiedad se pierde en general cuando se resuelve ecuaciones y sistemas no lineales. En este
caso, los metodos numericos convergen solo si se arranca sucientemente cerca de la solucion.
#2 38
PROYECTO #2 Cap

tulo 6. Metodos iterativos clasicos


para cualquier norma inducida.
Por tanto, del resultado anterior, se obtiene que una condicion equivalente de
convergencia es que todos los valores propios de B = M
1
N tengan valor absoluto
menor estrictamente que 1. Esta propiedad justica que en el teorema no es relevante la
norma matricial que utilicemos en B y s del radio espectral (B).
Teorema. El metodo iterativo converge si y solo si (B) < 1.
El resultado anterior puede utilizarse para probar que
x
m+1
x C(B)
m
x
1
x
0

para todo m m
0
y C una constante independiente de m. La estimacion anterior justica
que a (B) se le llame en la literatura velocidad asintotica de convergencia, puesto
que mide la reduccion del error en cada iteracion.
Nota nal
Notese que si M = A, N = 0 y por tanto B = 0 y trivialmente
(B) = 0.
Es decir, hay convergencia en una unica iteracion
4
.
En general, uno asegura la convergencia cuando M recoge la informacion mas impor-
tante de A, de forma que N = M A tenga un tama no peque no. Por otro lado, se debe
tener en cuenta la denicion del metodo (6.1) y que por tanto en cada iteracion hay que
resolver un sistema de ecuaciones.
6.3. Metodos de Jacobi, Gauss-Seidel y Relajacion
Sea el sistema Ax = b donde
A =
_

_
a
11
a
12
. . . a
1n
a
21
a
22
. . . a
2n
.
.
.
.
.
.
.
.
.
.
.
.
a
n1
a
n2
. . . a
nn
_

_
La familia de metodos que vamos a exponer comienzan trabajando sobre la siguiente
particion de A
D =
_

_
a
11
a
22
.
.
.
a
nn
_

_
4
La iteracion es ahora resolver directamente el sistema de ecuaciones.
#2 39
6.3 Metodos de Jacobi, Gauss-Seidel y Relajacion PROYECTO #2
L =
_

_
0 0 0
a
21
0 0
.
.
.
.
.
.
.
.
.
.
.
.
a
n1
a
n2
0
_

_
U =
_

_
0 a
12
a
1n
0 0 a
2n
.
.
.
.
.
.
.
.
.
.
.
.
0 0 0
_

_
,
de forma que
A = D L U.
6.3.1. Metodo de Jacobi
Consiste en tomar en la denicion del metodo iterativo M = D y N = L+U, es decir
Dx
m+1
= (L + U)x
m
+b.
Para calcular x
m+1
hay que resolver por tanto un sistema diagonal cuyo coste es despre-
ciable. Visto componente a componente, tenemos que si
x
m+1
= (x
(m+1)
1
, x
(m+1)
2
, . . . , x
(m+1)
n
)

R
n
entonces
x
(m+1)
i
=
1
a
ii
_
b
i

j=i
a
ij
x
(m)
j
_
, i = 1, . . . , n.
Una matriz es diagonal dominante por las si
|a
ii
| >

j=i
|a
ij
|, i
y por columnas si
|a
jj
| >

i=j
|a
ij
|, j.
Como resultado parcial de convergencia tenemos el siguiente resultado.
Teorema El metodo de Jacobi converge si la matriz es diagonal dominante por las o
columnas.
Nota La situacion anterior es una constante en los metodos iterativos. En general se
enuncian condiciones sucientes para asegurar la convergencia, pero pocos resultados dan
condiciones necesarias, y a un estos suelen dar hipotesis complicadas de comprobar.
Ejercicio 5 (matematico) Probar el teorema anterior.
(Ayuda. Construir la matriz B = D
1
(L+U). Probar que B

< 1 si es dominante por las


o B
1
< 1 si es dominante por columnas. Aplicando el teorema de la seccion 6.2, se tiene el
resultado.)

El algoritmo que exponemos es el siguiente: jamos


#2 40
PROYECTO #2 Cap

tulo 6. Metodos iterativos clasicos


x= aproximacion inicial, mmax= n umero maximo de iteraciones
eps1, eps2=tolerancia absoluta y relativa.
y tomamos como criterio de parada la norma 1 de la diferencia entre dos iteraciones
sucesivas del metodo. La eleccion de dicha norma es libre, podemos tomar por ejemplo la
norma 2 o la norma innito.
Una primera version de nuestro algoritmo es la siguiente
Jacobi
01 for m=1:mmax
02 error=0; y=x
03 for i=1:n
04 x
i
= b
i
05 for j = 1 to i 1 do
06 x
i
= x
i
a
ij
y
j
07 end
08 for j = i + 1 to n do
09 x
i
= x
i
a
ij
y
j
10 end
11 x
i
= x
i
/a
i,i
.
12 error=error+|y
i
x
i
|
13 end
14 if error<eps2+eps1*norm(x)
15 return
16 end
17 end
18 disp(numero maximo de iteraciones alcanzado)
19 return
Ejercicio 6 Implementar el metodo de Jacobi en Matlab con la siguiente cabecera
% JACOBI
%
% X = JACOBI(A,B) aplica el metodo de Jacobi para la
% resolucion del sistema AX=B
%
%[X,IT]= JACOBI(A,B) devuelve en IT el numero de
% iteraciones calculadas
%
%[X,IT]= JACOBI(A,B,ITMAX) ITMAX es el numero max. de iteraciones
%
%[X,IT]= JACOBI(A,B,ITMAX,... TOLABS,TOLREL son la tolerancia
% TOLABS,TOLREL) relativa y absoluta
%
#2 41
6.3 Metodos de Jacobi, Gauss-Seidel y Relajacion PROYECTO #2
%[X,IT]= JACOBI(A,B,ITMAX,...
% TOLABS,TOLREL,X0) Arranca el metodo con X0
%

Solucion. He aqu una implementacion de este metodo


01 % JACOBI
02 %
03 % X = JACOBI(A,B) aplica el metodo de Jacobi para la
04 % resolucion del sistema AX=B
05 %
06 %[X,IT]= JACOBI(A,B) devuelve en IT el numero de
07 % iteraciones calculadas
08 %
09 %[X,IT]= JACOBI(A,B,ITMAX) ITMAX es el numero max. de iteraciones
10 %
11 %[X,IT]= JACOBI(A,B,ITMAX,... TOLABS,TOLREL son la tolerancia
12 % TOLABS,TOLREL) relativa y absoluta
13 %
14 %[X,IT]= JACOBI(A,B,ITMAX,...
15 % TOLABS,TOLREL,X0) Arranca el metodo con X0
16 %
17 function [x, varargout]=jacobi(a,b,varargin)
18
19 % valores por defecto
20 n=length(a); mmax=100;
21 eps1=1e-4; % tolerancia absoluta
22 eps2=1e-4; % tolerancia relativa
23 x=zeros(n,1);
24 if nargin>2
25 mmax=varargin{1};
26 end
27 if nargin>3
28 eps1=varargin{2};
29 end
30 if nargin>4
31 eps2=varargin{3};
32 end
33 if nargin>5
34 x(:)=varargin{3}; %x es un vector columna
35 end
36
37 % Metodo de Jacobi
38
39 for m=1:mmax
#2 42
PROYECTO #2 Cap

tulo 6. Metodos iterativos clasicos


40 error=0;
41 y=x;
42 for i=1:n
43 v=[1:i-1 i+1:n];
44 x(i)=(b(i)-a(i,v)*y(v))/a(i,i);
45 end
46 error=norm(x-y,1); % otras normas con norm(x-y,2),norm(x-y,inf)
47 if (error<eps1+eps2*norm(x))
48 break
49 end
50 end
51 if (m==mmax)
52 disp(numero maximo de iteraciones sobrepasadas)
53 end
54
55 %salida
56
57 if (nargout>1)
58 varargout{1}=m;
59 end
60 return
Observese que el codigo realmente dedicado al metodo de Jacobi se reduce a apenas
diez lneas 39-50 con el resto lneas dedicadas al control del algoritmo y a la salida y
entrada de datos.
Notese ademas la lnea 43 que permite implementar en una unica lnea (44) el producto
por la parte no diagonal de a, que en el pseudocodigo ocupa 6 lneas (06-10)
El codigo anterior, sin embargo, es claramente optimizable. Los ejercicios siguientes
ahondan en los aspectos mejorables.
Ejercicio 7 Programar una nueva opcion de salida que de un vector error de longitud
m1 de forma que error(m) sea la diferencia entre x
m
y x
m+1
.

Ejercicio 8 Otra forma alternativa de implementar el metodo es reemplazar las lneas


42-45 por el producto
y=(b-a*x+d.*x)./d
o equivalentemente
y=x+(b-a*x)./d
donde d es la diagonal de la matriz. Observa que realizamos operaciones de mas (multi-
plicamos por la diagonal para luego restar su contribucion), pero el costo es despreciable
y la operacion es ahora puramente matricial. Implementa esta nueva forma y comprueba
el resultado. Obtienes mejoras en el redimiento del metodo
5
?

5
Deberas probar con matrices grandes. La orden rand te puede valer para ese n. Una forma de
asegurarte la convergencia es generar matrices diagonal dominantes. Como se puede hacer esto?
#2 43
6.3 Metodos de Jacobi, Gauss-Seidel y Relajacion PROYECTO #2
6.3.2. Metodo de Gauss-Seidel
El metodo de Gauss-Seidel
6
consiste en tomar M = D L y N = U, es decir
(D L)x
m+1
= Ux
m
+b. (6.2)
Para calcular x
m+1
hay que resolver un sistema, en este caso triangular. Repasando con
cuidado las operaciones, observamos que
x
(m+1)
i
=
1
a
ii
_
b
i

n1

j=1
a
ij
x
(m+1)
j

n

j=i+1
a
ij
x
(m)
j
_
, i = 1, . . . , n.
y escrito en forma algortmica,
Gauss-Seidel
01 for m=1:mmax
02 error=0; y=x
03 for i=1:n
04 x
i
= b
i
05 for j = 1 to i 1 do
06 x
i
= x
i
a
ij
x
j
07 end
08 for j = i + 1 to n do
09 x
i
= x
i
a
ij
y
j
10 end
11 x
i
= x
i
/a
i,i
.
12 error=error+|y
i
x
i
|
13 end
14 if error<eps2+eps1*norm(x)
15 return
16 end
17 end
18 disp(numero maximo de iteraciones alcanzado)
19 end if
As pues, la unica diferencia con el metodo de Jacobi es que Gauss-Seidel procede a
utilizar la nueva componente calculada x
i
en cuanto es posible (lneas 06-08) mientras
que Jacobi solo las utiliza en la nueva iteracion.
Esta propiedad crea la sensacion de que Gauss-Seidel es superior a Jacobi. No hay
razones matematicas que permitan apoyar esta impresion. De hecho existen matrices para
las que Jacobi converge y Gauss-Seidel diverge, aunque a fuerza de ser sincero hace falta
6
El nombre de este algorimo es muy curioso. Gauss no dise no este algoritmo y Seidel, que lo estudio a a
nales del siglo XIX, desaconsejaba su uso. Gauss desarrollo un metodo muy similar a este cuando trataba
de resolver un problema de geodesia que llevaba a un sistema lineal que no era compatible determinado.
El esquema que propona Gauss es lo que hoy conocemos como metodo de Gauss-Seidel.
#2 44
PROYECTO #2 Cap

tulo 6. Metodos iterativos clasicos


construir un ejemplo ex profeso (no es facil encontrar uno) para comprobar esta armacion.
Desde un punto de vista practico, si Jacobi converge es muy altamente probable que lo
haga tambien Gauss-Seidel y generalmente, este lo hara en menos iteraciones.
Teorema El metodo de Gauss-Seidel converge si
la matriz es diagonal dominante por las o columnas.
la matriz es simetrica denida positiva

Existe una teora que cubre el metodo de Gauss-Seidel y el metodo de Jacobi que
para un tipo particular de matrices que incluye como caso particular a las tridiagonales
y tridiagonales por bloques. Es decir matrices de la forma
_

_
A
1
B
1
C
2
A
2
B
2
.
.
.
.
.
.
.
.
.
C
n
A
n
_

_
donde A
i
, B
i
y C
i
son submatrices. La teora dice que el metodo de Jacobi converge si
y solo si Gauss-Seidel converge y este caso el metodo de Gauss-Seidel converge a doble
velocidad que el primero.
Ejercicio 9 Programa el metodo de Gauss-Seidel modicando de forma apropiada la
funcion del ejercicio 6.

Ejercicio 10 De manera similar a lo que se propuso en el ejercicio 8, podemos imple-


mentar la parte central del metodo mediante
y=l\(b-u*x)
o equivalentemente
y=x+l\(b-a*x)
donde
l=tril(a,0); u=triu(a,1);
Implementa el metodo resultante
(Ayuda: recuerda las instrucciones diag, triu y tril de la seccion 2.3)

#2 45
6.3 Metodos de Jacobi, Gauss-Seidel y Relajacion PROYECTO #2
Ejercicio 11 El metodo de Gauss-Seidel tiene un curiosa asimetra. Si observamos, la
primera componente de cada x
m
, comprobamos que esta se calcula utilizando los valores
de la anterior iteracion x
m1
, mientras que la ultima utiliza todas las componentes de
la nueva iteracion x
m
. Se puede planter el metodo de Gauss-Seidel inverso que es el que
resulta de intercambiar los papeles de L y U en (6.2). Ahora la situacion es justamente
la inversa. Mejora la velocidad de convergencia del metodo?

Ejercicio 12 El metodo de Gauss-Seidel simetrizado trata de solventar la asimetra


se nalada en el ejercicio anterior. Consiste en encajar dos iteraciones, una con Gauss-Seidel
y otra con el metodo de Gauss-Seidel inverso. Es decir, dado x
m
, uno aplica el metodo
de Gauss-Seidel para obtener x
m+1/2
para luego obtener con el metodo de Gauss-Seidel
inverso x
m+1
.
Implementa este metodo. Se reducen el n umero de iteraciones necesarias para alcanzar
la convergencia? Y el costo por iteracion? Te parece rentable esta aproximacion?.

6.3.3. Metodo de Relajacion


El metodo de relajacion es una simple modicacion sobre el metodo de Gauss-Seidel
consistente en realizar un promedio sobre la aproximacion que dara Gauss-Seidel y la
iteracion anterior.
Concretamente, la expresion es
x
(m+1)
i
= (1 )x
(m)
i
+

a
ii
_
b
i

i1

j=1
a
ij
x
(m+1)
j

n

j=i+1
a
ij
x
(m)
j
_
, i = 1, . . . , n
Si = 1 recuperamos el metodo de Gauss-Seidel. La idea es que una eleccion adecuada
del nuevo parametro permite acelerar el metodo.
No es facil encontrar el valor optimo de , aunque la teora dice que necesariamente
(0, 2) pues en caso contrario el metodo diverge.
Si la matriz es simetrica denida positiva o tridiagonal por bloques el metodo de
relajacion converge. Tambien converge si es diagonal dominante (por las o columnas),
pero, salvo para matrices tridiagonales por bloques, poco se puede decir acerca de la
eleccion optima del parametro
7
.
Desde un punto de vista practico, se suele determinar este parametro mediante ensayo
error. De forma algo sorprendente, es muy habitual que > 1 en problemas practicos
de ah el nombre que se le da a veces de sobrerelajacion (overrelaxed).
Por ultimo, aunque no sea inmediato, se puede comprobar que este metodo encaja en
el marco anterior, sin mas que tomar
M =
1

D L, N =
1

D + U
7
Y a un en este caso, la determinacion exacta del parametro optimo exige resolver un problema bastante
complicado.
#2 46
PROYECTO #2 Cap

tulo 6. Metodos iterativos clasicos


Ejercicio 13 Implementar el metodo de Relajacion a partir del metodo de Gauss. Incluir
como nuevo argumento de entrada el parametro . Un posible valor por defecto podra
ser = 1 con lo que tendramos el metodo de Gauss-Seidel.

Nota nal
Los metodos clasicos son poco utilizados en la practica y han sido reemplazados por
metodos mas potentes como los metodos de tipo Krylov de los que probablemente el
metodo del Gradiente Conjugado es el representante mas famoso.
Sin embargo, son utilizados como precondicionadores de estos metodos, es decir, como
un preproceso que acelera la convergencia.
#2 47
6.3 Metodos de Jacobi, Gauss-Seidel y Relajacion PROYECTO #2
#2 48
Captulo 7
Metodos de tipo gradiente
7.1. Introduccion
Notacion Recordemos que todos los vectores se consideran como vectores columnas.
As,
x

Ay = [x
1
x
2
x
n
]
_

_
a
11
a
12
a
1n
a
21
a
22
a
2n
. . . . . . . . . . . . . . . . . .
a
n1
a
n2
a
nn
_

_
_

_
y
1
y
2
.
.
.
y
n
_

_
En particular
x

y
es simplemente el producto escalar de los dos vectores x e y.
Consideremos un sistema lineal Ax = b donde A es simetrica y denida positiva,
esto es
A

= A, x

Ax > 0 si x = 0.
En particular, la matriz dene su propia norma, simplemente
x
A
:=

Ax,
conocida como norma de energa de A. Todas normas son equivalentes en R
n
, pero para
esta norma se tiene ademas

n
x
2
x
A

1
x
2
donde
1

2
....
n
> 0 son los valores propios
1
de A. La cantidad
(A) =

1

n
,
que sera relevante en lo que sigue, es conocida como condicionamiento de la matriz
2
.
1
Todos reales por ser A simetrica y todos no negativos por ser denida positiva
2
La nocion de condicionamiento se puede extender para matrices arbitrarias reemplazando los valores
propios por los denominados valores singulares, o mas en general, deniendolo como el producto de la
norma de A por la norma de su inversa.
#2 49
7.2 Metodos de descenso. Aspectos generales PROYECTO #2
Construimos la funcion
F(x) =
1
2
x

Ax x

b
conocido como funcional de energa. Si buscamos el mnimo de F, tenemos que, tras unos
simples calculos,
F = Ax b.
Por tanto,
Los problemas resolver Ax = b y encontrar el mnimo de F son
equivalentes
7.2. Metodos de descenso. Aspectos generales
La idea de estos metodos es sencilla. Consiste en dada una aproximacion x
m
de x,
Calcular una direccion de descenso d
m
Descender una cantidad
m
, tomando como nueva aproximacion
x
m+1
= x
m
+
m
d
m
.
Se procede as hasta que hay convergencia. Dos aspectos determinan el metodo: que di-
reccion se toma y cuanto se desciende.
En el metodo del gradiente, como el metodo de gradiente conjugado, se toma
m
de
forma que
F(x
m+1
) = mn
tR
F(x
m
+ td
m
)
es decir, se trata de minimizar, una vez escogida la direccion de descenso, en todo los
pasos el funcional de energa. Deniendo
g(t) = F(x
m
+ td
m
)
podemos comprobar que
g

(t) = d

m
Ad
m
d

m
(b Ax
m
)
. .
r
m
y por tanto el mnimo se alcanza cuando

m
:=
r

m
d
m
d

m
Ad
m
(7.1)
La cantidad r
m
= bAx
m
es obviamente el residuo de x
m
, que nos ha surgido ya antes.
As, los metodos de descenso toman en su aspecto mas general la forma
x
m+1
= x
m
+
m
d
m
, con d
m
tomada de alg un modo y
m
:=
r

m
d
m
d

m
Ad
m
#2 50
PROYECTO #2 Cap

tulo 7. Metodos de tipo gradiente


7.3. Metodo del gradiente
El metodo del gradiente toma como direccion de descenso el residuo. Esto es,
d
m
:= r
m
= b Ax
m
.
De forma que (utilizando (7.1)) el metodo es como sigue
x
m+1
= x
m
+
m
r
m
,
m
:=
r

m
r
m
r

m
Ar
m
(7.2)
Dado que A es denida positiva, r

m
Ar
m
> 0 salvo cuando el residuo es nulo. Pero,
obviamente, r
m
= 0 si y solo si x
m
= x y por tanto ha habido convergencia. De esta
forma evitamos dividir por cero cuando calculamos
m
.
Esta eleccion de la direccion de descenso es a priori razonable dado que la direccion
de maximo descenso en x
m
es
F(x
m
) = b Ax
m
= r
m
.
El algoritmo es, a grandes rasgos, el siguiente
Metodo del gradiente
01 x; r = b Ax; r = r

r
02 for m=1:mmax
03 p = Ar
04 =
r
r

p
05 x = x + r
06 r = r p
07 r = r

r
07 if

r eps1 + eps2b
08 return
09 end
10 end
11 disp(Numero maximo de iteraciones alcanzadas)
En el paso 06 estamos calculando el residuo de la solucion, y en r guardamos su norma
al cuadrado. Utilizamos para ello la siguiente relacion
r
k+1
= b Ax
k+1
= b Ax
k
+
k
Ar
k
= r
k

k
Ar
k
.
El criterio de parada se toma ahora a partir del residuo. De nuevo hay dos componentes,
un termino que controla el tama no absoluto (eps1) y otro que tiene en cuenta el tama no
relativo del residuo (eps1b). La norma que utilizamos es la eucldea, que es connatural
al metodo.
Ejercicio 14 Programa el metodo del gradiente
#2 51
7.3 Metodo del gradiente PROYECTO #2

Solucion. Una posible implementacion del metodo es la que sigue


01 % GRADIENTE
02 %
03 % X = GRADIENTE(A,B) Aplica el met. del gradiente para
04 % la resolucion del sistema AX=B
05 %
06 % X = GRADIENTE(A,B,ITMAX) ITMAX: numero max. de iteraciones
07 %
08 % X = GRADIENTE(A,B,ITMAX... TOLABS, TOLREL tolerancia
09 % TOLABS, TOLREL) absoluta y relativa
10 %
11 % X = GRADIENTE(A,B,ITMAX... X0 es el valor inicial
12 % TOLABS, TOLREL,X0)
13 %
14 %[X,IT] = GRADIENTE(A,B,ITMAX... Devuelve en IT el numero de
15 % TOLABS, TOLREL,XO) iteraciones calculadas
16 %[X,IT,R]= GRADIENTE(A,B,X0) R es un historial del metodo:
17 % TOLABS, TOLREL,XO) R(i) es el residuo en el paso i
18 %
19 function [x,varargout]= gradiente(a,b,varargin);
20
21 n=length(a); x=zeros(n,1); mmax=40;
22 tol1=1e-6; tol2=1e-6;
23 if nargin>2
24 mmax=varargin{1};
25 end
26 if nargin>3
27 tol1=varargin{2};
28 end
29 if nargin>4
30 tol2=varargin{3};
31 end
32 if (nargin>5)
33 x=varargin{4};
34 end
35
36 r=b-a*x; res(1)=dot(r,r); aux=norm(b);
37 for i=1:mmax
38 p=a*r;
39 xi=res(i)/dot(r,p);
40 x=x+xi*r;
41 r=r-xi*p;
42 res(i+1)=dot(r,r);
43 if (sqrt(res(i))<tol1+tol2*aux);
#2 52
PROYECTO #2 Cap

tulo 7. Metodos de tipo gradiente


44 break
45 end
46 end
47
48 if (mmax==i)
49 disp(numero maximo de iteraciones sobrepasadas)
50 end
51
52 if nargout>1
53 varargout{1}=i;
54 end
55 if nargout>2
56 varargout{2}=sqrt(res(:));
57 end
58 return
Prueba el metodo con un sistema con matriz simetrica denida positiva (nota: para
toda matriz A, A

A es simetrica denida positiva.)

La graca (7.1) se ha construido utilizando las instrucciones


>> n=40;a=rand(n,n); a=a*a; x=ones(n,1); b=a*x;
>> [x,it,r]=gradiente(a,b,100,1e-5,1e-5);
>> semilogy(r)
La escala utilizada para medir la norma del residuo es logartmica. Notese su fuerte
comportamiento oscilatorio.
0 10 20 30 40 50 60 70
10
2
10
1
10
0
10
1
10
2
10
3
10
4
Residuo
Iteraciones
Figura 7.1: Residuo en las sucesivas iteraciones del metodo del gradiente
#2 53
7.3 Metodo del gradiente PROYECTO #2
Breves notas sobre el estudio
La clave del analisis es la relacion, facilmente demostrable,
F(x
m+1
) F(x) =
1
2
(x
m+1
x)

A(x
m+1
x) =
1
2
x
m+1
x
. .
e
m+1

2
A
donde e
m+1
es el error entre la solucion exacta y la numerica. Por tanto, como F(x
m+1
)
F(x
m
),
e
m+1

A
e
m

A
luego hay un reduccion del error en la norma de energa (esto en ning un caso implica que
el residuo se reduzca, como bien podemos comprobar en la gura 7.1). A un es mas, la
eleccion hecha de
m
,
e
m+1

A
mn
R
x x
m
r
m

A
= mn
R
e
m
Ae
m

A
=
_
mn
R
I A
A
_
e
m

A
.
Proposicion Se tiene
mn
R
I A
A
= mn
R
I A
2
=

1

1
+
n
< 1
donde
1
y
n
son el mayor y menor valor propio de A.
Una forma muy comoda de escribir la convergencia es en termino del condicionamiento
de la matriz
(A) =

1

n
con lo que queda
e
m+1

A

(A) 1
(A) + 1
e
m

A
.
Es inmediato observar que
Hay convergencia para toda A simetrica denida positiva.
Si (A) >> 1, la convergencia puede ser muy lenta.
El metodo del gradiente genera unos residuos que suelen exhibir un comportamiento
muy oscilante.
Ejercicio 15 (puramente matematico) Sabiendo que dada A simetrica denida posi-
tiva existe B simetrica denida positiva tal que BB

= B
2
= A probar la identidad
I A
A
= I A
2
utilizada en la proposicion anterior.
(Ayuda: Observese que x
A
= Bx
2
. Utilizar ahora que
I A
A
= sup
xR
n
(I A)x
A
x
A
= sup
xR
n
B(I A)B
1
(Bx)
2
Bx
2
= sup
xR
n
B(I A)B
1
x
2
x
2
y completar la demostracion)
#2 54
PROYECTO #2 Cap

tulo 7. Metodos de tipo gradiente

Ejercicio 16 (demostracion de la proposicion) Como para toda matriz simetrica


A = max
j
|
j
|
con
j
el valor propio jesimo, obtenemos que
I A
A
= max
j
|1
j
|.
Denid g
c
() = |1 c| y trazad la graca de estas funciones para varias valores de c.
Cual es el valor optimo de c?. Utilizad esto para probar que = 2/(
1
+
n
) es el valor
que hace mnimo I A
A
y que para este valor,
I A
A
=

1

1
+
n
.
(Ayuda: Toma varios valores de c en la denicion de la funcion g
c
() y dibuja la gracas
resultantes. Obtendras algo similar a esto
0 1 2 3 4 5
0
0.5
1

Cuales son las gracas de los valores extremos? Cuanto vale el corte?)

7.4. El gradiente conjugado


El metodo del gradiente conjugado trata de resolver alguna de las dicultades obser-
vadas con el metodo del gradiente, como por ejemplo el comportamiento oscilatorio del
residuo. Observemos que, sea cual sea la direccion del descenso y por la eleccion de
m
hecha en (7.1),
r

m+1
r
m
= r

m
r
m

m
d

m
Ar
m
= 0
por lo que r
m+1
r
m
.
#2 55
7.4 El gradiente conjugado PROYECTO #2
En particular, la correccion que hace el metodo del gradiente en el paso m+1 genera
un residuo que es siempre perpendicular al que dena el paso anterior.
Sin embargo, en general ya no es cierto que
r
m+1
r
m1
y por tanto se pierde esta propiedad de ortogonalidad. Una idea que podemos considerar
es tomar la direccion de descenso d
m
de forma que el residuo r
m+1
sea perpendicular a
r
m
y r
m1
. Es facil ver que
r
m+1
= r
m

m
Ad
m
de manera que
r

m1
r
m+1
= 0 r

m1
Ad
m
= 0.
Ello nos lleva a considerar direcciones de descenso d
m
ligeramente diferentes,
d
m
= r
m
+
m
d
m1
.
Es decir, tomamos una perturbacion de la direccion natural r
m
donde
m
se toma para
que r

m
Ad
m
= 0. Despejando, obtenemos

m
=
r

m
r
m
r

m1
Ad
m1
.
Esta eleccion dene el metodo del Gradiente conjugado y provoca literalmente un
torrente de nuevas propiedades. Entre las mas importantes se pueden citar
i) Los residuos son todos ortogonales. Es decir
r
j
r
k
si j = k
ii) Las direcciones de descenso {d
j
}
j
son Aortogonales, es decir
d

j
Ad
k
= 0 si j = k.
La primera propiedad dice que no solo r
m+1
es perpendicular al residuo de las dos
iteraciones anteriores, sino que es ortogonal a todos los residuos calculados. Implica por
tanto la convergencia en n pasos del gradiente conjugado puesto que, como no puede
haber n + 1 vectores ortogonales en R
n
, al menos r
n+1
= 0. Ademas, la propiedad ii) se
puede utiliza para demostrar
r

m1
Ad
m1
= r

m1
r
m
y por tanto que
m
se puede escribir

m
=
r

m1
r
m1
r

m
r
m
=
r
m1

2
2
r
m

2
2
,
mas comoda de manejar. Notese que r
m1
es el residuo en el paso anterior y por tanto no
es preciso calcularlo de nuevo.
El algoritmo es
#2 56
PROYECTO #2 Cap

tulo 7. Metodos de tipo gradiente


Metodo del gradiente conjugado
01 x; r = b Ax; r
1
= r
2
; d = r
02 for m=1:mmax
03 p = Ad
04 =
r
2
r

p
05 x = x + d
06 r = r p
07 r
m+1
= r

r
08 if

r
m+1
eps1 + eps2b
09 return
10 end
11 =
r
m+1
r
m
12 d = r + d
13 end
14 disp(numero maximo de iteraciones alcanzada)
Como puedes ver, las modicaciones sobre el metodo del gradiente son mnimas. En
cada paso, es necesario calcular un producto matriz-vector (lnea 03) y dos productos
escalares (04 y 07) ademas de guardar la norma del residuo de la iteracion anterior. Pode-
mos optar por guardar los residuos de todas las iteraciones para disponer de informacion
de como ha sido la convergencia del metodo.
Ejercicio 17 Modicar el programa gradiente para implementar en una funcion de
nombre gradconjugado el metodo del gradiente conjugado.

Hemos ejecutado como antes


>> n=40;a=rand(n,n); a=a*a; x=ones(n,1); b=a*x;
>> [x,it,r]=gradconjugado(a,b,100,1e-5,1e-5);
>> semilogy(r)
y hemos desplegado en la gura 7.2 las normas de los residuos en cada paso.
Como se puede comprobar la convergencia es mas rapida y hemos reducido notable-
mente el molesto comportamiento oscilatorio del residuo.
Nota nal
El gradiente conjugado fue propuesto por Hestenes y Stiefel en 1952. Lo mas curioso es
que el metodo fue desarrollado de forma independiente por estos dos autores. Hestenes se
encontro con Stiefel en una conferencia en UCLA (University of California, Los Angeles)
#2 57
7.4 El gradiente conjugado PROYECTO #2
0 2 4 6 8 10 12 14
10
2
10
1
10
0
10
1
10
2
10
3
10
4
Residuo
Iteraciones
Figura 7.2: Residuo para el metodo del gradiente conjugado
y le comento a grandes trazos el metodo en el que estaba trabajando. Stiefel estaba
impresionado sobre las buenas propiedades que mostraba este metodo hasta que cayo en la
cuenta que se trataba del mismo metodo sobre el que el independiente estaba trabajando
3
.
Hemos visto que el metodo del gradiente conjugado es un metodo directo, en tanto en
cuanto da la solucion en un n umero nito de pasos, concretamente n, el n umero de las
de la matriz. Sin embargo, se programa como un metodo iterativo. En tal caso se tiene la
estimacion
e
m+1

A
2
_
_
(A) 1
_
(A) + 1
_
m
e
0

A
.
donde de nuevo e
m
:= x
m
x el error en el paso mesimo y e
0
el error inicial.
El resultado anterior es algo incompleto pero sirve para hacer patente la sensibilidad
del metodo ante el condicionamiento de una matriz que, aunque menor que en el caso del
metodo del gradiente (por la raz cuadrada), sigue siendo importante. Si la matriz tie-
ne un condicionamiento moderado, el metodo del gradiente conjugado dara una solucion
aceptable en unas pocas iteraciones. Sin embargo, esto no suele ser un caso habitual. Las
matrices que surgen en la resolucion de ecuaciones en derivadas parciales, por ejemplo
elementos o vol umenes nitos, suelen ser, demas de matrices sparse, muy mal condiciona-
das por lo que el metodo del gradiente conjugado da unos muy pobres resultados. Es mas,
puede requerir, y requiere en general, de mas de n iteraciones fruto de la contaminacion
por los errores de redondeo.
Estas razones hicieron que el gradiente conjugado se tomara como un metodo mas,
sin concederle especial relevancia y confundiendose con la multitud de metodos para la
resolucion de sistemas de ecuaciones lineales que surgan a su alrededor. Esta situacion se
prolongo durante casi 20 a nos hasta que las ideas del precondicionamiento cambiaron
3
Es posible que la posibilidad de expresar algunos de los parametros (ej. ) de forma distinta con-
tribuyera a esta confusion. No es de todas formas un caso aislado en las ciencias en general y en las
matematicas en particular. En ocasiones parece como si las ideas estuviesen otando en el ambiente a la
espera de que alguien diera el paso nal de plasmarlas.
#2 58
PROYECTO #2 Cap

tulo 7. Metodos de tipo gradiente


radicalmente esta situacion y encumbraron al Gradiente Conjugado a su posicion actual
4
.
El precondicionamiento consiste, a grandes rasgos, en cambiar el problema por uno
equivalente
5
Ax = b, L

AL
1
. .
B
y = L

b
. .
c
, x = L
1
y
y aplicar el metodo del gradiente al sistema By = c. A la matriz L se le conoce como
precondicionador del sistema
6
En general, la matriz B no se construye, porque el producto por el precondicionador
hace que se pierdan algunas de las buenas propiedades de la matriz original
7
. Es mas, uno
conoce L y no su inversa, y el hecho de calcular L
1
suele ser un problema tan complejo
como resolver el sistema original.
Ahora bien, y he aqu la ventaja del metodo, solo necesitamos calcular productos
por B. Obviamente, cualquier producto por la inversa de L, p = L
1
r, se hace resolviendo
el correspondiente sistema de ecuaciones
Lp = r.
Las buenas noticias son que es posible construir matrices L de forma que la resolucion de
los sistemas anteriores sea facil de hacer (por ejemplo, L puede ser triangular y sparse y
con un n umero de entradas comparable a la de A) y que la matriz producto B = L

AL
1
tenga un condicionamiento mucho menor, esto es, (B) << (A).
El metodo del gradiente conjugado rara vez se programa sin precondicionar. De hecho,
el comando de Matlab con el gradiente conjugado implementado es pcg de preconditioned
conjugate gradient.
Un buen precondicionador es la descomposicion de Choleski incompleta
8
. En Matlab
se encuentra implementada en el comando cholinc. Va mas alla de los contenidos de este
curso describir detalladamente en que consiste y por que funciona, pero no esta de mas
saber de su existencia.
En ultima medida, el exito del gradiente conjugado origino el nacimiento de una
familia entera de metodos, los conocidos como metodos de Krylov, que trataban de
extender las buenas propiedades del metodo a matrices mas generales. Por ejemplo, BiCG,
BiCGSTAB, CGS QMR, GMRES, MINRES, ... algunos de estos metodos suponen s olo
que la matriz es simetrica, otros son validos para matrices arbitrarias. De nuevo hay
que insistir en que los metodos mejores son mas exigentes con las condiciones que deben
cumplir la matriz. As cuando se persigue la generalidad se pierde potencia en el metodo.
4
La American Mathematic Society lo sit uo entre los diez algoritmos mas relevantes del siglo XX, junto
con, por ejemplo, la Transformada Rapida de Fourier (FFT).
5
Utilizamos la notacion L

= (L
1
)

, es decir invertir y trasponer (o equivalentemente, trasponer e


invertir)
6
La idea del precondicionamiento se extiende a casi todos los metodos iterativos. En el caso general
suele ser mas sencillo. Aqu, el producto a izquierda por L

y derecha L

se hace para que la matriz B


sea de nuevo simetrica denida positiva.
7
La inversa de una matriz sparse, no es sparse (en general). Por tanto, aunque habitualmente L es
una matriz sparse, L

ya no lo es. Se puede comprender facilmente las consecuencias que tiene invertir


una matriz de, digamos, 20.000 las con 150.000 elementos. Su inversa tiene ahora del orden de 4 10
7
entradas no nulas con lo que las necesidades de memoria se han multiplicado aproximadamente por 265.
8
Se trata de, a grosso modo, aplicar el metodo de Cholesky pero restringiendo la creacion de nuevas
entradas. El resultado es una matriz L tal que LL

A en alg un sentido, y que por tanto, L


1
AL

I
n
y su condicionamiento es muy reducido.
#2 59
7.4 El gradiente conjugado PROYECTO #2
Ejercicio 18 En este ejercicio se trata de observar el efecto del precondicionamiento en
la convergencia del gradiente conjugado y con ello convencer de la necesidad de utilizarlo
en la resolucion de (muy) grandes sistemas de ecuaciones. Las siguientes instrucciones
9
>> [p,e,t]=initmesh(lshapeg,Hmax,0.05);
>> [a,b]=assempde(lshapeb,p,e,t,1,0,1);
devuelven una matriz sparse simetrica denida en a proveniente de resolver la ecuacion
de Poisson (una ecuacion en derivadas parciales) por el metodo de elementos nitos en un
dominio en forma de L. La matriz tiene aproximadamente 2100 las con 14500 elementos
no nulos
10
.
Con el comando spy se puede ver la forma de a, su tama no y el n umero de entradas
no nulas. Aplica el comando pcg que contiene implementado el gradiente conjugado. Por
ejemplo, con
>>[x,flag, relres,iter,resvec] = pcg(a,b,1e-7,100);
aplicas el metodo con una tolerancia relativa de 10
5
y un n umero maximo de 100 itera-
ciones. En relres se recoge el residuo relativo de la solucion calculada (b Ax/b),
en resvec un historial del residuo en cada paso y en flag una variable que indica que ha
sucedido en la aplicacion del metodo. As flag=1 indica que se ha alcanzado el n umero
maximo de iteraciones sin convergencia, mientras que flag=0 indica convergencia. Para
ver el historial de la convergencia del metodo se puede ejecutar
11
>> semilogy(resvec);
Observa como es necesario o aumentar el n umero de iteraciones maximas o disminuir la
tolerancia para obtener convergencia.
A continuacion vamos a utilizar un precondicionador muy sencillo basado en la des-
composicion de Choleski incompleta. Teclea
>> R=cholinc(a,0);
De nuevo, con las instrucciones habituales puedes ver tanto la forma y el n umero de
entradas no nulas de R.
Modicando las instrucciones anteriores con
>>[x2,flag2, relres2,iter2,resvec2] = pcg(a,b,[],100,R,R);
estas aplicando el metodo del gradiente conjugado precondicionado con R. Disminuyen
las iteraciones? (ver iter2). Y el tiempo de calculo?. Puedes ser ahora mas exigentes
con la tolerancia?.

Ejercicio 19 Con la orden helpwin lee la ayuda de Matlab sobre los comandos pcg,
cholinc, luinc. Que otros metodos iterativos estan implementados?.

9
Su ejecucion puede llevar algo de tiempo...
10
Por cierto, el logo de Matlab es la solucion de un problema de este tipo
11
observa que el eje OY de la graca es logartmico.
#2 60
PROYECTO #2 Cap

tulo 7. Metodos de tipo gradiente


0 50 100 150 200 250
10
8
10
7
10
6
10
5
10
4
10
3
10
2
10
1
10
0
Metodo del gradiente
sin precondicionar
precondicionado
Residuo
Iteraciones
Figura 7.3: Precondicionamiento versus no precondicionamiento
#2 61
7.4 El gradiente conjugado PROYECTO #2
#2 62

Indice de guras
2.1. Matriz sparse 400 400 con 2690 entradas no nulas . . . . . . . . . . . . . 13
4.1. Efecto relleno. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.2. Resultado de reordenar las las y columnas con symrcm y symmmd. . . . . . 26
4.3. eliminacion gaussiana y su representacion como un grafo. . . . . . . . . . . 29
4.4. Una web muy sencilla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
7.1. Residuo en las sucesivas iteraciones del metodo del gradiente . . . . . . . . 53
7.2. Residuo para el metodo del gradiente conjugado . . . . . . . . . . . . . . . 58
7.3. Precondicionamiento versus no precondicionamiento . . . . . . . . . . . . . 61
#2 63

INDICE DE FIGURAS PROYECTO #2


#2 64

Indice general
1. Introduccion 1
I Matlab: programacion avanzada 3
2. Las matrices revisitadas 5
2.1. Acceso a partes estructuras de una matriz . . . . . . . . . . . . . . . . . . 5
2.2. Mas operaciones sobre matrices . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3. Matrices sparse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3. Programacion de funciones 17
II Matrices sparse en Matematicas.
Metodos iterativos para sistemas de ecuaciones lineales 21
4. Matrices sparse en Matematicas 23
4.1. Metodo de Gauss con matrices sparse . . . . . . . . . . . . . . . . . . . . . 23
4.2. Matrices sparse y Google . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5. Metodos iterativos 35
5.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.2. Detalles sobre su implementacion . . . . . . . . . . . . . . . . . . . . . . . 36
6. Metodos iterativos clasicos 37
6.1. Conocimientos previos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
6.2. Denicion y condiciones de convergencia . . . . . . . . . . . . . . . . . . . 38
6.3. Metodos de Jacobi, Gauss-Seidel y Relajacion . . . . . . . . . . . . . . . . 39
6.3.1. Metodo de Jacobi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6.3.2. Metodo de Gauss-Seidel . . . . . . . . . . . . . . . . . . . . . . . . 44
6.3.3. Metodo de Relajacion . . . . . . . . . . . . . . . . . . . . . . . . . 46
7. Metodos de tipo gradiente 49
7.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
7.2. Metodos de descenso. Aspectos generales . . . . . . . . . . . . . . . . . . . 50
7.3. Metodo del gradiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.4. El gradiente conjugado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
#2 65

Vous aimerez peut-être aussi