Вы находитесь на странице: 1из 147

Matlab en cinco lecciones de Numerico

Vctor Domnguez Baguena Ma Luisa Rapun Banzo

Febrero de 2006

Disponible en
http://www.unavarra.es/personal/victor dominguez/
Prefacio
Bo
El origen de este libro es una asignatura de libre eleccion que uno de los autores im-
partio durante los cursos 20042005 y 20052006 en la Universidad Publica de Navarra.
Nuestra intencion original era tratar temas algo avanzados de Calculo Cientfico y utilizar
Matlab como va para su aprendizaje. Los alumnos, obviamente, estaban mas interesados
en aprender Matlab y vean el Numerico como forma de probar y ensayar las diferentes
herramientas de Matlab que se iban exponiendo en clase. Desafortunadamente, la forma-
cion en Numerico de nuestros alumnos nos obligo a relajar considerablemente el contenido
matematico del curso y a ser mas modestos, desde el punto de vista teorico, en nuestros
rra
objetivos. El resultado final en su vertiente matematica se podra enmarcar sin problemas
en un curso introductorio de Calculo Numerico. En cuanto a Matlab, creemos que hemos
tratado todos sus aspectos fundamentales aunque en ocasiones sea de forma superficial.
Nuestro objetivo era conseguir no tanto un conocimiento muy profundo de Matlab como
el de colocar al alumno en una buena posicion de arranque para un autoaprendizaje.
El enfoque y los temas tratados son consecuencia de diversos factores entre los que
conviene citar nuestro propio bagaje matematico1 , el uso que hemos tenido que hacer de
Matlab en nuestra carrera investigadora y, como ya hemos mencionado, los conocimientos
de partida que tenan nuestros propios alumnos. Hemos insistido bastante en la mani-
pulacion de vectores y matrices y a la programacion en forma vectorizada. Esta es una
de las diferencias mas acusadas con los lenguajes de programacion tradicionales y una
implementacion eficiente en Matlab pasa necesariamente por la vectorizacion.
Los apuntes estan organizados en torno a temas o lecciones, cada cual dividido en dos
do
partes, la primera de Matlab y la segunda con un tema especfico de Calculo Numerico.
En la primera parte se presentan los aspectos instrumentales de Matlab que utilizaremos
en la implementacion de los algoritmos de la parte de Numerico. La longitud de cada
parte es variable, y dependiente de la dificultad tratada ya sea en la parte instrumental
(Matlab) o en la parte matematica. De tanto en tanto nos hemos permitido hacer algo de
Matematicas tratando de presentarlas en la forma mas simple posible.
A lo largo de estas paginas el lector podra encontrar ejercicios, algunos de ellos resuel-
tos, que tratan de ahondar en puntos especficos, matematicos e informaticos. Finalmente
se han introducido algunas notas historicas que describen brevemente la evolucion que han
r
tenido las ideas a lo largo del tiempo. Con ello tratamos de combatir la idea gaussiana,
demasiado extendida, de las Matematicas como un mundo estatico, monoltico y perfecto
donde la teora se presenta cerrada y completa. Las Matematicas en general y el Calculo
Cientfico en particular recorren un largo trecho antes de llegar a este estado, durante
el cual brotan ideas constantemente, siempre prometedoras en un primer momento, que
1
modelado por nuestra formacion cientfica, comun en muchos aspectos.

i
evolucionan con los anos, con muchas de ellas desechadas finalmente e incluso algunas
rescatadas anos despues de considerarse como vas muertas.
Hemos adjuntado al final una bibliografa utilizada en este texto. Nos gustara resaltar
tres textos sobre los demas. En primer lugar, Numerical Computing with Matlab, de Cleve
Moler, que descubrimos cuando andabamos en la redaccion de la Leccion II. Su sencillez
y la buena eleccion de ejemplos ha ejercido una influencia considerable en estas notas.
Bo
El segundo libro es ya un clasico entre los que aprendimos Matlab hace algunos anos.
Andabamos entonces en la busqueda de recursos en la web cuando nos encontramos con
unos apuntes muy completos de libre divulgacion. Nos referimos al libro de Garca de
Jalon y sus colaboradores, Aprenda Matlab ?.? como si estuviera en primero. Diferentes
versiones de estos apuntes llevan cubriendo de forma incansable la evolucion de Matlab
desde la version 4.0.
Por ultimo, aunque no es un texto propiamente, la enciclopedia libre on line Wikipedia2
ha sido utilizada profusamente para obtener datos y fuentes utilizadas en la redaccion de
este texto. Debemos senalar que estas informaciones han sido debidamente contrastadas.
A pesar de algunos problemas iniciales, es seguro que la influencia de esta enciclopedia
libre crecera exponencialmente en el futuro.
Finalmente, queremos dejar patente nuestro agradecimiento al Profesor Javier Sayas
rra
que se ofrecio muy generosamente a revisar este libro. Sus numerosas y acertadas indica-
ciones y sugerencias han contribuido, y mucho, en la redaccion final de este texto.
do
Pamplona, Febrero de 2006 Vctor Domnguez Baguena
Ma Luisa Rapun Banzo
r
2
http://www.wikipedia.org

ii
Bo
A Javier
Amigo y maestro.
rra
do
r
Captulo 1
Bo
Introduccion
... and the first lesson of all was the basic trust that he
could learn. It is shocking to find how many people do
not believe they can learn, and how many more believe
learning to be difficult.
rra
Dune
Frank Herbert

1.1. Que es?


Matlab es un entorno de trabajo para el calculo cientfico. Programado originalmente
por Cleve Moler a finales de los anos 70, su finalidad original era proporcionar una forma
sencilla de acceder a las libreras LINPACK y EISPACK donde estan implementadas de una
forma altamente eficiente los algoritmos clave del analisis matricial1 . De hecho, Matlab es
una abreviatura de Matrix Laboratory
Su primera implementacion se hizo en Fortran que era, y en buena medida aun sigue
siendolo, el lenguaje estandar en la implementacion de metodos numericos2 . Posterior-
do
mente se reimplemento en C, que es como se encuentra en la actualidad.
Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo cientfico
y de las ciencias aplicadas en general, dotandole de una gran popularidad en ambientes
cientficos (especialmente en Ingeniera). Dichas extensiones se consiguieron en gran parte
mediante la implementacion de toolboxes, libreras escritas en el lenguaje de programacion
propio de Matlab y que ampliaban el rango de problemas que podan resolverse.
Sin miedo a equivocarse, se pueden enunciar las siguientes areas donde Matlab muestra
un gran potencial:

algebra lineal numerica;


r
procesamiento de senales (analisis, compresion de datos,..);
1
por ejemplo, el metodo de Gauss, el calculo de las descomposiciones mas habituales del algebra
matricial numerica (LU , LL> , QR), metodos iterativos,...
2
Fortran significa Formula translation. Desarrollado por IBM en 1954, es considerado como el primer
lenguaje de alto nivel. Las ultimas actualizaciones (Fortran 95 y Fortran 2003) han dado nuevo vigor a
este veterano lenguaje de programacion.

1
diseno de sistemas de control;

salidas graficas;

estadstica;
Bo
simulacion de sistemas dinamicos.

La extensa gama de problemas que cubre hace de Matlab un lenguaje difcil de entender
y manejar en su completitud. Esto no quiere decir que sea inarbodable: el conocimiento
base que permite empezar a trabajar es muy sencillo. No obstante el elevado numero de
comandos que se encuentra a disposicion del usuario3 provoca que en ocasiones existan
problemas no solo para encontrar los comandos adecuados sino tambien para tener una
idea de que posibilidades exactamente ofrece Matlab en un problema o tarea en particular.

1.2. Como trabaja?


rra
El lenguaje de programacion de Matlab es bastante mas flexible que el de los lenguajes
tradicionales. No es preciso la declaracion inicial de variables, estas se pueden introducir
en el momento que se necesiten, y por ejemplo, vectores y matrices pueden declararse
sin especificar sus dimensiones e incluso cambiar sus tamanos sobre la marcha. Ello per-
mite una programacion algo mas desordenada, aunque debe tenerse bien claro que una
programacion clasica, mas al uso, suele generar codigo mas eficiente.
Por otro lado, una gran cantidad de metodos numericos se encuentran implementa-
dos de una forma muy eficiente y son accesibles como simples comandos. De esta forma,
Matlab se puede utilizar como una caja negra: el usuario pregunta y el ordenador res-
ponde sin que este tenga que preocuparse de que tipo de operaciones se han efectuado
por el camino. De todas formas es conveniente tener una idea de que metodos se estan
utilizando para as ser conscientes de en que condiciones van a funcionar, cual es en cada
do
caso el metodo adecuado, y especialmente el significado de los, posiblemente, numerosos
argumentos opcionales que controlan el funcionamiento del algoritmo.
A priori se pueden distinguir dos tipos de funciones en Matlab: funciones compiladas
(Built in functions) y funciones no compiladas. Las primeras estan optimizadas, son pro-
gramas ya compilados y con el codigo no accesible para el usuario. Como ejemplos se
pueden citar

operaciones fundamentales +, *,. . . .

las funciones matematicas basicas (sin, cos, exp, log,. . . )


r
algoritmos basicos del Algebra Lineal (inv, det, lu, chol, qr,...)

salidas graficas (plot, surf,...)


3
A modo de ejemplo, estos comandos cubren salidas graficas: plot, line, ezplot, ezsurf, surf,
surfc, line, patch, plot3, contour, contourf, ezcontour, pcolor, trimesh, trisurf,...

2
Las funciones no compiladas estan escritas siguiendo el lenguaje de programacion
propio de Matlab. Estos comandos se guardan en ficheros *.m que es la extension estandar
de los ficheros de Matlab4 .
Originalmente, Matlab funcionaba como un interprete. Es decir, cada lnea de codigo
era traducido antes de su ejecucion. Ello haca que una programacion similar a lenguajes
clasicos de programacion diera lugar a codigo poco eficiente.
Bo
Este problema se puede subsanar en gran medida recurriendo a la programacion vec-
torizada. El siguiente ejemplo muestra las diferencias con una programacion estandar

No vectorizada Vectorizada

y=zeros(1,1000); y=sin(linspace(0,2*pi,1000));
h=2*pi/999;
for i=0:999
y(i+1)=sin(h*i);
rra
end

En la primera parte del codigo, encontramos una estructura tpica en los lenguajes de
programacion: el comando for. Su significado es claro: las lneas comprendidas entre el for
y end se repiten 1000 veces con la variable i tomando valores de 0 a 999. El resultado final
es el vector fila y que recoge el valor del seno en 1000 puntos uniformemente espaciados
en [0, 2].
Por otro lado, el comando linspace devuelve un array que contiene 1000 puntos
equidistantes entre 0 y 2. La funcion seno es aplicada sobre todo el array devolviendo
un vector con estos valores que se guarda en y. La diferencia entre ambas formas de
programar es ahora patente. Mientras que en la primera realizamos 1000 llamadas a la
do
funcion seno con un argumento por llamada, en la segunda hay una unica llamada donde
se requiere el calculo del seno en 1000 puntos, y el resultado se devuelve en un vector con
estos valores (y por tanto tambien de longitud 1000).
Desde el punto de vista de Matlab el segundo codigo es mas eficiente. Habitualmente,
la vectorizacion lleva consigo una reduccion del codigo a la vez que se incrementan las
necesidades de memoria.
Con Matlab 6.5 se inicio un proyecto a mas largo plazo consistente en la aceleracion
(Performance Acceleration) de las versiones no vectorizadas dirigida a estrechar las di-
ferencias con los lenguajes clasicos de alto nivel como Fortran, C o Pascal5 . En cualquier
r
caso, la posibilidad de ejecutar instrucciones en bloque sobre vectores o matrices, en con-
traste con operaciones elemento a elemento como en los lenguajes tradicionales, es algo
que conviene explotar por las importantes ventajas que proporciona.

4
Tambien esta la extension *.mat, propia de ficheros de datos.
5
De hecho en la version 6.5 apenas hay diferencias en tiempo de ejecucion entre los dos codigos
expuestos.

3
1.3. Como aprenderemos?
Como ya hemos senalado anteriormente, aprender a manejar Matlab en su totalidad
esta fuera de los contenidos de un curso introductorio como este. No as aprender los
fundamentos y preparar el terreno para un autoaprendizaje de las partes en las que cada
uno este interesado. Encontramos en este punto dos dificultades que salvar: saber de la
Bo
existencia del comando adecuado y aprender a utilizarlo. En no pocas ocasiones, la primera
es la mayor dificultad. No obstante los comandos llevan siempre nombres nemotecnicos
para facilitar su memorizacion. Las funciones de ayuda tambien echan una mano.
Como a programar se aprende programando, comenzaremos escribiendo codigo desde
los primeros pasos. Los esquemas numericos que implementaremos se encuentran practi-
camente en cualquier curso introductorio de Analisis Numerico. En cada leccion imple-
mentaremos dichos algoritmos, introduciendo ordenes, estructuras de decision, datos,...
segun sea necesario.
En los apuntes se incluyen multiples ejercicios cuya realizacion ayudara al aprendizaje
de la asignatura. Estos apuntes no deben tomarse como un manual en el estilo usual, sino
como una forma de aprender Matlab y repasar o aprender el Analisis Numerico basico.
Ya existen manuales extensos y concienzudos, en la bibliografa citamos algunos de ellos,
rra
que pueden servir para ese fin.
do
r
4
Bo
Leccion I

Primeros pasos en Matlab.


rra
Metodos directos para sistemas de ecuaciones
lineales
do
r
5
Introduccion
Bo
When asked whether a programming language supports
matrices, many people will think of two-dimensional
arrays and respond, Yes. Yet matrices are more than
two-dimensional arrays -they are arrays with operations.
It is the operations that cause matrices to feature so
prominently in science and engineering

G.W. Stewart, Matrix Algorithms


rra
Comenzaremos en la primera parte de esta leccion tratando nociones basicas de Matlab,
introduciendo el entorno de trabajo y las estructuras basicas de programacion. En segundo
lugar entraremos en uno de los detalles fuertes de Matlab, la manipulacion de vectores y
matrices.
En la parte matematica estudiaremos metodos directos para la resolucion de siste-
mas de ecuaciones lineales. En la implementacion de estos algoritmos repasaremos los
conocimientos de Matlab expuestos en la primera parte.
do
r
7
Captulo 2
Bo
Matlab: Primeros pasos

2.1. Entorno de trabajo


En las primeras secciones comenzaremos explorando Matlab de la forma mas simple, en
modo comando: el usuario pregunta y Matlab responde. El interfaz de Matlab es bastante
pobre, con un aspecto estetico que en modo alguno es comparable al de programas como
rra
Maple o Mathematica. El modo interactivo de trabajar es sencillo aunque algo incomodo. A
modo de ejemplo, requiere algo de esfuerzo editar instrucciones ejecutadas con anterioridad
y manejarse con bloques de comandos es muy engorroso. Este y otros problemas del modo
interactivo se subsanan en gran medida empaquetando instrucciones con ficheros script
y/o programando en funciones (subrutinas) que es la forma natural de trabajar en Matlab.
En un segundo paso, se puede implementar un interfaz grafica, las guides de Matlab, que
hacen mas amigable la comunicacion con el usuario.
En la Figura 2.1 podemos ver el aspecto inicial de Matlab. Distinguimos las siguientes
ventanas

Command window: ventana donde podemos ejecutar los comandos;


do
Ventanas auxiliares: command history, workspace, current directory que informan
sobre (y permiten editar) los comandos insertados, las variables declaradas y el
directorio en el que estamos trabajando.

Ventana de ayuda: en una ventana independiente proporciona un acceso completo


a las funciones de ayuda de Matlab, incluyendo busquedas, demostraciones, etc.

Estas son las caractersticas basicas que debemos considerar:

El prompt de Matlab es >>. El usuario escribe a continuacion.


r
Para ejecutar se pulsa la tecla Enter.

Se pueden recuperar comandos anteriores navegando con las flechas y .

Cuando se trabaje en Matlab, debemos tener muy en cuenta que:

Se distinguen mayusculas y minusculas.

9
2.1 Entorno de trabajo LECCION I
Bo
rra
Figura 2.1: Pantalla Principal.

Todos los comandos de Matlab se escriben en minusculas y los argumentos se envan


entre parentesis separados por comas.
do
El caracter % se utiliza para insertar comentarios. Todo lo que sigue (en la misma
lnea) es ignorado por Matlab.

Si se teclea al final de una instruccion ; esta se ejecuta pero el resultado no se


visualiza por pantalla.

Dos comandos se pueden insertar en la misma lnea separados por , o por ;. La


diferencia entre los dos es que con , se muestran los resultados de las operaciones
mientras que con ; la operacion se ejecuta pero no se visualiza.
r
Ejercicio 2.1 Ejecuta las instrucciones

>> 4+4 % mi primera operacion


>> 3^4, 4/9
>> 3^4; 4/9
>> 3^4, 4/9;
>> 3^4; 4/9;

10
LECCION I Captulo 2. Matlab: Primeros pasos

y observa la salida.

Haremos algunos comentarios sobre el ejercicio anterior. El circunflejo ^ es la poten-


ciacion:

>> 3^5
Bo
ans=

243

El termino ans es la primera variable que vemos de Matlab. Concretamente, guarda la


ultima salida dada por Matlab (answer):

>> 4+6

ans =

10
rra
>> ans*2

ans =

20

>> ans*2

ans =

40
do
La raz cuadrada se puede calcular bien elevando a 1/2 (^(1/2)) o bien utilizando sqrt.

Ejercicio 2.2 Comprueba la diferencia entre

4/4+6 4/(4+6) 3^5*2 3^(5*2)

Nota. La prioridad de ejecucion entre operaciones matematicas es la habitual: primero


se calcula la potenciacion ^, posteriormente los productos y divisiones *, / y en ultimo
lugar, las sumas y restas + y -. Este orden se puede cambiar utilizando los parentesis.
La regla es sencilla: dada una expresion, lo primero que se calcula es lo que esta dentro
r
de cada parentesis. Esta regla es recursiva, es decir, si dentro de un parentesis hay otros
parentesis, para evaluar el primero se empezara con los parentesis interiores. 
Los numeros reales se pueden insertar tambien en notacion cientfica, muy adecuada si
se trata de numeros grandes o muy pequenos (en valor absoluto). As, se tiene la siguiente
regla de construccion:
m 10r m er

11
2.1 Entorno de trabajo LECCION I

Por ejemplo

0.005 5e 3 115 1012 115e12


1201200000 1.2012e009 0.00031415 3.1415e 004

Existen ademas dos numeros especiales: inf y NaN. El primer signo representa la can-
Bo
tidad infinita (). El segundo es una abreviatura de no es un numero (Not a Number)
y es el resultado que se devuelve ante una operacion indefinida como 0/0. Este smbolo
se puede utilizar en ambitos, en principio tan extranos, como en el dibujo de superficies
(ver la Leccion V).
En general los resultados numericos se presentan con cuatro cifras decimales correctas,
aunque todas las operaciones se ejecutan en doble precision1 . Si se desean las salidas con
toda la precision disponible se debe insertar la instruccion

>> format long

A partir de este punto, el resultado de cualquier operacion se mostrara con 16 cifras


significativas. La instruccion
rra
>> format short

devuelve a la forma estandar con cuatro cifras decimales. Existen mas opciones con format.
Las siguiente lneas muestran algunas de ellas:

>> pi % el numero pi

ans =

3.1416

>> format long % mayor precision


>> pi
do
ans =

3.14159265358979

>> format compact % compacto


>> pi
ans =
3.14159265358979
>> format bank %No fijo de cifras decimales
r
>> pi
ans =
3.14
1
Aproximadamente 16 cifras decimales correctas. En el momento de redactar estas lneas, los proce-
sadores de 32 bits dominan todava el parque de ordenadores. Las nuevas generaciones, con procesadores
con 64 bits, duplican la precision de trabajo.

12
LECCION I Captulo 2. Matlab: Primeros pasos

>> format rat %salidas en forma fraccionaria


>> pi
ans =
355/113
>> format loose % mas espaciada
>> pi
Bo
ans =

355/113
Observa la diferencia de espaciamiento que se obtiene con las opciones compact y loose.

Numeros complejos
La aritmetica compleja se encuentra tambien integrada en Matlab. La unidad imagi-
naria ( 1) se representa en Matlab con i o j:
>> clear i j % borramos posibles valores de i y j
rra
>> i^2

ans=

-1

>> j^2

ans=

-1
do
El signo i suele ser habitual en Matematicas mientras que en diversas ramas de la Fsica
y en Ingeniera de Telecomunicaciones o Electrica se prefiere el smbolo j (en este caso
para no confundir con la intensidad de corriente electrica). De ah que Matlab permita
ambas representaciones.
Todas las operaciones matematicas incluyen la aritmetica compleja en el sentido usual

>> 1+i +5-6i % suma de dos numeros complejos

ans =
r
6.0000 - 5.0000i

>> (5+3i)*(5-3i), (1+2i)/(3-4i)

ans =

13
2.2 Comandos de ayuda LECCION I

34.00

ans =

-0.20
Bo
+
>> conj(3e-3+2e-4i) % conjugado

ans =

0.0030 - 0.0002i

>> abs(3+4i), angle(2i) % modulo y argumento

ans =

5
rra
ans =

1.5708

2.2. Comandos de ayuda


La ayuda de Matlab es ciertamente muy clara y completa. Los comandos siempre
dispuestos a echarnos una mano son:

help: muestra una ayuda por pantalla, en la ventana de comandos, con la informa-
do
cion esencial sobre un comando concreto.

helpwin: similar a help pero despliega la ayuda en una ventana auxiliar, permitien-
do as una navegacion, estilo web, muy comoda.

lookfor: permite buscar una cadena en la primera lnea de todos los ficheros de
ayuda.

Por ejemplo, si deseamos ayuda sobre la funcion sin, podemos ejecutar

>> help sin


r
SIN Sine.
SIN(X) is the sine of the elements of X.

Overloaded methods
help sym/sin.m

14
LECCION I Captulo 2. Matlab: Primeros pasos
Bo
rra
Figura 2.2: Pantalla de ayuda.

o bien
>> helpwin sin
do
y obtener la pantalla que se muestra en la Figura 2.3. Ademas, si aparece el enlace Go to
online doc for ..., este nos permite navegar entre una ayuda mucho mas completa
donde se muestran ejemplos y detalles sobre la implementacion del comando (ver la Figura
2.42 ).

Ejercicio 2.3 Utilizando las funciones de ayuda, obtener informacion de alguna de estas
funciones elementales de Matematicas
sin cos tan asin acos atan
sec csc cot asec acsc acot
r
sinh cosh tanh asinh acosh atanh
exp log log10 log2 sign
Mediante la instruccion
2
Para que esta opcion este disponible es necesario que se haya instalado la ayuda completa de Matlab.
A partir de la version 6.0 la instalacion consta de (al menos) dos CDs, el primero con el programa y las
libreras habituales y el segundo con la documentacion de la ayuda.

15
2.3 Variables LECCION I
Bo
rra
Figura 2.3: Ayuda con helpwin. Comprueba si aparece la opcion Go to online doc...

>> help +

se pueden ademas visualizar las operaciones elementales segun Matlab.


do
2.3. Variables
Matlab no necesita la declaracion de variables como en un lenguaje tradicional. En
principio todas las variables son reales, y basta hacer uso de ellas para que queden decla-
radas:

>> a=1; b=2; c=3;


>> a-b
r
ans =

-1

>> a*b*c

16
LECCION I Captulo 2. Matlab: Primeros pasos
Bo
rra
Figura 2.4: Ayuda on line.

ans =

6
do
El comando who sirve para conocer los nombres de las variables declaradas, mientras
que con whos obtenemos una informacion mas precisa:

>> who

Your variables are:

a b c
r
>> whos a
Name Size Bytes Class

a 1x1 8 double array

Grand total is 1 element using 8 bytes

17
2.3 Variables LECCION I

Para borrar una variable se utiliza la instruccion clear, por ejemplo,


>> a=4;
>> whos a

Name Size Bytes Class


Bo
a 1x1 8 double array

Grand total is 1 element using 8 bytes

>> clear a
>> whos a
>>
borra la variable (es decir, whos no devuelve nada). Con la orden
>> clear all
se borran todas las variables declaradas hasta el momento.
rra
Nota. En Matlab es correcto declaraciones de este tipo
>> sin=1;
>> sin+1

ans=

2
De esta forma sin pasa a ser una variable que sobrescribe el valor original que tena como
funcion seno. Para recuperar el valor original basta ejecutar
>> clear sin
do


Almacenamiento de variables en ficheros


Matlab ofrece la posibilidad de grabar las variables que deseemos en un fichero. De esta
forma, podemos recuperarlas mas adelante, ya sea en la misma sesion o en otra diferente3 .
Por ejemplo
>> a=4+i;% numero complejo
>> b1=cos(2);
>> b2=sin(2);
r
>> save datos a b1 b2
graba dentro del directorio de trabajo, en un fichero de nombre datos.mat, las variables
indicadas. Para recuperar, basta ejecutar
>> load datos
3
Se entiende por sesion el tiempo que transcurre entre que se abre y se cierra Matlab. Al cerrar el
programa, todas las variables locales se pierden.

18
LECCION I Captulo 2. Matlab: Primeros pasos

2.4. Ficheros script y funciones


La forma mas eficiente de empaquetar series de instrucciones simples y mecanicas es
utilizando ficheros script. Tareas mas elaboradas, con, por ejemplo, variables de entrada
y salida, requieren del uso de funciones.
Bo
2.4.1. Ficheros script
Un fichero script es un simple documento de texto que contiene una sucesion de coman-
dos de Matlab. Esencialmente es equivalente a teclear estas instrucciones directamente en
la ventana de comandos.
Describiremos el manejo de este tipo de ficheros mediante un sencillo ejemplo. Comen-
zamos creando un fichero tecleando en modo comando la orden4
>> edit prueba
Se despliega as en una ventana aparte el editor de Matlab con el fichero prueba.m (.mes
la extension estandar de Matlab). Es importante saber cual es el directorio de trabajo5 ,
pues es donde se guardara por defecto el fichero.
rra
Tecleamos ahora en el editor
a=1+i; b=1-i;
disp(a*b=)
disp(a*b)
disp(a/b=)
disp(a/b)
disp(sqrt(a)=)
disp(sqrt(a))
El comando disp (de display) muestra vectores por pantalla de forma compacta. Dado que
para Matlab un cadena de caracteres es simplemente un vector de caracteres, se consigue
con ello mostrar por pantalla mensajes de forma concisa.
Una vez que el documento esta grabado, para ejecutar las ordenes que contiene basta
do
teclear el nombre del fichero en la ventana de comandos:
>> prueba
Se puede modificar las veces que se precise las variables a y b en el fichero script sin tener
que teclear de nuevo todas las instrucciones.

2.4.2. Funciones
En principio existen dos tipos de funciones: las funciones inline, que se insertan en
la lnea de comandos y las que se escriben en un documento de texto externo. Esta ultima
r
forma, que es la evolucion natural de los ficheros script, es mas flexible y es en la que nos
centraremos a continuacion. Dejaremos pendiente para la Leccion III la descripcion de las
funciones inline.
Como antes, para crear un fichero que contenga a una funcion se puede teclear:
4
Tambien es posible crear este fichero a golpe de raton.
5
Por defecto es C:\MATLAB6p5\work.

19
2.4 Ficheros script y funciones LECCION I

>> edit mifuncion

En el editor puedes insertar este simple ejemplo:

01 % MIFUNCION
02 %
Bo
03 % Y=MIFUNCION(X) devuelve
04 %
05 % Y=X^2-COS(X)
06 %
07 function y=mifuncion(x)
08
09 y=x^2-cos(x);
10
11 return

La funcion se declara con function, la variable de entrada es x y se declara como variable


de salida y. Se termina la ejecucion de la funcion cuando se ejecuta un return o bien se
llega al final de la funcion6 .
rra
Ahora, para calcular el valor de 2 cos() podemos ejecutar la orden:

>> mifuncion(pi)

ans =

10.8696

Nota. Los numeros correlativos situados a la izquierda no forman parte del codigo
de la funcion. Han sido insertados con el fin de numerar las lneas y as facilitar los
comentarios que podamos hacer sobre el programa. 
Una funcion puede no tener salidas, por ejemplo,
do
01 % INFORMACION
02 %
03 % INFORMACION devuelve informacion sobre
04 % la precision de la maquina
05 %
06 function informacion
07
08 disp(precision de la maquina)
09 disp(eps)
r
10 disp (mayor numero real)
11 disp(realmax)
12 disp (menor numero real)
13 disp(realmin)
14 return
6
En este sentido, el return del ejemplo anterior es superfluo.

20
LECCION I Captulo 2. Matlab: Primeros pasos

o bien devolver multiples salidas:


01 % MIFUNCION2
02 %
03 % [Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve
04 %
Bo
05 % Y1=X1+X2+X3;
06 % Y2=X1-X2+X3;
07 %
08 function [y1,y2]= mifuncion2(x1,x2,x3)
09
10 y1=x1+x2+x3;
11 y2=x1-x2+x3;
12
13 return
Observa como se recogen los resultados
>> [z1,z2]=mifuncion2(1,2,3);
rra
>> z1

ans=

>> z2

ans=

>> z=mifuncion2(1,2,3); % Ahora solo devuelve el primero


do
ans=

6
La cabecera que hemos introducido en el preambulo de las funciones, es decir las lneas
anteriores a la declaracion de la funcion y precedidas con %, constituyen la ayuda de la
funcion:
>> help mifuncion2
r
MIFUNCION2

[Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve

Y1=X1+X2+X3;
Y2=X1-X2+X3;

21
2.5 Vectores y matrices LECCION I

Aunque muy recomendables7 , su inclusion en una funcion es opcional. La ayuda puede


estar antes o despues de la declaracion de la funcion. En cualquiera de los dos casos,
Matlab despliega como ayuda todas las lneas que esten precedidas con % hasta que se
encuentra con la primera lnea no comentada.
Bo
Nota. Para ser consecuentes, lo correcto es denominar de igual modo a la funcion y
al archivo que la contiene. Sin embargo esto no es obligatorio, es decir, se pueden dar
nombres distintos, pero en este caso Matlab da preferencia al nombre del archivo.
Aunque Matlab distingue entre mayusculas y minusculas en sus comandos, esto no es
extensible para funciones programadas en m-files, al menos en Windows. Es decir, para
ejecutar una funcion en un archivo, digamos, operaciones, se puede utilizar OPERACIONES,
Operaciones y cualquier combinacion con mayusculas y minusculas. Esto es debido a que
el sistema de archivos de Windows tampoco hace esa distincion8 . Versiones mas avanzadas
de Matlab, 7.0 en adelante, muestran sin embargo un aviso si no existe una concordancia
exacta minusculas-mayusculas entre el nombre del fichero y el comando utilizado para
llamarlo.
rra
Todas las variables se envan por valor, no por referencia. Es decir, si una funcion
modifica una variable de entrada, esta modificacion se pierde cuando finalice su ejecucion,
recuperando el valor original.
Por ultimo, en un fichero se pueden incluir varias funciones. En este caso solo la primera
funcion es accesible desde el exterior (lnea de comandos, otras funciones,...) mientras que
el resto de funciones presentes en ese fichero son internas, es decir, utilizables unicamente
por las funciones presentes en el archivo. Esto es importante a la hora de realizar una
programacion modular. Si un conjunto de funciones son solo utilizadas por una funcion
principal, se pueden insertar en el mismo fichero que esta. Evitamos as llenar la carpeta
de trabajo, o de nuestro proyecto, con ficheros y mas ficheros. 

2.5. Vectores y matrices


do
Dado que principalmente trabajaremos solo con arrays de una y dos dimensiones ha-
blaremos en lo que sigue de los objetos matematicos correspondientes: vectores y matrices.
Todo lo que sigue se puede adaptar a arrays con mas dimensiones, aunque por simplificar,
nos centraremos ahora en el manejo de vectores y matrices y dejaremos pendiente para
la Leccion IV el uso de arrays multidimensionales (tensores).

2.5.1. Definicion de matrices y vectores


Un vector o una matriz se puede definir dando sus elementos entre corchetes y sepa-
r
rando filas mediante ;. Por ejemplo, las instrucciones
7
No hay que subestimar nunca la capacidad de olvido de uno mismo: el codigo claro y legible de hoy
es ilegible semanas despues. Las ayudas facilitan la edicion de los programas no solo para un usuario
externo sino para el propio programador.
8
Es decir, si existe un fichero llamado operaciones.m no es posible crear otro con nombre
Operaciones.m

22
LECCION I Captulo 2. Matlab: Primeros pasos

>> a=[1 3 -1; 2 3 4; 4 5 1];


>> a2=[1 2 4; -1 0 1; 2 1 5];
>> b=[1; 3; 1]; b2=[-1 1 -2 2];
definen las matrices y vectores

1 3 1 1 2 4 1
Bo
 
a= 2 3 4 , a2 = 1 0 1 , b = 3 , b2 = 1 1 2 2 .
4 5 1 2 1 5 1
Matlab distingue entre vectores fila y columna por lo que habra que tenerlo en cuenta por
ejemplo cuando se desee hacer operaciones como sumas o productos.
Desde una vertiente practica, si se va a trabajar con una matriz grande, por ejemplo
de tamano 20 10, y sus valores se van a introducir mas adelante, se puede empezar con
>> a=zeros(20,10);
A partir de este instante se pueden insertar los elementos, accediendo a cada posicion
mediante parentesis
>> a(4,5)=9; a(2,1)=6; a(1,1)=-3.4;
rra
>> a(4,5)

ans=

9
En cualquier caso, si tratamos de introducir un valor en una posicion no definida de la
matriz, Matlab ira adaptando el tamano segun juzgue apropiado9 , y no dara ningun
error. El siguiente ejemplo ilustra esta caracterstica
>> clear c % c esta borrado
>> c(1,2)=4 % c es ahora 1 x 2

c =
do
0 4

>> c(3,3)=2 % c pasa a ser 3 x 3

c =

0 4 0
0 0 0
0 0 2
r
Esta habilidad, aunque permite una programacion muy flexible y descuidada, debe utili-
zarse con mesura dado que puede provocar errores de ejecucion muy difciles de detectar.
9
Ello obliga a que haya que redimensionar constantemente la memoria otorgada a la variable a. Esto
supone un costo adicional, inapreciable con ejemplos pequenos, pero importante para grandes cantidades
de memoria. Por tanto es mejor declarar primero las dimensiones de la matriz e informar as a Matlab de
cuanta memoria tiene que reservar.

23
2.5 Vectores y matrices LECCION I

2.5.2. Operaciones
Todas las operaciones habituales entre matrices, tales como la suma, producto, poten-
ciacion, calculo de determinantes, inversas..., estan ya implementadas en Matlab. No hay
por tanto necesidad de programarse estas tareas. Por ejemplo, si a y a2 son matrices de
tamanos compatibles, las instrucciones
Bo
a*a2 a^2 a+a2
devuelven el producto matricial de a y a2, el cuadrado de a (es decir, a*a) y la suma de
a y a2.
Es importante observar la diferencia con estas lneas
a.*a2 a.^2
En el primer caso, se devuelve la matriz resultado de multiplicar elemento a elemento
a y a2 (por tanto deben tener el mismo tamano) y en el segundo, una matriz cuyas
entradas son el cuadrado de las de a. Esto es una constante en Matlab: el signo .
indica que la operacion (un producto, una potencia o una division) se hace elemento a
elemento, mientras que en caso contrario se calcula la operacion matematica, en este
caso el producto matricial.
rra
Ejercicio 2.4 Introduce en a y a2 dos matrices de igual tamano. Observa el resultado de
ejecutar
a+a2 a*a2 a.*a2
Define un vector b fila o columna y ejecuta
b.^3 b
Comprueba si estas operaciones estan bien definidas
a*2 a+1
Que hacen exactamente? Por que crees que no es necesario . en la primera instruccion?.
do
Otros comandos importantes son
det inv / \ /. \.
Los dos primeros son el determinante y la inversa de una matriz cuadrada. Los operadores
/ y \ (slash y backslash) son ciertamente especiales:
a/a2 es equivalente a a*inv(a2), a\a2 es equivalente a inv(a)*a2
En cuanto a su relacion con ./ y \. es la misma que ha surgido antes, esto es, aplicado
sobre matrices procede a realizar los cocientes elemento a elemento. Requiere por tanto
que ambas matrices tengan el mismo tamano.
r
Ejercicio 2.5 Ejecuta las instrucciones
>> 3/5
>> 3\5
y observa el resultado. Tiene sentido desde el punto de vista anterior?.
Ejercicio 2.6 Dado b una matriz, que hace 1/b?.

24
LECCION I Captulo 2. Matlab: Primeros pasos

Nota. El operador backslash \ se utiliza profusamente para resolver sistemas de ecua-


ciones lineales, bajo la idea de que

Ax = b x = A1 b.

As, si b es n 1 y a es n n,
Bo
>> x=a\b;

devuelve en x la solucion del sistema correspondiente.


El funcionamiento real de \ dista mucho de ser tan simple. Esto es, no calcula la
inversa de a para multiplicarla por b, sino que resuelve el sistema de ecuaciones por
alguna variante del metodo de Gauss. Se puede utilizar helpwin mldivide (o helpwin
mrdivide para /) para leer en detalle como procede este comando. 
Las funciones propias de Matlab trabajan de forma natural sobre vectores y matrices.
El resultado final es equivalente a aplicar el comando elemento a elemento. Por ejemplo,

>> a=[0 pi/3; -pi/3 0];


>> cos(a)
rra
ans =

1.0000 0.5000
0.5000 1.0000

es equivalente a

>> [cos(0) cos(pi/3); cos(-pi/3) cos(0)]

ans =

1.0000 0.5000
do
0.5000 1.0000

2.5.3. Detalles adicionales


Como obtener las dimensiones de vectores y matrices
Los comandos de Matlab size y length nos proporcionan esta informacion:

>> a3=[1 2; 3 6; 5 -1];


>> size(a3)
r
ans =

3 2

>> length(a3)

25
2.5 Vectores y matrices LECCION I

ans =

>> a3=a3; % cambiamos la forma de a3


>> size(a3)
Bo
ans =

2 3

>> [m,n]=size(a3); % m son las filas y n las columnas


>> m

ans =

2
rra
>> n

ans =

>> length(a3)

ans =

3
do
El comando size devuelve un vector de tamano 21 con el numero de filas y columnas
del vector/matriz. El resultado es diferente segun se aplique a vectores fila o columna. La
orden length devuelve la longitud de una matriz o vector. Su significado en el caso de un
vector esta clara mientras que para matrices devuelve el maximo entre el numero de filas
y el numero de columnas.

Matrices especiales
Matlab dispone de una serie de comandos que permiten construir matrices con una
estructura particular. Cabe senalar las siguientes ordenes:
r
eye(n) es la matriz identidad de orden n;

ones(m,n) es una matriz m x n de 1s;

zeros(m,n) es una matriz m x n de 0s, esto es, igual que ones pero con ceros;

y algunas mas exoticas como hilb, invhilb, pascal, magic.

26
LECCION I Captulo 2. Matlab: Primeros pasos

Existen dos formas de introducir vectores cuyos valores siguen una distribucion regular

a:b:c construye el vector de valores [a a+b a+2*b .... a+k*b] donde a+k*b es
el mayor numero natural que cumple a+k*b c. La instruccion a:c toma b = 1.

linspace(a,b,n) devuelve una particion uniforme de [a, b] en n puntos.


Bo
Por ejemplo,

>> 0:10

ans=

0 1 2 3 4 5 6 7 8 9 10

>> 10:-1:0

ans=
rra
10 9 8 7 6 5 4 3 2 1 0

>> 0.1:0.3:1.5

ans =

0.1000 0.4000 0.7000 1.0000 1.3000

>> linspace(0,2,4)

ans =
do
0 0.6667 1.3333 2.0000

>> linspace(2,0,4)

ans =

2.0000 1.3333 0.6667 0

Nota. Cuando Matlab tiene que devolver un vector y no se le especifica el formato,


devuelve una fila. 
r
2.5.4. Acceso a partes de matrices
El manejo de partes de vectores y matrices, as como la eliminacion de filas o columnas,
cambios de tamano, etc, se hace va instrucciones muy simples en Matlab. Aunque pueda
resultar algo extrano al principio, un poco de practica es suficiente para que el usuario se

27
2.5 Vectores y matrices LECCION I

adapte a la nueva sintaxis, tan diferentes a la de un lenguaje tradicional, y pueda utilizarlo


en sus codigos.
Comencemos viendo un ejemplo:

>> a=[1 2 3; 4 5 6; 7 8 9; 10 11 12];


>> a(2,3) % elemento (2,3) de a
Bo
ans =

>>a(2,:) % fila 2 de a

ans =

4 5 6

>>a(:,1) % columna 1
rra
ans =

1
4
7
10

>>a(:,2)=0 % columna 2 es ahora 0

a =
do
1 0 3
4 0 6
7 0 9
10 0 12

Podemos acceder a partes de una fila o columna:

>> a(1,2:3) % vector [a(1,2) a(1,3)]

ans =
r
0 3

>> a(2:4,3) % vector columna [a(2,3); a(3,3); a(4,3)]

ans =

28
LECCION I Captulo 2. Matlab: Primeros pasos

6
9
12

>> a(1:2,2:3) % matriz [a(1,2) a(1,3); a(2,2) a(2,3)]


Bo
ans =

0 3
0 6

En general, si p es un vector de numeros enteros, v(p) devuelve [v(p(1)), v(p(2)),


..., v(p(n))]. Por ejemplo,

>> v=[0.1 0.2 0.3 0.4 0.5 0.6];


>> v(4:-1:2)

ans=
rra
0.4000 0.300 0.2000

>> p=[5 1 2 3 3 3]; % no importa que esten repetidos


>> v(p)

ans=

0.5000 0.1000 0.2000 0.3000 0.3000 0.3000

Ejercicio 2.7 Ejecuta las siguientes lneas

>> a=[1 2 3 4; 5 6 7 8; 9 10 11 12];


do
>> p=[1 3 2]; q=[1 2 1];
>> a(p,q)

Que hacen exactamente?.

Igualmente es facil anadir filas y columnas a una matriz:

>> a=[1 2 3 4; 5 6 7 8]

a =
r
1 2 3 4
5 6 7 8

>> a=[a; [1 -1 2 4]] % adosamos una fila nueva

a =

29
2.6 Bucles y estructuras de decision LECCION I

1 2 3 4
5 6 7 8
1 -1 2 4

>> a=[a [0; 2; 4] ] % una nueva columna


Bo
a =

1 2 3 4 0
5 6 7 8 2
1 -1 2 4 4

Si se desea eliminar una fila o columna se puede utilizar el smbolo vaco []. Por
ejemplo,

>> a(:,2)=[] % suprime la segunda columna


rra
a =

1 3 4 0
5 7 8 2
1 2 4 4

Ejercicio 2.8 Programa una funcion cuyas entradas sean una matriz cuadrada y un termino
independiente compatible y que devuelva la matriz ampliada del sistema de ecuaciones lineales.
Esto es, una matriz con la matriz original y una ultima columna con el termino independiente.

2.6. Bucles y estructuras de decision


do
Claves en cualquier lenguaje de programacion, Matlab dispone de varias de ellas entre
las que sobresalen for e if, un estandar en el mundo de la informatica.

2.6.1. Bucles: el comando for


En Matlab, la estructura

for j=inicio:paso:final
.....
r
end

implementa un bucle donde las lneas de codigo entre for y end son ejecutadas repe-
tidamente con j tomando los valores del vector inicio:paso:final (vease la Seccion
2.5.3)
Por ejemplo,

30
LECCION I Captulo 2. Matlab: Primeros pasos

>> for j=1:3; disp(j); end


1

3
Bo
>> for j=6:-2:2; disp(j-2); end
4

En general, si v es un vector,

for j=v
rra
.....
end

procede a ejecutar las lneas internas con j tomando los valores del vector v. Por ejemplo,

>> v=[2 5 3 1];for j=v; disp(j); end


2

3
do
1

Asociados a for, y en general a cualquier bucle, encontramos los comandos break y


continue. El primero fuerza la salida inmediata del bucle mientras que el segundo reini-
cializa la iteracion con el siguiente valor del ndice.

Ejercicio 2.9 La matriz de Hilbert de orden n es

1 1

1
r
2 n
1 1
1
2 3 n+1
A=
.. .. .. .. ..
. . . . .


1 1 1
n 2n2 2n1

Construye la matriz anterior mediante un fichero script y el uso de dos for anidados.

31
2.6 Bucles y estructuras de decision LECCION I

2.6.2. Operadores logicos y estructuras de decision


Los operadores logicos mas basicos en Matlab son
== igualdad, ~= desigualdad, > mayor, < menor,
>= mayor o igual, <= menor o igual, & y logico, | o logico
Bo
El resultado de una comparacion es 1 si es verdadero, 0 si es falso:

>> a=1; b=2; c=3;


>> a>0

ans =

>> a>0 & b<3

ans =
rra
1

>> a<0 | b<1

ans =

>> test= (a~=0)

ans =
do
1

>> whos test

Name Size Bytes Class

test 1x1 1 logical array

Grand total is 1 element using 1 bytes


r
Estos 0 y 1 no son valores numericos sino logicos como se comprueba con la ultima
instruccion10 . Cuando se aplica a un vector, devuelve un vector de verdadero/falso de la
misma longitud que el vector original:

>> b=[1 2 -3 -1 2 -4]; p=(b>=1) % entradas de b>=1


10
Ocupan un unico byte mientras que un numero real utiliza ocho bytes.

32
LECCION I Captulo 2. Matlab: Primeros pasos

p=

1 1 0 0 1 0
En el ejemplo anterior, p(i)==1 si b(i)1 y cero en caso contrario. Ahora, podemos
Bo
aislar los elementos mayores o iguales que 1 simplemente con
>> b(p)

1 2 2
Desde este punto de vista es correcta y recomendable utilizar la instruccion
>> b(b>=1) % elementos de b mayores o iguales que 1

1 2 2
que ademas resulta muy natural (y facil de entender).
rra
Nota. El comando logical puede utilizarse para construir vectores y estructuras logicas
a partir de vectores de numeros enteros:
>> b=[2 4 6 8 10]; p=[1 0 0 1 1];
>> b(p) % Dara error

??? Subscript indices must either be real positive integers or logicals.

>> p=logical(p);
>> b(p)

ans =
do
2 8 10

La estructura de decision, como en muchos otros lenguajes, es if. Su sintaxis es la
siguiente:
if simple: si la operacion logica efectuada es verdadera, se ejecutan las lneas de
codigo comprendidas entre if y end

if (x<-1 | x>1)
r
disp(valor absoluto de x mayor que 1)
end

if compuesto: como el anterior, pero un nuevo conjunto de lneas, comprendidas


entre else y end son ejecutadas en caso de que la operacion logica efectuada en el
if sea falsa:

33
2.6 Bucles y estructuras de decision LECCION I

if (x<0 & x>-10)


f=x^2; % x entre -10 y 0
else
f=sin(x^2); % x menor que -10 o mayor que 0
end
Bo
if de decision multiple:

if (x<0)
f=x.^2;
disp(x menor que cero)
elseif (x<sqrt(pi))
f=sin(x^2);
disp(x en [0,sqrt(pi)))
elseif (x<2*sqrt(pi))
f=(x-sqrt(pi))^2;
disp(x en [sqrt(pi),2*sqrt(pi)))
rra
else
f=pi*cos(x^2);
disp(x en [2*pi,infinito))
end

Esta ultima instruccion es equivalente a anidar diferentes estructuras if, de la si-


guiente forma

if (x<0)
f=x.^2;
disp(x menor que cero)
do
else
if (x<sqrt(pi))
f=sin(x^2);
disp(x en [0,sqrt(pi)))
else
if (x<2*sqrt(pi))
f=(x-sqrt(pi))^2;
disp(x en [sqrt(pi),2*sqrt(pi)))
else
f=pi*cos(x.^2);
r
disp(x en [2*pi,infinito))
end
end
end

Obviamente, la primera forma es mas clara y concisa.

34
LECCION I Captulo 2. Matlab: Primeros pasos

Nota. Con la instruccion switch se puede implementar una estructura de decision que
es esencialmente equivalente a un if anidado.
Esta disponible tambien el bucle while que procede a ejecutar un bucle (que se cierra
tambien con un end) mientras una condicion sea verdadera. Por tanto, es algo mas flexible
que un for.
En general todos los bucles y estructuras que requieran cerrarse, lo hacen con end. El
Bo
uso de break y continue es exactamente el mismo.
Por ultimo, y volviendo a end, este comando tiene una curiosa funcionalidad extra:
sirve para referenciar el ultimo elemento de una fila o columna de una matriz. Por ejemplo
b(4:end) selecciona todos los elementos de b desde la posicion cuarta en adelante. 

Ejercicio 2.10 Que hace el siguiente fragmento de codigo?


01 r=[]; aux=0;
02 while aux<0.8
03 aux=rand(1);
04 r=[r aux];
05 end
rra
06 r(end)=[];

Ejercicio 2.11 Con la ayuda de Matlab, programa un par de ejemplos donde utilices switch
y while.

Ejercicio 2.12 (Un poco de todo) Implementa una funcion de nombre findnonzeros
que dado un vector de entrada devuelva el numero de elementos no nulos y un vector que
contenga dichos elementos.

Solucion. Una implementacion posible es la siguiente


01 % FINDNONZEROS
02 %
do
03 % [N,P]=FINDNONZEROS(X) devuelve
04 %
05 % N el numero de elementos no nulos en el vector X
06 % P un vector con los elementos no nulos de X
07 %
08 function [n,p]=findnonzeros(x)
09
10 p=[]; % p es vacio
11 for i=1:length(x)
12 if (x(i)~=0) % si x(i) no es cero
r
13 p=[p x(i)]; % apuntamos i al vector p
14 end
15 end
16 n=length(p);
17 return
Observa como se recogen los resultados de la funcion, n y p,

35
2.6 Bucles y estructuras de decision LECCION I

>> a=[0.1 0. 0.3 0.1 0.6 0 0.1 0.2 0.4]; % vector!!


>> [n,p]=findnonzeros(a)

n =

7
Bo
p =

Columns 1 through 5

0.1000 0.3000 0.1000 0.6000 0.1000

Columns 6 through 7

0.2000 0.4000

Otra posible implementacion (mucho mas elaborada y mas propia de Matlab) es la si-
rra
guiente

01 % FINDNONZEROS
02 %
03 % [N,P]=FINDNONZEROS(X) devuelve
04 %
05 % N el numero de elementos no nulos en el vector X
06 % P un vector con los elementos no nulos de X
07 %
08 function [n,p]=findnonzeros(x)
09
10 p=x(x~=0);
11 n=length(p);
do
12 return

Haz un esfuerzo en entender bien los comandos anteriores. Tras la suficiente practica,
esta version se ve mas clara y natural que la anterior. Observa como se toman los elementos
no nulos del vector x (lnea 10).

r
36
Captulo 3
Bo
Metodos directos para sistemas de
ecuaciones lineales

3.1. Metodo de Gauss


El metodo de Gauss, tambien conocido como eliminacion gaussiana, es el algoritmo
rra
mas sencillo para la resolucion de sistemas de ecuaciones lineales. Consta de dos partes
bien diferenciadas:

i) Transformacion del sistema lineal en otro equivalente, es decir, con la misma solu-
cion, donde la matriz es triangular superior.

ii) Resolucion del sistema triangular por sustitucion regresiva.

El paso i) se acomete va dos operaciones elementales:

(a) Sumar a una ecuacion otra multiplicada por un numero.

(b) Intercambiar dos ecuaciones.


do
Si solo utilizamos la operacion (a) hablaremos del metodo de Gauss sin pivotaje, y
con pivotaje parcial si tambien realizamos las operaciones (b)1 cuando la eleccion de
las filas que se conmutan sea una muy particular.
Representando el sistema de ecuaciones en la forma matricial, todo lo anterior se
reescribe en terminos de operaciones matriciales (sumar a una fila otra fila e intercambiar
filas2 ). En lo que sigue expresaremos el sistema en la forma

Ax = b, A Rnn , x, b Rn ,

donde A es la matriz de coeficientes, b el termino independiente y x el vector de soluciones.


r
Los elementos de A se denotaran por aij , y con bi los de b.
1
Existe una tercera operacion (c), que consiste simplemente en multiplicar filas por constantes no
nulas. Esta operacion recibe el nombre de reescalado (de filas) y en problemas practicos se suele utilizar
con el fin de mejorar la estabilidad del sistema frente a errores de redondeo.
2
Otra posibilidad es intercambiar columnas, que se corresponde con reordenar las incognitas). En este
caso se habla de pivotaje total.

37
3.1 Metodo de Gauss LECCION I

3.1.1. Metodo de Gauss sin pivotaje


El pseudocodigo se expone a continuacion

Metodo de Gauss
Bo
01 for i = 1 : n 1
02 for k = i + 1 : n
03 `ki = aki /aii
04 for j = i + 1 : n
05 akj = akj `ki aij
06 end
07 bk = bk `ki bi
08 end
09 end
10
11 xn = bn /ann
12 for i = n 1 : 1 : 1
rra
 Xn 
13 x i = bi aij xj /aii
j=i+1
15 end

Las lneas 01--09 se corresponden con la reduccion a la forma triangular de la matriz


y las lneas 11--15 con la resolucion del sistema triangular resultante. El elemento aii se
denomina pivote y debe ser distinto de cero para que el algoritmo funcione, dado que en
caso contrario la operacion en 03 esta mal definida.
El algoritmo efectua O(n3 /3) productos3 y otras tantas sumas para la reduccion a la
forma triangular y O(n2 /2) sumas y productos para la resolucion del sistema triangular.
do
Por tanto el costo se concentra en la primera fase del algoritmo y duplicar la dimension
del sistema exige multiplicar por ocho el tiempo de calculo (y por cuatro el costo en
memoria).

Ejercicio 3.1 Implementa una funcion cuyas entradas sean la matriz de coeficientes y el
termino independiente y devuelva la solucion del sistema por el metodo de Gauss.

Solucion. El siguiente programa es una solucion del ejercicio

01 % GAUSS
r
02 %
03 %
04 % X=GAUSS(A,B) Solucion del sistema Ax=b con el metodo
05 % de Gauss sin pivotaje
3
es decir, el numero de multiplicaciones es n3 /3 + n2 + n + , donde , y son constantes
adecuadas. Con n creciente, el primer termino es el dominante.

38
LECCION I Captulo 3. Metodos directos para sistemas de ecuaciones lineales

06
07 function x = gauss(a,b)
08 n=length(a);
09
10 % transformacion del sistema en uno triangular
11 for i=1:n-1
Bo
12 for k=i+1:n
13 l=a(k,i)/a(i,i);
14 for j=i+1:n
15 a(k,j)=a(k,j)-l*a(i,j);
16 end
17 b(k)=b(k)-l*b(i);
18 end
19 end
20
21 % resolucion del sistema triangular
22 x=zeros(n,1); % tambien vale x=b*0;
23 x(n)=b(n)/a(n,n);
rra
24 for i=n-1:-1:1
25 s=0;
26 for j=i+1:n
27 s=s+a(i,j)*x(j); % sumatorio
28 end
29 x(i)=(b(i)-s)/a(i,i);
30 end
31 return


El codigo anterior es correcto y ciertamente recuerda a la sintaxis que usaramos en una
do
programacion en un lenguaje tradicional como C o Pascal. Sin embargo desde el punto de
vista de Matlab es claramente redundante y muy mejorable. Los siguientes ejercicios
ahondan en estos aspectos por lo que resolverlos es muy recomendable.

Ejercicio 3.2 Reescribe el programa utilizando instrucciones y sintaxis propia de Matlab.

Solucion. Las filas 14-16 del programa (04--06 del algoritmo) se pueden implementar
como una diferencia de dos vectores, a(k,i+1:n) y a(i,i+1:n), con cualquiera de estas
dos instrucciones
r
a(k,i+1:n) =a(k,i+1:n) - l*a(i,i+1:n)
a(k,:) =a(k,:) - m*a(i,:)

La segunda es mas comoda de utilizar pero multiplica por dos el numero de operaciones
en la ejecucion del metodo4 .
4
Por que?.

39
3.1 Metodo de Gauss LECCION I

De forma analoga, el sumatorio de las lneas 25-29 del codigo (13 del algoritmo del
metodo de Gauss) es simplemente el producto escalar, y de hecho tambien matricial, de
dos vectores, el vector fila a(i,i+1:n) y el vector columna x(i+1:n). Esto es el codigo
de las lneas 25--29 se puede sustituir por
x(i)=(b(i)- a(i,i+1:n)*x(i+1:n))/a(i,i);
Bo

Ejercicio 3.3 (Avanzado) Podemos avanzar aun mas hacia la consecucion de algoritmos
matriciales. Consideremos la particion de A
a11 c>
   
1 b1
A= , b=
d1 A11 b1
donde c1 , d1 son vectores (n 1) 1 y A11 una matriz (n 1) (n 1). Entonces, el primer
paso del metodo de Gauss se puede escribir
c>
   
a11 1 b 1
, b=
0 A11 (a11 )1 c> 1 d1 b1 a1
11 b1 d1 .
rra
| {z } | {z }
(1) (1)
A b
El segundo paso del metodo de Gauss se aplica ahora sobre la matriz A(1) (de tamano (n1)
(n 1)) y el vector b(1) (de tamano (n 1) 1) y as se procede sucesivamente. Implementa
esta resolucion alternativa del metodo de Gauss.
(Ayuda. Observa estas tres instrucciones
l=a(i+1:n,i)/a(i,i) a(i+1:n,i+1:n)-l*a(i,i+1:n) b(i+1:n)-l*b(i)
Que hacen?)

Nota sobre la vectorizacion


La nocion de vectorizacion, trabajar con vectores y matrices en lugar de elemento a
do
elemento, no es nueva ni en el Analisis Numerico ni en la computacion a alto nivel. El
objetivo que se persigue es que las todas las operaciones se reduzcan a operaciones ma-
tematicas sencillas, como productos escalares, productos matriciales, busqueda de maxi-
mos y mnimos en un vector/matriz, suma de vectores y matrices... cuya implementacion
se optimiza tomando en consideracion el entorno en el que se trabaja, tanto en software
como en hardware. Este conjunto de instrucciones se conocen como BLAS (basic linear
algebra subprograms). Se distinguen tres niveles. El nivel uno esta formada por opera-
ciones entre vectores, tales como la suma o el producto escalar de dos vectores, de O(n)
operaciones, el nivel dos se ocupa de operaciones matriz-vector con O(n2 ) operaciones y el
nivel tres son operaciones entre matrices, O(n3 ) operaciones. En maquinas con multiples
r
procesadores estos subprogramas deben adaptarse a dividir la tarea entre los procesadores
disponibles de forma optima y a buscar algoritmos que soporten este tipo de trabajo5 .
5
Se deben buscar en primer lugar algoritmos que permitan dividir la tarea principal en subtareas
equiparables, y de forma que finalicen en tiempos similares puesto que basta con que una de las subtareas
se retrase respecto a las demas para que el conjunto de procesadores deba parar a esperar al rezagado
con la consiguiente perdida de tiempo (y dinero).

40
LECCION I Captulo 3. Metodos directos para sistemas de ecuaciones lineales

Uno de los detalles mas sencillos que hay que plantear es la estrategia de almacena-
miento de las matrices en memoria. Se puede optar por un almacenamiento por filas, como
hace C,

 
a11 a12 a13
A= a11 a12 a13 a21 a22 a23
a21 a22 a23
Bo
donde con la notacion anterior queremos decir que aij y aij+1 ocupan posiciones consecu-
tivas en memoria.
Sin embargo Fortran o Matlab proceden por columnas

 
a11 a12 a13
A= a11 a21 a12 a22 a13 a23 .
a21 a22 a23

Segun sea el caso se trata de primar algoritmos que accedan a la matriz por filas o por
columnas para que el procesador trabaje con posiciones consecutivas de memoria6 . En esta
rra
dinamica, la resolucion del sistema triangular segun el algoritmo expuesto en el Ejercicio
3.3 esta mejor adaptado a la arquitectura de Matlab puesto que todas las operaciones se
hacen sobre columnas de la matriz a.

3.1.2. Metodo de Gauss con pivotaje parcial

Para evitar que el metodo de Gauss se colapse, es decir, que encuentre en un paso i
que el elemento aii es nulo (lnea 03 del algoritmo), se introduce la nocion de pivotaje. La
idea es muy sencilla: en el caso de que en el iesimo paso el pivote sea nulo, se procede a
intercambiar la fila i por una fila k tal que aki 6= 0 para cierto k > i. Si esto no es posible,
do
el sistema no es compatible determinado, es decir, o no tiene solucion o tiene infinitas
soluciones.
Desde un punto de vista practico, el metodo de Gauss con pivotaje procede a inter-
cambiar siempre filas de forma que en cada paso

|aki | = max |a`i |,


`=i,...,n

esto es, el pivote es el mayor posible. Ello dota al sistema de una mayor estabilidad frente
a los errores de redondeo. El algoritmo resultante es el siguiente (denotamos por a b el
r
intercambio de valores de a y b).

6
Cuando un procesador moderno lee algo en memoria, suele cargar a su memoria internar, la memoria
cache, posiciones adicionales y consecutivas de memoria bajo la conviccion de que es probable que las
requiera en el siguiente paso.

41
3.1 Metodo de Gauss LECCION I

Metodo de Gauss con pivotaje parcial

01 for i = 1 : n 1
02
03 Encontrar k {i, . . . , n} tal que |aki | = max |a`i |
j=`,...,n
04 for j = i : n
Bo
05 aij akj %intercambio filas y termino independiente
08 end
07 bi bk
08
09 for k = i + 1 : n
10 `ki = aki /aii
11 for j = i + 1 : n
12 akj = akj `ki aij
13 end
14 bk = bk `ki bi
15 end
16 end
rra
Ejercicio 3.4 Implementa una funcion con el metodo de Gauss con pivotaje a partir de la
funcion definida en el Ejercicio 3.2.
Para este fin la instruccion max te puede resultar util. Especficamente,
>> [m,i]=max(v)
devuelve en m el mayor valor del vector v y en i su posicion, esto es, m = v(i). Anade tambien
un control sobre el tamano de a(i, i) de forma que si este es proximo a cero7 se termine la
ejecucion y se devuelva un mensaje de error.
do
(Ayuda. La instruccion [m,r]=max(abs(a(i:n,i))) te devolvera en r la posicion del maximo
en el vector columna abs(a(i:n,i)). Por tanto, la fila en la matriz a con el mayor valor en la
columna i es i+r-1.)

El intercambio de filas de las lneas 04--08 se puede implementar de varias formas.


La primera es simplemente con un bucle que recorra las filas y proceda a intercambiar los
valores elemento a elemento. En la segunda forma se hace de forma global mediante
aux=a(i,i:n); a(i,i:n)=a(k,i:n); a(k,i:n)=aux;
La tercera forma probablemente sera la que resulte mas extrana pero vuelve a ser natural
en Matlab. Basta hacer
r
a([i,k],i:n)=a([k,i],i:n)
Fjate que tiene perfecto sentido sintactico de acuerdo a las reglas de manipulacion de
vectores y matrices expuestas en la primera parte de esta leccion.
7
Cuando se decide que un numero es cero? En la practica depende de los tamanos del resto de
elementos de la matriz.

42
LECCION I Captulo 3. Metodos directos para sistemas de ecuaciones lineales

3.1.3. Metodo de Gauss con pivotaje parcial ficticio


Desde un punto de vista practico no hace falta intercambiar fsicamente las filas de la
matriz. En lugar de ello se puede utilizar un vector de ndices p de forma que p(i) sea la
posicion fsica en memoria de la fila i.
Inicialmente, las filas estan sin reordenar, es decir, se empieza declarando
Bo
p=1:n;

Intercambiar las filas i y k es equivalente a intercambiar los valores de p en las posiciones


iyk

p([i k])=p([k i])

y se procede a hacer ceros en las filas p(i+1),. . . , p(n). El acceso la fila i se consigue con

a(p(i),:)

y la busqueda del maximo valor para el intercambio de filas con


rra
[m,r]=max(abs(a(p(i:n),i)));r=r+i-1;

La fila con el maximo elemento en valor absoluto es la p(r).


Para la resolucion del sistema triangular despejamos igual que en el metodo de Gauss,
desde la n-esima incognita a la primera, con

22 x(p(n))=b(p(n))/a(p(n),n);
23 for i=n-1:-1:1
24 x(p(i))=(b(p(i))-a(p(i),i+1:n)*x(i+1:n))/a(p(i),i);
25 end

Desde un punto de vista estrictamente matematico se trata de llevar la matriz a una


forma que, si bien no es triangular, una reordenacion adecuada de las filas la transforma
do
en triangular. El vector p recoge en que orden se deben despejar las incognitas a la hora
de resolver el sistema reducido. En concreto el orden viene dado por p(n), p(n-1),. . . ,
p(1). En cualquier caso, a(p,:) es una matriz triangular8 .

Ejercicio 3.5 Implementa el metodo de Gauss con pivotaje parcial ficticio.

Ejercicio 3.6 Las lneas 2225 proceden a resolver el sistema triangular accediendo a los
elementos por filas. Adapta el algoritmo para la resolucion de este sistema por columnas, tal
como se hizo en el Ejercicio 3.3.
r
Ejercicio 3.7 Sea A una matriz inversible de tamano n n y A1 su inversa. Si ai es la
columna iesima de A1 , esto es,

A1 = [a1 |a2 | |an ],


8
La importancia de estas tecnicas ha decrecido con las ultimas generaciones de ordenadores, donde la
manipulacion de enormes cantidades de memoria esta muy optimizada.

43
3.2 Descomposiciones matriciales LECCION I

entonces
0
..
.
Aai = ei = 1 i.

.
..
0
Bo
Utilizando alguna de las diferentes versiones del metodo de Gauss, implementa el calculo de la
inversa mediante la resolucion de los n sistemas de ecuaciones. Observa que los n comparten
la misma matriz de coeficientes.

3.2. Descomposiciones matriciales


Uno de los aspectos que mejores resultados dio a lo largo del siglo XX, en los albores del
Analisis Numerica, fue la constatacion de que numerosos algoritmos del Algebra Lineal,
podan reescribirse como factorizaciones de matrices en producto de otras matrices con
caractersticas muy particulares. Este es el caso del algoritmo de Gram-Schmidt, la matriz
rra
original escrita como el producto de una ortogonal por una triangular, o el caso que nos
ocupa, el metodo de Gauss, visto como la busqueda de la factorizacion de A como el
producto de una matriz triangular inferior por una superior.
La utilidad que se concedio a este tipo de factorizaciones fue en un primer momen-
to mas bien teorica pero rapidamente se encontro aplicaciones practicas y su uso en la
actualidad es profuso.
Estudiaremos en lo que sigue la factorizacion LU y variantes y dejaremos para mas
adelante (Leccion IV) otro tipo de factorizaciones.

3.2.1. Descomposicion LU
Supongamos que se dispone de una descomposicion
do
A = LU

donde L y U son matrices triangulares inferior y superior respectivamente. En este caso, la


resolucion del sistema lineal Ax = b es equivalente a resolver dos sistemas de ecuaciones
triangulares
Ly = b, U x = y.
el primero triangular superior y el segundo triangular inferior. Puesto que el costo de
resolucion de cada sistema es O(n2 ) operaciones (total de sumas y productos) obtenemos
una ventaja decisiva en la resolucion del sistema.
r
Ejercicio 3.8 Implementa la resolucion de un sistema de ecuaciones Lx = b donde L es
triangular inferior con 1s en la diagonal.

Si abordamos directamente la resolucion de la ecuacion A = LU , nos encontramos


con un sistema no lineal con n2 + n incognitas (las entradas de L y U ) y n2 ecuaciones
(una por cada elemento de a). Por tanto, el sistema resultante no debera admitir solucion

44
LECCION I Captulo 3. Metodos directos para sistemas de ecuaciones lineales

unica. Si exigimos que L tenga 1s sobre la diagonal, el numero de incognitas pasa a ser
de n2 y por tanto tenemos ya un sistema cuadrado (aunque no lineal). Se trata entonces
de estudiar el siguiente problema: dada una matriz A de tamano n n, encontrar L y U
de la forma

1 u11 u12 u1n
Bo
`21 1 u22 u2n
L = .. , U = .. ,

.. . . . .
. . . . .
`n1 `n2 1 unn

y tales que A = LU.


El calculo de esta descomposicion se puede llevar a cabo sin mas que exigir que el
producto LU sea igual al de A. As empezamos despejando la primera fila de U (que es
igual que la de A por ser `11 = 1). Una vez conocida esa fila, se puede despejar la primera
columna de L, utilizando que el producto de L por la primera columna de U (que consta
de un unico elemento no nulo y ya es conocido del paso anterior) da la primera columna de
A. Procedemos sucesivamente de esta forma, construyendo U por filas y L por columnas.
rra
Descomposicion LU (Metodo de Doolittle)

01 for k = 1 : n
02 for j = k : n
k1
X
03 ukj = akj `kp upj
p=1
04 end
05 `kk = 1
06 for i = k + 1:n
 k1
X 
07 `ik = aik `ip upk /ukk
do
p=1
08 end
09 end

El numero de operaciones del algoritmo resulta ser igual al del metodo de Gauss,
con lo cual no hemos conseguido una ventaja significativa. Sin embargo, disponer de esta
descomposicion es especialmente util si se requiere resolver varios sistemas de ecuaciones
lineales con la misma matriz pero con terminos independientes diferentes. Las operaciones
que conllevan un mayor coste son las correspondientes al calculo de las matrices L y
r
U , pero unicamente hay que realizar esta descomposicion una vez para posteriormente
resolver en cada caso dos sistemas triangulares.

Ejercicio 3.9 Implementar la descomposicion LU en Matlab mediante una funcion cuya


entrada sea una matriz cuadrada y su salida sean las matrices L y U correspondientes.
(Ayuda: la funcion por tanto devuelve dos valores.)

45
3.2 Descomposiciones matriciales LECCION I

Al observar el algoritmo del metodo, las operaciones recuerdan a las efectuadas por el
metodo de Gauss. Esto no es tan sorprendente cuando se analizan con detenimiento los
calculados realizados. Se puede ver entonces que en el calculo de la descomposicion LU se
estan haciendo exactamente las mismas operaciones que al aplicar el metodo de Gauss.
En efecto, definamos
( (1)
Bo
aij = aij i, j = 1, . . . , n
(k+1) (k) (k)
aij = aij `ik akj , k 1, 1 i, j n k
donde `ki viene dada por el algoritmo de Doolitle (lnea 07).
Entonces, de acuerdo con el algoritmo de la factorizacion LU , los elementos de la
primera fila de U y de la primera columna de L vienen dados por
(1)
(1) ai1
u1j = a1j , `i1 = (1)
.
a11
En el siguiente paso, se observa que
(1) (1) (2)
u2j = a2j `21 u1j = a2j `21 a1j = a2j
rra
(1) (1) (2)
ai2 `i1 u12 a `i1 a a
`i2 = = i2 (2) 12 = i2(2)
.
u22 a22 a22
Reiterando el mismo razonamiento concluimos que
(j)
(i) aij
uij = aij , i j, `ij = (j)
, i > j.
ajj
Por tanto U es de hecho la matriz triangular que queda al aplicar el metodo de Gauss
mientras que L esta formada por los elementos que se han utilizado para hacer ceros en
el proceso. Esto es, el elemento i, j de L, denotado por `ij , coincide con la constante `ij
calculado en la lnea 03 del metodo de Gauss y por tanto no hay una contradiccion de
notaciones.
do
En particular, la propiedad anterior propone una forma alternativa de calcular la des-
composicion LU de una matriz es la siguiente modificacion del programa del Ejercicio 3.1:

11 for i=1:n-1}
12 a(i,i+1:n)=0; %hacemos cero la columna i
13 for k=i+1:n}
14 l(k,i)=a(k,i)/a(i,i);
15 a(k,i+1:n)=a(k,i+1:n)-l(k,i)*a(i,i+1:n);
16 end
17 end
r
La matriz U estara entonces almacenada en a.
Ejercicio 3.10 Una forma compacta de devolver la descomposicion LU es insertar L en la
parte triangular inferior de a. De esta forma, tras aplicar el metodo, a tiene en la parte superior
la matriz U , mientras que por debajo de la diagonal encontramos L (exceptuando su diagonal
de 1s). Implementa esta modificacion.

46
LECCION I Captulo 3. Metodos directos para sistemas de ecuaciones lineales

3.2.2. Casos particulares


Metodo de Cholesky
En una gran variedad de problemas practicos aparecen matrices simetricas definidas
positivas. Este tipo de matrices puede descomponerse en la forma
Bo
A = LL>

donde
`11
`21 `22
L= .

.. .. . .
. . .
`n1 `n2 `nn
Gracias a la simetra de la matriz, tanto el numero de operaciones como de posiciones
de memoria requeridos pueden reducirse a la mitad. El algoritmo resultante es conocido
como el metodo de Cholesky.
Metodo de Cholesky
rra
01 for k = 1:n
v
u
u k1
X
02 `kk = takk `2kr
r=1
03 for j = k + 1:n
 k1
X 
04 `jk = ajk `jr `kr /`kk
r=1
05 end
06 end
do
Ejercicio 3.11 Implementa una funcion que tenga como entrada una matriz A y devuelva
la matriz L correspondiente. Debe avisar si la descomposicion no ha podido llevarse a cabo.
Implementa tambien una segunda funcion que tenga como entradas la matriz L triangular
y un termino independiente b y que devuelva la solucion del sistema

(LL> )x = b.

Para ello se requiere la resolucion de los sistemas triangulares


r
Ly = b, L> x = y.

LU con permutacion
El metodo de Gauss con pivotaje parcial es equivalente a la decomposicion

P A = LU

47
3.2 Descomposiciones matriciales LECCION I

donde P es el resultado de permutar las filas (o columnas) de la identidad. Alternativa-


mente, equivale a una descomposicion de la forma

A = LU
b
Bo
b = P 1 L, de forma que L
donde L b es una permutacion de la matriz triangular inferior9 .
La siguiente subrutina devuelve esa descomposicion.

01 % LUPERMUTACION
02 %
03 % [L,U]=LUPERMUTACION(A)
04 %
05 % devuelve U triangular superior, L permutacion
06 % por filas de una matriz triangular inferior con
07 % 1s en la diagonal de forma que A=L*U
rra
08
09 function [l,u]= LUPermutacion(a)
10 n=length(a);
11 p=1:n;
12
13 for i=1:n-1
14 [maximo,r]=max(abs(a(p(i:n),i)));r=r+i-1;
15 p([i r])=p([r i]);
16 for k=i+1:n
17 l(p(k),i)=a(p(k),i)/a(p(i),i);
18 a(p(k),i:n)=a(p(k),i:n)-l(p(k),i)*a(p(i),i:n);
19 end
do
20 end
21 for i=1:n
22 l(p(i),i)=1;
23 end
24 u=a(p,:);
25 return

3.2.3. Comandos correspondientes en Matlab


r
Todas las factorizaciones vistas con anterioridad estan, por supuesto, implementadas
en Matlab. Algunos de los comandos relacionados son

9
Esto es, es el resultado de reordenar las filas de L.

48
LECCION I Captulo 3. Metodos directos para sistemas de ecuaciones lineales

[l,u]=lu(a) devuelve u triangular superior, l permutacion de una triangular inferior


con 1s en la diagonal de forma que a=l*u.

[l,u,p]=lu(a) devuelve u triangular superior, l triangular inferior con 1s en la diagonal


y p matriz de permutacion de forma que p*a=l*u.

r=chol(a) devuelve r triangular superior de forma que a=r*r. Observa que con
Bo
las notaciones introducidas r es precisamente la traspuesta de la matriz
L, expuesta en nuestro algoritmo. El comando asume que la matriz es
simetrica por lo que solo trabaja con la parte superior de la matriz.

Otra descomposicion habitual10 es la denominada QR que devuelve Q ortogonal (es decir,


Q> Q = In ) y R triangular superior de forma que A = QR. El comando encargado de esta
tarea es qr.
Con estas instrucciones la solucion de un sistema utilizando la descomposicion LU se
ejecuta con las siguientes lneas

[l,u]=lu(a); x=u\(l\b);
rra
La colocacion de los parentesis es esencial. Con u\l\b se calcula (u1 l)1 b que obvia-
mente no tiene nada que ver con la solucion del sistema. No hay que preocuparse por el
hecho de que las matrices sean triangulares (o permutacion de una triangular). Matlab, y
en concreto la instruccion \ detecta esto y resolvera el sistema por sustitucion progresiva
(o regresiva), sin intentar realizar la eliminacion gaussiana.

Nota historica11
Ideas similares a la eliminacion gaussiana pueden encontrarse muchos siglos atras, con
referencias que se remontan a las matematicas babilonicas y chinas. Carl Friedreich Gauss
introdujo el metodo que lleva su nombre entorno a 1800 cuando trataba de resolver un
problema de ajuste por mnimos cuadrados relacionado con el calculo de la orbita del
do
asteroide Palas. Parece ser que Joseph Louis Lagrange haba utilizado ideas similares 50
anos antes para dilucidar si una forma cuadratica (hoy diramos matriz) era definida po-
sitiva. El matematico aleman Carl Gustav Jacob Jacobi extendio la idea de la eliminacion
gaussiana a matrices arbitrarias.
Es resenable que la nocion de matriz tal como la conocemos ahora era desconocida
para Gauss y Lagrange. El concepto de matriz, y el algebra asociada (esto es, las opera-
ciones) habran de esperar a los trabajos de James J. Sylvester (que en 1848 introdujo el
termino matriz) y de Arthur Cayley (que siete anos despues definio el producto matricial
identificandolo con el calculo de la composicion de aplicaciones lineales y definio la in-
versa de una matriz). Importantes fueron tambien las contribuciones del fsico Hermann
r
10
Veremos dos algoritmos para obtener esta descomposicion en la Leccion IV. Aunque para la resolucion
de sistemas de ecuaciones lineales la descomposicion QR es mas estable numericamente que la LU, se
suele optar por esta ultima por tener un menor coste computacional (aproximadamente la mitad).
11
Las principales referencias utilizadas para esta nota han sido Very Early Days of Matrix Compu-
tations, Beresford Parlett en SIAM News, 3, no 9; Matrix Algorithms, G.W. Stewart; Computer
solutions of large system of equations, G. Merant y An introduction to Numerical Analysis, E. Suli y
D. Mayers. Estas referencias estan completamente detalladas en la bibliografa.

49
3.2 Descomposiciones matriciales LECCION I

Grassmann (introdujo la primera algebra vectorial no conmutativa, basada en el producto


vectorial de dos vectores; considero tambien el producto de un vector fila por un vector
columna que daba lugar a una matriz de rango uno), Willard Gibbs y Paul A. Dirac.
La equivalencia entre la descomposicion LU y la eliminacion gaussiana parece que fue
probada por primera vez por Paul S. Dwyer en 1944. Curiosamente, la descomposicion
de Cholesky es anterior. Publicado postumamente en 1924 en una revista de Geodesia
Bo
(Andre-Louis Cholesky murio en 1918). El trabajo original trataba sobre la resolucion
de un problema de ajuste por mnimos cuadrados y paso desapercibido hasta que fue
rescatado por John Todd a finales de los anos 1940.
Los primeros analisis sobre la estabilidad numerica de la eliminacion gaussiana, es
decir la viabilidad de su programacion, se remontan a los trabajos de Harold Hotelling,
Alan Turing12 , John von Neumann y Herman Heine Goldstine. Los resultados iniciales
eran descorazonadores. Harold Hotelling probo en torno a 1940 que el error de redondeo
podra crecer como 4n donde n era el orden de la matriz. Este resultado colocaba al metodo
de Gauss como un metodo inviable para la resolucion de grandes sistemas lineales. Turing
llego a resultados similares de manera informal. El analisis de Neumann y Goldstine ya
probaba que el metodo era estable para matrices definidas positivas13 . James H. Wilkinson,
reconocido universalmente como el padre del analisis moderno de estabilidad (frente a los
rra
errores de redondeo), extendio el analisis a matrices generales y mostro que el pivotaje
mejoraba enormemente la estabilidad del metodo. Lo mas curioso es que el analisis inicial
estaba enfocado mas hacia el calculo de la inversa de la matriz que al metodo de Gauss.
Como curiosidad final, Cleve Moler, programador original de Matlab, cita14 a Wilkinson
y Todd entre las personas que tuvieron una gran influencia en su formacion y por ende
en los orgenes de Matlab.
do
12
La vida de Alan Turing es una de las mas tragicas en historia de las matematicas. Dotado de una inte-
ligencia precoz, realizo contribuciones importantes en logica y computacion. Trabajo durante la segunda
guerra mundial en Bletchley Park en el descifrado de los codigos alemanes encriptados con la maquina
r
Enigma mediante la utilizacion del primer ordenador electronico en el mundo (Colossus). El papel que
este trabajo anonimo tuvo en la victoria aliada, los alemanes siempre estuvieron seguros de que su codigo
era indescifrable, solo ha empezado a reconocerse en fechas recientes. La presion y aislamiento a la que
Turing fue sometido por su homosexualidad, llegando incluso a ser detenido por ello, le llevo al suicidio
en 1954 despues de haberse sometido a un tratamiento con bromuro para curarle de su enfermedad.
13
En los primeros anos se sugirio incluso resolucion de un sistema Ax = b mediante las ecuaciones
normales A> Ax = A> b (A> A es simetrica y definida positiva).
14
http://www.mathworks.com/company/newsletters/news notes/clevescorner/dec04.html

50
Bo
Leccion II

Programacion avanzada en Matlab.


rra
Metodos iterativos para sistemas de
ecuaciones lineales
do
r
51
Introduccion
Bo
Homer: Marge? Since Im not talking to Lisa, would you plea-
se ask her to pass me the syrup?
Marge: Dear, please pass your father the syrup, Lisa.
Lisa: Bart, tell Dad I will only pass the syrup if it wont be
used on any meat product.
Bart: You dunkin your sausages in that syrup homeboy?
Homer: Marge, tell Bart I just want to drink a nice glass of
syrup like I do every morning.
Marge: Tell him yourself, youre ignoring Lisa, not Bart.
rra
Homer: Bart, thank your mother for pointing that out.
Marge: Homer, youre not not-talking to me and secondly I
heard what you said.
Homer: Lisa, tell your mother to get off my case.
Bart: Uhhh, dad, Lisas the one youre not talking to.
Homer: Bart, go to your room.

The Simpsons, Episodio 5, temporada 5, Lisa the Vegetarian

En el primer apartado entraremos en aspectos mas avanzados en el tratamiento de


vectores y matrices en Matlab, haciendo hincapie especial en la manipulacion de matrices
sparse. Veremos tambien como se pueden implementar funciones donde el numero de
do
argumentos de entrada y salida son variables.
En la parte matematica, tocaremos la teora basica de metodos iterativos para sistemas
de ecuaciones lineales. Empezaremos con los metodos clasicos: Jacobi, GaussSeidel y
relajacion de Young, para pasar luego a metodos mas modernos y elaborados: el metodo
del Gradiente y especialmente, el metodo del Gradiente Conjugado.
En esta leccion nos permitiremos hacer algo de Matematicas. Animamos a que el lector
no se asuste por ello y a que trate de entender los enunciados y las demostraciones que se
ofrecen. Para ello se asumen unos conocimientos mnimos en Algebra Lineal.
r
53
Captulo 4
Bo
Matlab: programacion avanzada

4.1. Retorno a las matrices


A estas alturas el lector ya debera estar convencido sobre las capacidades de Matlab
en lo que se refiere al manejo de enormes cantidades de memoria. En esta seccion expon-
dremos algunos comandos adicionales y entraremos con cierto detalle en la manipulacion
rra
de matrices sparse1 .

4.1.1. Acceso a partes estructuradas de una matriz


En ocasiones es importante tomar partes precisas de una matriz que no son necesaria-
mente partes de filas, columnas o simplemente submatrices (estas acciones ya se trataron
en la primera leccion). Para este fin nos pueden servir las siguientes instrucciones

diag triu tril

La primera toma la diagonal de una matriz mientras que la segunda y tercera toman la par-
te triangular superior (upper) e inferior (lower) respectivamente. Ademas estos comandos
do
son algo mas flexibles de lo que pueda parecer a simple vista como veremos a continuacion.
Empecemos introduciendo una matriz

>> a=[11 12 13; 21 22 23; 31 32 33];

El resultado de los siguientes comandos es, a la luz de lo anterior, esperable

>> diag(a)

ans =
r
11
22
33

1
Aceptaremos este anglicismo en lo que sigue. En ocasiones este vocablo se traduce por matrices huecas
o matrices dispersas.

55
4.1 Retorno a las matrices LECCION II

>> triu(a)

ans =

11 12 13
0 22 23
Bo
0 0 33

>> tril(a)

ans =

11 0 0
21 22 0
31 32 33
El usuario puede especificar que diagonal se escoge, o a partir de que diagonal se toma
la matriz triangular. La diagonal principal es la cero y las subdiagonales inferiores (respec-
tivamente superiores) estan numeradas consecutivamente con numeros enteros negativos
rra
(respectivamente positivos). El siguiente ejemplo ilustra estas caractersticas.
>> diag(a,-1)

ans =

21
32

>> tril(a,-1)

ans =
do
0 0 0
21 0 0
31 32 0

>> triu(a,0)

ans =

11 12 13
r
0 22 23
0 0 33
Ejercicio 4.1 Programa 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 una matriz triangular inferior con todas las entradas de
debajo de la diagonal principal.

56
LECCION II Captulo 4. Matlab: programacion avanzada

Ejercicio 4.2 Que sucede si aplicamos los comandos anteriores a matrices rectangulares?.

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 =
Bo
1 0
0 2

>> diag([1 2],1)

ans =

0 1 0
0 0 2
0 0 0
rra
Ejercicio 4.3 Como utilizaras el comando diag para generar una matriz con la diagonal
de una dada?.

Nota. El comando blkdiag permite construir matrices diagonales por bloques:


>> blkdiag(1,[1 2; 3 4], 5)

ans=

1 0 0 0
0 1 2 0
0 3 4 0
do
0 0 0 5


Trasposicion de matrices
Dada una matriz A, la matriz traspuesta A> es la matriz resultante de intercambiar
las filas con las columnas de A. Esto es, las filas de A pasan a ser las columnas de A> .
Esta operacion se denota en Matlab con :
>> a=[1 2 3; 0 2 4];
>> a
r
ans =

1 0
2 2
3 4

57
4.1 Retorno a las matrices LECCION II

Obviamente, tambien se aplica sobre vectores:


>> b=[1;2;3]; % vector COLUMNA con tres elementos
>> b % vemos ahora un vector FILA

ans =
Bo
1 2 3
De nuevo nos encontramos con esta propiedad sobre la que ya hemos incidido: Matlab
distingue entre vectores filas 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 numeros complejos. Ademas de
trasponer, , conjuga todas las entradas. Es decir, cambia el signo a la parte imaginaria
de cada elemento. Matematicamente hablando, este es el operador de trasposicion o con-
jugacion, denotado habitualmente en matematicas con A . Por contra, . se limita a
rra
intercambiar filas por columnas en la matriz:
>> clear i % i es ahora la unidad imaginaria
>> a=[i 1-2i; 1 0.3+4i];
>> a.

ans =

0 + 1.0000i 1.0000
1.0000 - 2.0000i 0.3000 + 4.0000i

>> a
do
ans =

0 - 1.0000i 1.0000
1.0000 + 2.0000i 0.3000 - 4.0000i

Dada una matriz a, si ejecutamos a(:), obtenemos el vector columna que se cons-
truye concatenando las columnas de a. Tecnicamente hablando, nos esta mostrando la
matriz tal como se guarda en memoria. Por ejemplo,
r
>> a=[1 2 3; 0 2 4];
>> a(:)

ans =

58
LECCION II Captulo 4. Matlab: programacion avanzada

0
2
2
3
4
Bo
>> a=a; %trasponemos a
>> a(:)

ans =

1
2
3
0
2
4
rra
Esto puede utilizarse para hacer un par de trucos:

En ocasiones la entrada de una funcion es un vector, sin importar si este es fila o


columna.
La instruccion

>> b=b(:);

hara de b un vector columna, sea cual sea su formato inicial. Si lo que se desea es
un vector fila, basta con trasponer
do
>> b=b(:); % b=b(:). mejor por si b es complejo

Se puede utilizar para introducir las entradas de una matriz por columnas. A modo
de ejemplo,

>> a=zeros(4,3);
>> a(:)=[1 2 3 4 5 6 7 8 9 10 11 12]

a =
r
1 5 9
2 6 10
3 7 11
4 8 12

>> a2=zeros(2,6);

59
4.1 Retorno a las matrices LECCION II

>> a2(:)=a(:)

a2=

1 3 5 7 9 11
Bo
2 4 6 8 10 12

Nota. El comando reshape permite modificar las dimensiones de una matriz (o array
en general). Es mas flexible que el comando :. 

4.1.2. Mas operaciones sobre matrices


Hasta ahora las operaciones matriciales que han centrado nuestra atencion son las fun-
damentales: suma y producto. En Matlab estan tambien implementadas otras operaciones
comunes en el Algebra Lineal. Entre todas ellas destacamos
rra
dot: Calcula el producto escalar de dos vectores:

>> dot([1 2 3],[4 5 6])

ans =

32

Devuelve el produto 1 4 + 2 5 + 3 6 = 32. Este comando no distingue entre vectores


filas y columnas, y es aplicable siempre que tengan la misma longitud.
La funcion se puede aplicar a matrices bien por columnas, esta es la forma estandar2 ,
o por filas.
do
>> 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


r
ans =

6
15

2
Recuerda la predileccion de Matlab por las columnas.

60
LECCION II Captulo 4. Matlab: programacion avanzada

sum: calcula la suma de las entradas un vector. Es aplicable tambien a matrices, en el


sentido del comando anterior

>> v=[1 2 3]; a=[1 2 3; 4 5 6];


>> sum(v)
Bo
ans =

>> sum(a) % suma por columnas

ans =

5 7 9

>> sum(a,2) % suma por filas


rra
ans =

6
15

prod: Como sum pero con el producto.

max: Calcula el maximo en un vector. Puede devolver su posicion en el vector. Aplicado


sobre matrices funciona de la misma forma que dot o sum. Esto es, devuelve el
maximo de cada columna por defecto, o de cada fila si as se le indica

>> v=[-2 -5 -3]; a=[2 3 8; -4 2 9];


do
>> max(v)

ans=

-2

>> [p,m]=max(abs(v)); [p,m]

ans =
r
5 2

>> max(a)

ans =

61
4.1 Retorno a las matrices LECCION II

2 3 9

>> max(a,[],2) % busqueda por filas

ans =
Bo
8
9
>> [m,p]=max(a,[],2); p % posicion del maximo

ans=

1
1

La razon por la que se utiliza [] en la lnea anterior es que esta instruccion tambien
se puede utilizar para comparar dos arrays del mismo tamano
rra
>> a1=[3 1 2; 5 3 2]; a2=[4 2 1; 1 2 3];
>> max(a1,a2)

ans =

4 2 2
5 3 3

Al insertar el vaco indicamos a Matlab que no existe un segundo vector y que debe
proceder a buscar el maximo de a en su segunda dimension, esto es, el maximo por
filas.
do
min: Calcula el mnimo procediendo exactamente igual que max.

norm: norma de una matriz o vector. Se puede escoger entre varias normas.

>> 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


r
>> [norm(a) norm(a,1) norm(a,inf)] % normas matriciales

ans =

5.4650 6.0000 7.0000

62
LECCION II Captulo 4. Matlab: programacion avanzada

En la Seccion 5.2.3 comentaremos brevemente la definicion de estas normas.


rank: rango numerico de una matriz. Esto es, el numero maximo de filas o columnas
linealmente independientes3 .
cond: Calcula norm(a)*norm(inv(a)), el condicionamiento de una matriz4 . El condiciona-
miento da una medida de la sensibilidad del sistema a perturbaciones en el termino
Bo
independiente.
rcond: estimador del inverso del condicionamiento de una matriz. Es sensiblemente mas
economico de calcular que cond.

Nota. Cuando el comando dot se aplica a dos vectores complejos, procede siempre a
conjugar el primer vector. Es decir, matematicamente
n
X
dot(u, v) ui v i .
i=1

As,
rra
>> u=[1+i 2+2i]; v=[2 1];
>> dot(u,v)

ans =

4.0000 - 4.0000i

>> dot(v,u)

ans =

4.0000 + 4.0000i
do

Ejercicio 4.4 Como sumaras los elementos de una matriz?. Como encontraras el mnimo
y el maximo?. Y su posicion?

4.1.3. Matrices sparse


Las matrices sparse son una importante clase de matrices que surge en diferentes
ambitos del Analisis Numerico y de las Matematicas y ciencias en general (elementos
finitos, teora de grafos,...).
En la Figura 4.1 se puede ver un ejemplo de una matriz sparse simetrica donde los
r
puntos indican las entradas diferentes de cero. Desde una optica puramente computacional
hace falta desarrollar sistemas de almacenamiento especiales dado que la inmensa mayora
de las entradas no deben ser almacenadas porque son nulas.
3
Una matriz tiene, en general, rango maximo por los errores de precision de la maquina. Este comando
hace una estimacion del rango, eliminando este factor.
4
En realidad no construye la inversa de la matriz por ser costoso.

63
4.1 Retorno a las matrices LECCION II
Bo
Figura 4.1: Diagrama de un matriz sparse 400 400 con 2690 elementos no nulos.
rra
Matlab provee de forma muy sencilla ese almacenamiento. Con
>>a=sparse(100,100); b=sparse(100,1);
declaramos a como una matriz sparse 100100 y un vector columna b de 100 elemen-
tos. Todas las entradas son inicialmente ceros, pero se guarda la estructura basica para
introducir los elementos no nulos
>> a=sparse(100,100)

a =
do
All zero sparse: 100-by-100

>> a(4,4)=1; a(8,9)=-4; a(80,45)=-1; a(99,100)=4;


>> a

a =

(4,4) 1
(8,9) -4
(80,45) -1
r
(99,100) 4
Para transformar una matriz llena (convencional) en una matriz sparse podemos utilizar
tambien este comando
>> a=diag([1 2 3 4 5]);
>> a=sparse(a)

64
LECCION II Captulo 4. Matlab: programacion avanzada

a =

(1,1) 1
(2,2) 2
(3,3) 3
Bo
(4,4) 4
(5,5) 5
Con full realizamos la operacion inversa: transforma una matriz sparse en una matriz
llena,
>> a=full(a)

a =

1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
rra
0 0 0 4 0
0 0 0 0 5
La instruccion spalloc tiene un funcionamiento muy similar a sparse. Es util si se sabe
el numero de elementos no nulos que tendra dicha matriz. Concretamente
>> a=spalloc(8,7,12)
declara una matriz 8 7 con a lo sumo 12 elementos no nulos. Al informar de cuantos
elementos no nulos se esperan Matlab hace una gestion mas eficiente de la memoria.
El comando nnz (Non zeros) nos informa del numero de elementos no nulos de una
matriz, mientras que su esquema (pattern), como el que aparece en la Figura 4.1, se obtiene
con spy:
do
>> a=sparse(10,10);
>> a(1,4)=1; a(2,8)=-4; a(3,9)=1; a(7,8)=5;
>> nnz(a)

ans=

>> spy(a)
r
La grafica se despliega en una ventana separada.
Todas las operaciones que hemos visto estan adaptadas al nuevo entorno. As, los
operadores
: triu tril diag
devuelven vectores/matrices sparse. Las operaciones

65
4.2 Argumentos de funciones LECCION II

* + .* dot

estan asimismo optimizadas. El problema de generar codigo eficiente 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
Bo
cero. Afortunadamente, Matlab hace ese trabajo por nosotros.
Por otro lado, aparecen una nueva serie de comandos, que devuelven matrices sparse,
entre los que merece la pena destacar
spdiags maneja las diagonales de una matriz de forma analoga a diag;

speye devuelve una matriz diagonal con unos, o similar (analoga a eye);

spones matriz de 1s, similar a ones;

sprand, sprandn construyen una matriz sparse con entradas aleatorias (similar a
rand);

Ejercicio 4.5 Con la ayuda de Matlab averigua la sintaxis concreta de los comandos ante-
rra
riores y comprueba con algun ejemplo como funcionan.

4.2. Argumentos de funciones


Veremos a continuacion como se pueden programar funciones en las que tanto el nume-
ro de argumentos de entrada como de salida sean variables. Esta caracterstica dota de
una mayor flexibilidad a la programacion en Matlab.
Los comandos esenciales que precisamos son

varargin nargin varargout nargout

La instrucciones nargin y nargout informan respectivamente sobre el numero de variables


do
de entrada y el numero de variables de salida (number of input arguments y number of
output arguments).
Una funcion puede aceptar una serie de argumentos fijos, al estilo de las funciones que
programamos en la leccion anterior, y un conjunto de argumentos opcionales, que pueden
ser o no especificados por el usuario. Para su acceso se utilizan respectivamente varargin
(variable input argument) y varargout (variable output argument) mediante llaves ({})5 .
Mostramos a continuacion un ejemplo de utilizacion conjunta de estas nuevas instruc-
ciones. En la cabecera se informa de que hace la funcion, dependiendo de los argumentos
de entrada y salida.
r
01 % DESCOMPOSICIONLU
02 %
03 % [L,U] = DESCOMPOSICIONLU(A)
04 % Devuelve U triang superior, L permutacion de una
5
Las variables varargin y varargout son de un tipo especial denominado cell array. En la Leccion
IV estudiaremos su funcionamiento con mas detalle.

66
LECCION II Captulo 4. Matlab: programacion avanzada

05 % triang inferior con 1s en la diagonal tal que A=LU


06 %
07 % [L,U,X] = DESCOMPOSICIONLU(A,B)
08 % Devuelve U triang superior, L permutacion de una
09 % triang. inferior con 1s en la diagonal tal
10 % que A=LU y la solucion del sistema AX=B
Bo
11
12 function varargout=DescomposicionLU(a,varargin)
13
14 [l,u]=lu(a); % descomposicion LU
15
16 if nargin==1 & nargout==2
17 varargout{1}=l;
18 varargout{2}=u;
19 elseif nargin==2 & nargout==3
20 b=varargin{1}; % leemos el primer argumento opcional...
21 varargout{1}=l; varargout{2}=u;
22 varargout{3}=u\(l\b); % solucion del sistema
rra
23 end

Como puede comprobarse, la funcion precisa de un argumento obligatorio, la matriz


a, uno opcional, el termino independiente, y devuelve dos o tres argumentos segun se
requiera. Observa los resultados que se han obtenido para varios ejemplos:
>> a=[1 3; 2 4];
>> [l,u]=DescomposicionLU(a)

l =

0.5000 1.0000
1.0000 0
do
u =

2 4
0 1

>> [l,u,x]=DescomposicionLU(a,[1 2].)

l =
r
0.5000 1.0000
1.0000 0

u =

2 4

67
4.2 Argumentos de funciones LECCION II

0 1

x =

1
0
Bo
>> [l,u]=DescomposicionLU(a,[1 2]) %falta un arg. de salida

??? Error using ==> DescomposicionLU


Too many output arguments.

>> [l,u,x]=DescomposicionLU(a) %faltan arg. de entrada


??? Error using ==> DescomposicionLU
Too many output arguments.

Ejercicio 4.6 A partir de la funcion anterior implementa una funcion que opere segun la
siguiente cabecera
rra
% DESCOMPOSICIONLU2
%
% R = DESCOMPOSICIONLU2(A)
% Si A es simetrica definida positiva devuelve
% R triang superior tal que A=RR
% [R,X] = DESCOMPOSICIONLU2(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] = DESCOMPOSICIONLU2(A)
% Devuelve U triang superior, L permutacion de
do
% una triang. inferior con 1s en la diagonal
% tal que A=LU
% [L,U,X]= DESCOMPOSICIONLU2(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 comprobar si efectivamente la matriz es simetrica?
Y para ver que es definida positiva?.
r
68
Captulo 5
Bo
Matrices sparse en Matematicas.
Metodos iterativos para sistemas de
ecuaciones lineales

5.1. Metodo de Gauss para matrices sparse


rra
Esta seccion se centra en el estudio del metodo de Gauss para matrices sparse. Mostra-
remos los problemas que presenta la aplicacion de este algoritmo a este tipo de matrices,
especialmente el efecto relleno y algunas estrategias de reordenamiento que mitigan estos
efectos adversos. Sirve asimismo para ahondar en la problematica de los metodos directos
y allanar y fundamentar los metodos iterativos que se tratan en las siguientes secciones.
Recordemos que en Matlab la resolucion de sistemas de ecuaciones utilizando

>> x=a\b;

se basa en el metodo de Gauss (o alguna de sus variantes). Puede plantearse la cuestion de


si es adecuado utilizar \ para matrices con formas especiales como por ejemplo matrices
do
triangulares o permutaciones de estas, para las que la eliminacion gaussiana no es nece-
saria puesto que las variables se pueden despejar de forma progresiva. Afortunadamente
Matlab detecta estas estructuras basicas y resuelve de una manera optima el sistema. Si
se consulta la ayuda para este comando se puede leer que se reconoce si una matriz es,
por ejemplo, sparse o llena, simetrica o no simetrica, triangular o permutacion de esta,
bandeada (los elementos concentrados en torno a la diagonal), de Hessenberg1 (con todos
los elementos por debajo de la subdiagonal principal nulos), etc., y aplica el metodo di-
recto mas conveniente en cada caso. Testar si una matriz pertenece a uno de estos tipos
se puede realizar en un numero de operaciones despreciable respecto a las del metodo de
Gauss.
r
Hemos visto al final de la Leccion I 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
Ver Leccion IV

69
5.1 Metodo de Gauss para matrices sparse LECCION II

Si se dispone de esta descomposicion, la resolucion del sistema de ecuaciones se reduce a


la resolucion de dos sistemas triangulares,

Ax = b, Ly = b, U x = y,

o en codigo de Matlab2
Bo
[l,u]=lu(a); x=u\(l\b);
Una caracterstica muy habitual del metodo de Gauss para matrices sparse es el efecto
relleno (en ingles fill in), esto es, la insercion de nuevos elementos en el proceso. 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
rra
y la matriz es ahora llena. Sin llegar a esos extremos, es habitual que las necesidades
de memoria se multipliquen al aplicar la eliminacion gaussiana. En la descomposicion
LU esto se refleja en un incremento en el numero de entradas no nulas de la matriz con
los problemas que ello lleva consigo (mayores requerimientos de memoria, mayor costo
computacional,...).
Vamos a ver como podemos reducir este molesto comportamiento con un reordena-
miento adecuado de filas (ecuaciones) y columnas (incognitas). Dado que en aplicaciones
practicas las matrices simetricas son muy comunes3 nos restringiremos en lo que sigue a
esta familia de matrices. Con el fin de preservar la simetra, cualquier intercambio de filas
debe ser seguido por el intercambio de columnas correspondientes:

x 0 0 x x x x 0 0 x
0 x x 0 0 x x 0 0 0
do
0 x x 0 x 1 3

0 0 x x x

x 0 0 x 0 0 0 x x 0
x 0 x 0 x x 0 x 0 x
En los comandos
symrcm symmmd
estan implementados dos algoritmos de reordenacion muy populares: el algoritmo de
Cuthill-McKee inverso y el algoritmo de mnimo grado. El primero reordena de forma
que los terminos no nulos de la matriz tienden a estar concentrados cerca de la diagonal.
r
El algoritmo de mnimo grado por su parte tiende a mover los elementos no nulos hacia el
final de la matriz de forma que la estructura inicial de la matriz es esencialmente diagonal
y el efecto relleno surge cuando el metodo de Gauss esta ya muy avanzado.
2
Recuerda la colocacion de los parantesis.
3
O al menos matrices con estructura simetrica, esto es, a(i, j) 6= 0 a(j, i) 6= 0. Todo lo que sigue es
igualmente valido para este tipo de matrices.

70
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos
Bo
rra
do
Figura 5.1: Resultado de reordenar las filas y columnas con symrcm y symmmd.

Este tipo de tecnicas tuvieron su origen en la resolucion de ecuaciones en derivadas


parciales mediante metodos numericos. Un buen ejemplo lo encontramos en la Figura 5.1
obtenido al aplicar estas dos reordenaciones a una matriz proveniente de la resolucion de la
ecuacion de Laplace por elementos finitos. Observa como se reduce el numero de entradas
en las matrices L y U cuando se aplica alguno de los algoritmos anteriores (referido en la
figura como nz).
La descomposicion LU debe calcularse sin pivotaje puesto que en otro caso el reor-
denamiento que introduce el metodo de Gauss con pivotaje arruina el orden introducido
r
con los algoritmos de reordenamiento anteriores. Para ello se debe utilizar el comando
>> [l,u]=lu(a,0);
El segundo argumento, que solo esta disponible si la matriz a es sparse, fija 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

71
5.1 Metodo de Gauss para matrices sparse LECCION II

el pivote y el resto de elementos de la columna sea muy acusado. Surge seguidamente la


cuestion de estabilidad del metodo sin pivotaje. Afortunadamente para matrices definidas
positivas o diagonal dominantes, el metodo de Gauss sin pivotaje es estable numerica-
mente. La solucion del (o de los) sistemas se lleva a cabo con
Solucion con reordenamiento...
Bo
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

En la lnea 01, el vector p recoge una permutacion de 1:n (n es el numero de filas y


columnas de a) que reduce el efecto relleno de L y U . La matriz a(p,p) es el resultado
de reordenar ecuaciones e incognitas. La lnea 04 reordena las incognitas para recupe-
rarlas en su orden original. Observa que la lnea 03 podra sustituirse simplemente por
rra
x=u\(l\b(p));

Nota. A partir de la version 7.0, el comando symmmd que contiene el algoritmo de mnimo
grado se ha declarado obsoleto y sera eliminado en futuras versiones. Se recomienda
utilizar symamd. 

Comentarios finales
Si la matriz es ademas simetrica definida positiva podemos utilizar la descomposicion
de Cholesky,
A = LL>
donde L es triangular inferior con elementos sobre la diagonal estrictamente positi-
vos. El sistema se reduce ahora a dos sistemas triangulares
do
Ly = b, L> x = 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, L = R> ). As, el algoritmo anterior, con
reordenacion adecuada, queda ahora
Solucion con reordenamiento...
r
01 p=symmmd(a); % permutacion. vale tb p=symrcm(a);
02 r=chol(a(p,p)); % r es ahora "mas sparse"
03 x=r\b(p); x=r\x; % resolvemos los dos sist. triang.
04 x(p)=x; % reordenamos las incognitas

72
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

2 4 2 4 2 4 2 4 2 4

1 1 1 1 1

3 5 3 5 3 5 3 5 5
3
x x 0 x 0 x x 0 x 0 x x 0 x 0 x x 0 x 0 x x 0 x 0
Bo
x x x 0 x 0 x x x x 0 x x x x 0 x x x x 0 x x x x
0 x x 0 0 0 x x 0 0 0 0 x x x 0 0 x x x 0 0 x x x
x 0 0 x 0 0 x 0 x 0 0 0 x x x 0 0 0 x x 0 0 0 x x
0 x 0 0 x 0 x 0 0 x 0 0 x x x 0 0 0 x x 0 0 0 0 x

5 3 5 3 5 3 5 3 5 3

2 2 2 2 2
1 4 1 4 1 4 1 1
4 4

x 0 0 0 x x 0 0 0 x x 0 0 0 x x 0 0 0 x x 0 0 0 x
0 x x 0 x 0 x x 0 x 0 x x 0 x 0 x x 0 x 0 x x 0 x
0 x x 0 0 0 x x 0 0 0 0 x 0 x 0 0 x 0 x 0 0 x 0 x
0 0 0 x x 0 0 0 x x 0 0 0 x x 0 0 0 x x 0 0 0 x x
x x 0 x x 0 x 0 x x 0 0 x x x 0 0 0 x x 0 0 0 0 x
rra
Figura 5.2: Eliminacion gaussiana y su representacion como un grafo. Efecto del reorde-
namiento.

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 coeficientes al disponer de la
descomposicion LU o LL> .

Queda mas alla de los contenidos de este curso explicar como funcionan los algorit-
mos implementados en symrcm y symmmd. Se puede senalar no obstante que ambos
do
se basan en identificar 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)6=0. El proceso de elimi-
nacion gaussiana se ve como la eliminacion sistematica de nodos y la creacion de
nuevos enlaces entre los nodos restantes. Concretamente, si hacemos un cero con la
fila i en la fila j, aparecen nuevos enlaces entre los nodos que estaban unidos con el
nodo i y los conectados con j. El problema se reescribe ahora en terminos de retirar
los nodos en el orden adecuado de forma que se minimice el numero de nuevos ejes
creados (Figura 5.2).

Los graficos de la Figura 5.1 han sido creados a traves del siguiente fichero script.
r
% Calculamos la matriz de elementos finitos para
% un problema sobre un dominio en forma de L

[p,e,t]=initmesh(lshapeg,Hmax,0.2); % malla inicial

73
5.2 Metodos iterativos para sistemas lineales LECCION II

[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
Bo
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)
rra
% 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)
do
5.2. Metodos iterativos para sistemas lineales
Cuando un sistema de ecuaciones lineales es de tamano moderado4 , casi nadie du-
da en utilizar el metodo de Gauss en alguna de sus multiples variantes (incluidas las
descomposiciones matriciales). Sin embargo, la utilizacion de metodos iterativos se torna
imprescindible en problemas con matrices grandes, especialmente si son sparse, donde el
metodo de Gauss presenta las siguientes dificultades:

Es caro: O(4n3 /3) operaciones


r
Es destructivo: retoca la matriz del sistema, y esto puede tener consecuencias muy
poco deseables, como hemos visto con matrices sparse. Ademas requieren en muchas
ocasiones guardar una copia de la matriz.
4
Es difcil definir que se entiende por tamano moderado. Ciertamente, tamanos enormes en la decada
de los anos 70 son ahora perfectamente manejables en un pequeno PC.

74
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

Para obtener una solucion hace falta realizar todo el proceso: en pasos intermedios
no se dispone de ninguna aproximacion de la solucion.

Los metodos iterativos se introducen como un intento de salvar estas dificultades.


Bo
5.2.1. Definicion
Esencialmente, un metodo iterativo toma un sistema lineal

Ax = b

y construye una sucesion de vectores de forma que

xm x, cuando m .

La forma de construir esta sucesion depende, obviamente de la matriz A, del termino


independiente y de como se arranque el metodo numerico (vector inicial).
Existen multitud de esquemas diferentes pero la mayora comparten las siguientes
rra
desventajas:

No siempre convergen en un numero razonable de iteraciones, y en muchas ocasiones


ni siquiera convergen.

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.
Ademas, chequear estas hipotesis puede resultar tan costoso como resolver el mismo
sistema.

El ultimo punto merece cierto comentario. Los sistemas lineales provienen en general
de problemas fsicos de los que se dispone de informacion a priori, entre las que se pueden
do
encontrar las hipotesis que aseguran la convergencia de un metodo iterativo. Por ejemplo,
se puede saber que una matriz es definida positiva, y no hay necesidad por tanto de hacer
esta comprobacion.
Por contra, los metodos iterativos tienen las siguientes e importantes ventajas:

Son metodos no destructivos. No modifican la matriz del sistema y, en general,


precisan solo multiplicar por la matriz del sistema o por partes de ella.

Suelen ser mas estables frente a los errores de redondeo5 .


r
Se dispone en cada paso de una aproximacion de la solucion.
5
Carl Friedrich Gauss, que introdujo un metodo precursor del metodo conocido actualmente como
metodo de GaussSeidel, comentaba en una carta a su colega Christian Ludwig que los calculos se
podan realizar aun cuando se estuviese medio dormido o pensando en cosas mas importantes. No
hay que olvidar que en su epoca todos los calculos se hacan a mano. En nuestros das, se plantea el
mismo problema con los errores de redondeo.

75
5.2 Metodos iterativos para sistemas lineales LECCION II

5.2.2. Detalles sobre la implementacion


En un metodo iterativo no podemos esperar calcular la solucion exacta, sino hallar
una aproximacion con una tolerancia prefijada. Por tanto debemos fijar un criterio de
parada que de por terminado el metodo cuando la solucion se considere suficientemente
buena. Esto no es grave. Los sistemas de ecuaciones lineales suelen provenir de metodos
Bo
que calculan soluciones aproximadas de problemas fsicos e ingenieriles. No tiene pues
sentido obcecarse en calcular la solucion exacta de un problema aproximado.
As hemos de elegir un criterio de parada que termine la ejecucion cuando la solucion
es suficientemente buena. Una posibilidad es medir la diferencia entre dos iteraciones
consecutivas
kxm+1 xm k
en alguna norma que queda a eleccion del programador o del usuario. Si la diferencia es
pequena, se considera que estamos cerca de la solucion y se finaliza el metodo.
De nuevo nos encontramos con el problema de definir pequeno. Por ejemplo, una di-
ferencia de 1.4 entre dos iteraciones puede ser grande si la solucion tiene un tamano
kxk 101 o pequena si kxk 1010 .
Por ello se puede hacer un promedio entre el error absoluto y el relativo. Concreta-
rra
mente, si x e y son dos iteraciones consecutivas, se puede fijar el criterio
01 aux=norm(x-y); % norma 2 entre x e y
02 if (aux<eps1+eps2*norm(x))
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 fijan el criterio de parada y pueden ser dados
por el usuario.
Otros criterios se basan en calcular r = bAx y calcular el tamano. Es decir, medimos
cuanto le falta a x para ser solucion del sistema. El vector r recibe el nombre de residuo.
do
Nos encontramos de nuevo con dos componentes del residuo, el primero relacionado
con su tamano relativo, con respecto al termino independiente, y otra absoluta. Ambos
se pueden controlar con
01 aux=norm(b-a*x); % residuo
02 if (aux<eps1+eps2*norm(b))
03 disp(Convergencia alcanzada...
04 ..........
05 end
Este criterio puede ser preferible si se dispone ya del residuo y no hay que calcularlo ex
r
profeso. En muchos casos se toma simplemente eps1= 0.
Por otro lado, y desde un punto de vista computacional, debemos evitar que el metodo
entre en un bucle infinito. Es decir, fijar un numero maximo de iteraciones de forma que
si se supera, se termine el metodo con un mensaje de error6 . Que un residuo sea pequeno
6
Existe otro problema: que la solucion crezca de forma que supere la cantidad maxima representable
en coma flotante (overflow). Matlab devolvera inf o -inf.

76
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

o que dos iteraciones consecutivas cercanas indiquen proximidad a la solucion exacta no


siempre es cierto, pero suele ser muy buena senal.

5.2.3. Metodos iterativos clasicos


El estudio y desarrollo de los metodos iterativos clasicos, tambien denominados afines
Bo
por su forma de construccion, surgio con fuerza en los anos 50, aunque el origen de alguno
de ellos se remonta al siglo XIX. El desarrollo de estos metodos fue paralelo al desarrollo
de los ordenadores y vino muy condicionado por el tipo de problemas que se deseaban
resolver. Estos problemas eran principalmente los provenientes de ecuaciones en derivadas
parciales que daban lugar a matrices grandes y sparse. El uso de los metodos iterativos
afines en nuestros das es menos habitual, habiendo sido superados por los metodos de
tipo Krylov de los que el Gradiente Conjugado es sin lugar a dudas el representante mas
popular. De hecho, los metodos clasicos se utilizan en la actualidad como precondiciona-
dores de los metodos mas modernos y potentes, es decir, como un preproceso que acelera la
convergencia de los mismos. Sin embargo su simplicidad y el modo que tienen de ilustrar
el diseno y funcionamiento de un metodo iterativo fundamentan su exposicion en estos
apuntes.
rra
Conocimientos previos
Comenzaremos introduciendo algunas normas vectoriales que nos serviran para medir
el tamano de los vectores y matrices. Dado un vector

x := (x1 , x2 , . . . , xn )> Rn

consideramos las normas


q
kxk1 := |x1 | + |x2 | + . . . + |xn |, kxk2 := x21 + x22 + . . . + x2n ,
kxk := max |xi |.
i=1,...,n
do
Es facil ver que efectivamente las tres expresiones definen una norma en Rn . Las relaciones
entre ellas vienen dadas por las cotas

kxk2 kxk1 nkxk2 , kxk kxk1 nkxk , kxk kxk2 nkxk .

Observa que sin embargo estas constantes de equivalencia dependen de n. Todas ellas
estan implementadas en Matlab, como ya se vio en la Seccion 4.1.2.
Cada norma vectorial define a su vez una norma sobre las matrices

kAk = sup kAxk


kxk=1
r
denominada norma matricial inducida. En la expresion anterior sup es el supremo
sobre todos los vectores de norma 1, que es de hecho un maximo (el supremo se alcanza).
Se puede comprobar que
n
X n
X
kAk1 = max |aij |, kAk = max |aij |.
j=1,...,n i=1,...,n
i=1 j=1

77
5.2 Metodos iterativos para sistemas lineales LECCION II

La norma k k2 tiene una expresion mas complicada que dificulta su calculo practico. En
concreto p
kAk2 = (A> A)
donde (B), denominado radio espectral, denota el mayor de los valores absolutos de
los valores propios de B (ver Leccion IV). Si A es simetrica, se tiene simplemente que
Bo
kAk2 = (A).
En cualquier caso, el comando norm de Matlab aplicado a matrices devuelve las corres-
pondientes normas matriciales:

>> norm(a,1) % norma 1


>> norm(a,inf) % norma infinito
>> norm(a,2) % norma 2. Vale tambien norm(a)

Una norma vectorial y su norma matricial inducida se relacionan mediante

kAxk kAk kxk .


| {z } |{z} |{z}
norma vectorial norma matricial norma vectorial
rra
Es decir, kAk mide el maximo alargamiento que multiplicar por A puede producir en un
vector medido en la norma k k.

Definicion y condiciones de convergencia


Los metodos iterativos lineales (o basados en iteraciones afines) comienzan conside-
rando una particion de A tal que
A=M N
con M invertible. As, si x es solucion de Ax = b,

M x = N x + b.
do
El metodo iterativo consiste en

Tomar x0 una aproximacion de la solucion. Si no se conoce se puede tomar por


ejemplo el vector nulo.

Resolver en cada paso m


M xm+1 = N xm + b. (5.1)

Es facil ver que si la sucesion construida en (5.1) converge a algun x, entonces el vector
es la solucion del sistema. Aun es mas, se comprueba facilmente que
r
xm+k+1 x = (M 1 N )(xm+k x) = . . . = (M 1 N )k (xm+1 x).

Denotando por B = M 1 N se tiene el siguiente resultado

Teorema 5.1 El metodo iterativo converge si y solo si existe k tal que kB k k < 1.

78
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

Observa que en el resultado anterior no se especifica la norma utilizada. Otro detalle al


que a veces se presta poca atencion es que la convergencia del metodo ocurre sea cual sea
x0 , es decir, independientemente de como se arranque el metodo y de cual sea el termino
independiente. Claramente si se tiene una estimacion buena de la solucion el metodo
convergera en menos iteraciones, pero no es una condicion imprescindible para asegurar
la convergencia7 .
Bo
No es difcil ver que
(B) kBk
para cualquier norma inducida, y por tanto8

(B) = ((B k ))1/k (kB k k)1/k k N.

Es mas, se puede probar que, de nuevo para toda norma inducida,

lm kB k k1/k = (B)
k

Por tanto se concluye que una condicion equivalente de convergencia es que todos
los valores propios de B = M 1 N tengan valor absoluto menor estrictamente que 1.
rra
Teorema 5.2 El metodo iterativo converge si y solo si (B) < 1.

Los resultados anteriores pueden utilizarse para probar que

kxm+1 xk C(m)(B)m kx1 x0 k

para todo m m0 y donde C(m) 1, con C(m) 1 cuando m . La cantidad (B)


recibe en ocasiones el nombre de velocidad asintotica de convergencia. La estimacion
anterior justifica esta denominacion dado que mide la reduccion media del error esperada
en cada iteracion.
do
Nota. Si M = A entonces N = 0, por tanto B = 0 y trivialmente

(B) = 0.

Es decir, hay convergencia en una unica iteracion. Esta iteracion consiste en resolver
directamente el sistema de ecuaciones.
En general, uno asegura la convergencia cuando M recoge la informacion mas impor-
tante de A, de forma que N = M A tenga un tamano pequeno comparado con M . Por
otro lado, se debe tener en cuenta la definicion del metodo (5.1) y que por tanto en cada
r
iteracion hay que resolver un sistema de ecuaciones. As, interesa que M sea sencilla desde
el punto de vista de la resolucion del sistema lineal (por ejemplo, diagonal, triangular,...)
y que simultaneamente recoja la mayor informacion posible de A. 
7
Esta propiedad se pierde cuando se resuelven ecuaciones y sistemas no lineales. En este caso, los
metodos numericos convergen solo si se arranca suficientemente cerca de la solucion.
8
Si es valor propio de B, 2 lo es de A2 .

79
5.2 Metodos iterativos para sistemas lineales LECCION II

Metodos de Jacobi, de GaussSeidel y de relajacion de Young


Sea el sistema Ax = b donde

a11 a12 . . . a1n
a21 a22 . . . a2n
A=

.. .. .. ..
. .
Bo
. .
an1 an2 . . . ann

La familia de metodos que vamos a exponer se basa en considerar la siguiente descompo-


sicion de A
A=DLU
donde

a11 0 0 0 0 a12 a1n
a22 a21 0 0 0 0 a2n
D = , L = , U = .

.. .. .. .. .. .. .. .. ..
. . . . . . . . .
ann an1 an2 0 0 0 0
rra
El metodo de Jacobi consiste en tomar en la definicion del metodo iterativo M = D
y N = L + U , es decir,
Dxm+1 = (L + U )xm + b.
Para calcular xm+1 hay que resolver por tanto un sistema diagonal cuyo coste es despre-
ciable. Visto componente a componente, tenemos que si
h i>
(m) (m)
xm = x1 , x2 , . . . , x(m)
n Rn

entonces
(m+1) 1h X (m)
i
xi = bi aij xj , i = 1, . . . , n.
aii j6=i
do
Para algunos tipos especiales de matrices se sabe que el metodo converge e incluso se
dispone de informacion sobre la velocidad de convergencia.
Una matriz es estrictamente diagonal dominante por filas si
X
|aii | > |aij |, i
j6=i

y por columnas si X
|ajj | > |aij |, j.
i6=j
r
Teorema 5.3 Si la matriz es estrictamente diagonal dominante por filas o columnas el meto-
do de Jacobi converge.

Ejercicio 5.1 (matematico) Probar el teorema anterior. Cuando convergera mas rapido?
(Ayuda. Construir la matriz B = D1 (L + U ). Probar que kBk < 1 si es dominante por filas
o kBk1 < 1 si es dominante por columnas. Aplicando el Teorema 5.2, se deduce el resultado.)

80
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

Para dar una descripcion del metodo de Jacobi en pseudocodigo fijamos

x = aproximacion inicial, mmax = numero maximo de iteraciones,


eps1 = tolerancia absoluta, eps2 = tolerancia relativa,

y tomamos como criterio de parada la norma eucldea de la diferencia entre dos iteraciones
sucesivas del metodo. La eleccion de la norma es libre, queda a eleccion del programador
Bo
(podamos tomar por ejemplo la norma 2 o la norma infinito).
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
 n
X 
04 x i = bi aij yj /aii
j=1
j6=i

05 end
rra
06 if kx yk2 <eps1+eps2*norm(x)
07 return
08 end
09 end
10 disp(numero maximo de iteraciones alcanzado)
11 return

Ejercicio 5.2 Implementa el metodo de Jacobi en Matlab.


do
Solucion. Empezaremos fijando la cabecera que contendra la ayuda de la funcion. Nos
va a servir de que estructura vamos a dar a la entrada y salida de datos. Dicho esto, la
implementacion de este metodo que proponemos es la siguiente

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
r
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,... EPS1,EPS2 son las tolerancias
12 % EPS1,EPS2 absoluta y relativa

81
5.2 Metodos iterativos para sistemas lineales LECCION II

13 %
14 %[X,IT]= JACOBI(A,B,ITMAX,...
15 % EPS1,EPS2,X0) arranca el metodo con X0
16 %
17 function [x, varargout]=jacobi(a,b,varargin)
18
Bo
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
rra
31 eps2=varargin{3};
32 end
33 if nargin>5
34 x(:)=varargin{4}; %x es un vector columna
35 end
36
37 % Metodo de Jacobi
38
39 for m=1:mmax
40 error=0;
41 y=x;
42 for i=1:n
do
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); % otras normas con norm(x-y,1),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 sobrepasado)
r
53 end
54
55 %salida
56
57 if (nargout>1)
58 varargout{1}=m;

82
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

59 end
60 return

Recuerda que el comando break, utilizado en la lnea 48 provoca la salida automatica


del bucle, dando por finalizado la ejecucion del metodo y pasando a la parte del codigo
encargada de devolver los resultados obtenidos.
Bo


Ejercicio 5.3 Programa una nueva opcion de salida que devuelva un vector error de lon-
gitud m 1 de forma que error(m) sea la diferencia entre xm y xm+1 .

Observa que el codigo realmente dedicado al metodo de Jacobi se reduce a apenas diez
lneas (39-50) con el resto de la subrutina dedicada al control del algoritmo y a la salida
y entrada de datos. Se observa ademas que la lnea 43 permite implementar en una unica
lnea (44) el producto de la lnea 04 del pseudocodigo.
El codigo anterior, sin embargo, es optimizable. El ejercicio siguiente ahonda en un
aspecto en particular

Ejercicio 5.4 Otra forma alternativa de implementar el metodo es reemplazar las lneas
rra
42-45 por el producto

x=(b-a*y+d.*y)./d

o bien

x=y+(b-a*y)./d

donde d es un vector columna que contiene la diagonal de la matriz. Observa que realizamos
operaciones de mas (multiplicamos 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 metodo9 ?
do
El metodo de GaussSeidel10 consiste en tomar M = D L y N = U , es decir

(D L)xm+1 = U xm + b. (5.2)

Para calcular xm+1 hay que resolver un sistema, en este caso triangular. Repasando con
cuidado las operaciones, observamos que
i1 n
(m+1) 1h X (m+1)
X (m)
i
xi = bi aij xj aij xj , i = 1, . . . , n.
aii j=1 j=i+1

9
r
Deberas probar con matrices grandes. La orden rand te puede servir para ese fin. Una forma de
asegurar la convergencia es generar matrices estrictamente diagonal dominantes. Como se puede hacer
esto?.
10
El nombre de este algorimo es muy curioso. Segun diversos autores (ej. George E. Forsythe o Gerard
Meurant), Carl Friedrich Gauss no diseno exactamente este metodo y Philipp Ludwig von Seidel, que lo
estudio a finales del siglo XIX, desaconsejaba su uso. Gauss desarrollo un metodo muy similar cuando
trataba de resolver un problema de geodesia que llevaba a un sistema lineal que no era compatible
determinado.

83
5.2 Metodos iterativos para sistemas lineales LECCION II

Escrito en forma algortmica,


GaussSeidel

01 for m=1:mmax
02 error=0; y=x
Bo
03 for i=1:n
 i1
X n
X 
04 x i = bi aij xj aij yj /aii
j=1 j=i+1
05 end
06 if kx yk<eps1+eps2*norm(x)
07 return
08 end
09 end
10 disp(numero maximo de iteraciones alcanzado)
11 return
rra
As pues, la unica diferencia con el metodo de Jacobi es que GaussSeidel procede a
utilizar la nueva componente calculada xi tan pronto es posible mientras que Jacobi solo
la utiliza en la nueva iteracion. Es por ello que GaussSeidel es (casi siempre) superior a
Jacobi. No hay razones matematicas que permitan apoyar esta impresion. De hecho existen
matrices para las que Jacobi converge y GaussSeidel diverge, aunque hace falta construir
un ejemplo ad hoc, no es facil encontrar tal ejemplo, para comprobar esta afirmacion.
Desde un punto de vista practico, si Jacobi converge es altamente probable que lo haga
tambien GaussSeidel y generalmente, este lo hara en menos iteraciones.

Teorema 5.4 El metodo de GaussSeidel converge si


do
la matriz es estrictamente diagonal dominante por filas o columnas;
o

la matriz es simetrica definida positiva.

Ejercicio 5.5 Programa el metodo de GaussSeidel modificando de forma apropiada la fun-


cion del Ejercicio 5.2.

Ejercicio 5.6 De manera similar a lo que se propuso en el Ejercicio 5.4, podemos implementar
la parte central del metodo de GaussSeidel mediante
r
x=l\(b-u*y)

o bien con el doble numero de operaciones con

x=y+l\(b-a*y)

donde

84
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

l=tril(a,0); u=triu(a,1);

Implementa el metodo resultante. Que ventajas y desventajas observas en cada de estas


implementaciones?.
(Ayuda: recuerda los comandos diag, triu y tril de la Seccion 4.1.3)
Bo
Ejercicio 5.7 El metodo de GaussSeidel tiene una curiosa asimetra: la primera componente
de cada xm+1 se calcula utilizando los valores de la anterior iteracion xm , mientras que la ultima
componente utiliza todas las componentes de la nueva iteracion xm+1 . Se puede plantear el
metodo de GaussSeidel inverso que es el que resulta de intercambiar los papeles de L y U en
(5.2). Ahora la situacion es justamente la recproca. Mejora la velocidad de convergencia del
metodo?

Ejercicio 5.8 El metodo de GaussSeidel simetrizado o cclico trata de solventar la asimetra


senalada en el ejercicio anterior. Consiste en encajar dos iteraciones, una con GaussSeidel y
otra con el metodo de GaussSeidel inverso. Es decir, dado xm , se aplica un paso del metodo
de GaussSeidel para obtener un nuevo vector xm+1/2 . Seguidamente se calcula un paso del
metodo GaussSeidel inverso y asse obtiene la nueva aproximacion xm+1 .
rra
Implementa este metodo. Se reduce el numero de iteraciones necesarias para alcanzar la
convergencia? Y el costo por iteracion? Te parece rentable esta aproximacion?.

El ultimo representante de esta familia de metodos clasicos que estudiaremos es el


metodo de relajacion de Young. Introducido y estudiado independientemente por
David M. Young (en su tesis doctoral) y Stanley P. Frankel sobre 1950, es una simple
modificacion del metodo de GaussSeidel que trataba, como buena parte de los metodos
propuestos en estos anos, de acelerar la convergencia de los metodos de GaussSeidel y
Jacobi.
La modificacion propuesta consiste en realizar un promedio sobre la aproximacion que
proporcionara GaussSeidel y la iteracion anterior.
Concretamente, la expresion es
do
i1 n
(m+1) (m) h X (m+1)
X (m)
i
xi = (1 )xi + bi aij xj aij xj , i = 1, . . . , n.
aii j=1 j=i+1

Si = 1 recuperamos el metodo de GaussSeidel. El objetivo es escoger adecuadamente


para acelerar la convergencia del metodo.
No es facil encontrar el valor optimo de , aunque necesariamente (0, 2) pues en
caso contrario el metodo diverge.
Si la matriz es simetrica definida positiva o tridiagonal el metodo de relajacion converge
para cualquier (0, 2). Tambien converge si es estrictamente diagonal dominante (por
r
filas o columnas). Sin embargo, salvo para matrices tridiagonales, poco se puede decir
acerca de la eleccion optima del parametro , y aun en este caso, la determinacion exacta
del parametro optimo exige resolver un problema bastante complicado.
Desde un punto de vista practico, el parametro se estima mediante ensayoerror. De
forma algo sorprendente, en problemas practicos es muy habitual que > 1. De ah el
nombre que se le da a veces de Sobrerrelajacion (overrelaxed).

85
5.2 Metodos iterativos para sistemas lineales LECCION II

Por ultimo, aunque no sea inmediato, se puede comprobar que este metodo encaja en
el marco anterior, sin mas que tomar
1 1
M= D L, N= D+U

Ejercicio 5.9 Implementa el metodo de relajacion de Young a partir del metodo de Gauss
Bo
Seidel. Incluye como nuevo argumento de entrada el parametro . Un posible valor por defecto
podra ser = 1 con lo que tendramos el metodo de GaussSeidel.

Ejercicio 5.10 De nuevo, la parte central del metodo de relajacion se puede implementar
en la forma

x=y+m\(b-a*y)

donde m es una matriz adecuada. Cual es esa matriz?.

5.2.4. Metodos de tipo gradiente


Comenzaremos recordando algunos conceptos e introduciendo algunas notaciones que
rra
facilitaran la exposicion de los metodos de tipo gradiente.
Recordemos que todos los vectores se consideran como vectores columna. Dada A una
matriz simetrica definida positiva, la operacion que a cada par de vectores x, y le
asigna el numero real
x> Ay
es un producto escalar, esto es, cumple las propiedades que definen un producto escalar11 :

1. (x + y)> Az = x> Az + y> Az, , R, x, y, z Rn ;

2. x> Ay = y> Ax, x, y Rn (por ser A simetrica);

3. x> Ax > 0, si x 6= 0 (por ser A definida positiva).


do
En particular, si In es la identidad n n,

x> In y = x> y

es simplemente el producto escalar habitual en Rn de x e y. Denotaremos

xy x> y = 0

y diremos en este caso que x e y son ortogonales. La misma notacion se puede extender
al producto definido por A, de forma que
r
x A y x> Ay = 0

y en este caso x e y se dicen Aortogonales.


11
Es interesante observar cuantas propiedades del producto escalar eucldeo (el habitual en Rn ) depen-
den unicamente de que se cumplan estas tres propiedades y por tanto son extensibles a estos casos mas
generales.

86
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

La norma asociada al producto escalar anterior se conoce como norma de energa


y su expresion viene dada, obviamente, por

kxkA := x> Ax.

Todas las normas son equivalentes en Rn , pero para esta norma se tiene ademas la esti-
macion
Bo
n kxk2 kxkA 1 kxk2
donde 1 2 .... n > 0 son los valores propios, todos reales por ser A simetrica y
positivos por ser definida positiva. La cantidad
1
(A) = ,
n
que sera relevante en lo que sigue, es el condicionamiento de la matriz12 . Obviamente,
(A) 1.
Construimos la funcion
F (x) = 12 x> Ax x> b
conocida como funcional de energa. Tras unos simples calculos, se comprueba que
rra
F = Ax b.

Por tanto, el unico posible extremo de F es la solucion de Ax b = 0. Ademas, como la


matriz hessiana de F es la propia matriz A, que es definida positiva, este extremo sera un
mnimo. Hemos llegado por tanto a la siguiente conclusion:
resolver Ax = b es equivalente a encontrar el mnimo de F
En esta observacion se basan los metodos de descenso: en lugar de resolver el sistema de
ecuaciones Ax = b, nos preocupamos en buscar el mnimo de F . Es esencial que A sea
definida positiva para que estos argumentos sean validos.
do
Metodos de descenso. Aspectos generales
La idea de estos metodos es sencilla. Dado un valor inicial consiste en ir moviendose en
trayectorias zigzagueantes hasta alcanzar el mnimo. Concretamente, dada una aproxima-
cion, fijamos una direccion de desplazamiento, calculamos cuanto nos movemos, descender
en el lenguaje habitual, y nos desplazamos a un nuevo punto.
De esta forma construimos una sucesion xm que debera converger a x, siguiendo estos
pasos.
Calcular una direccion de descenso dm .
r
Descender una cantidad m , tomando como nueva aproximacion

xm+1 = xm + m dm .
12
El condicionamiento se define tambien para matrices arbitrarias reemplazando los valores propios por
los denominados valores singulares, o mas en general, definiendolo como el producto de la norma de A
por la norma de su inversa. En general el condicionamiento de la matriz mide la sensibilidad del sistema
de ecuaciones lineales asociado a variaciones del termino independiente.

87
5.2 Metodos iterativos para sistemas lineales LECCION II

Se procede as hasta que hay convergencia.


Dos aspectos determinan el metodo: que direccion se toma y cuanto se desciende. Tanto
en el metodo del Gradiente como en el metodo del Gradiente Conjugado, que veremos a
continuacion, se toma m de forma que

F (xm+1 ) = mn F (xm + dm )
Bo
R

es decir, se trata de minimizar, una vez escogida la direccion de descenso dm , el funcional


de energa. Definiendo
g() = F (xm + dm )
podemos comprobar que

g 0 () = d> >
m Adm dm (b Axm )
| {z }
rm

y por tanto la cantidad de descenso viene dada por


rra
r>
m dm
m := >
, (5.3)
dm Adm

(obtenido al imponer g 0 () = 0). El vector rm = b Axm es el residuo de xm , que ya


ha surgido en estas notas. Se puede probar facilmente que

rm+1 = b Axm+1 = b Axm m Adm = rm m Adm .

En consecuencia, el residuo en pasos sucesivos satisface una relacion similar a la que


cumple xm . Sin embargo, este tipo de recurrencia puede verse afectada por errores de
redondeo, por lo que en ocasiones el residuo se recalcula cada cierto numero de iteraciones
de acuerdo a su definicion para cancelar cualquier error de redondeo.
do
El algoritmo resultante es el siguiente:

Metodo de descenso

01 x0 inicial, r0 = b0 Ax0
02 for m=0:mmax
03 Escoger dm
r > dm
04 m := >m
dm Adm
05 xm+1 = xm + m dm
r
06 rm+1 = rm m Adm
07 end

Claramente, la lnea 03 queda pendiente y en ultima medida define el metodo.

88
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

Metodo del Gradiente


Dado que F (xm ) = b Axm = rm , la direccion de maximo descenso es la del
residuo. Por tanto, esta parece una buena eleccion para dm . El metodo as definido es el
metodo del gradiente.
Bo
Metodo del Gradiente

01 x0 inicial; r0 = b Ax0 ;
02 for m=0:mmax
03 pm = Arm
r>m rm
04 m = >
r m pm
05 xm+1 = xm + m rm
06 rm+1 = rm m pm
07 if krm+1 k epskbk
08 break
09 end
rra
10 end

En el paso 06 estamos calculando el residuo de la solucion. El criterio de parada se


toma ahora a partir del residuo. En concreto hemos escogido el basado en el tamano
relativo del residuo (epskbk). La norma que utilizamos es la eucldea, que es connatural
al metodo.

Ejercicio 5.11 Programa el Metodo del Gradiente.

Solucion. Una posible implementacion del metodo es la que sigue


do
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... EPS tolerancia relativa
09 % EPS)
r
10 %
11 % X = GRADIENTE(A,B,ITMAX... X0 es el valor inicial
12 % EPS, X0)
13 %
14 %[X,IT] = GRADIENTE(A,B,ITMAX... Devuelve en IT el numero de
15 % EPS,XO) iteraciones calculadas

89
5.2 Metodos iterativos para sistemas lineales LECCION II

16
17 %[X,IT,R]= GRADIENTE(A,B,ITMAX) R es un historial del metodo:
18 % EPS,XO) R(i) es el residuo en el paso i
19
20 function [x,varargout]= gradiente(a,b,varargin);
21
Bo
22 n=length(a); x=zeros(n,1); mmax=40;
23 tol=1e-6;
24
25 if nargin>2
26 mmax=varargin{1};
27 end
28 if nargin>3
29 tol=varargin{2};
30 end
31 if (nargin>4)
32 x=varargin{4};
33 end
rra
34
35 r=b-a*x; res(1)=dot(r,r); aux=norm(b);
36 for m=1:mmax
37 p=a*r;
38 xi=res(m)/dot(r,p);
39 x=x+xi*r;
40 r=r-xi*p;
41 res(m+1)=dot(r,r); % guardamos los residuos
42 if (sqrt(res(m+1))<tol*aux);
43 break
44 end
45 end
do
46
47 if (m==mmax)
48 disp(numero maximo de iteraciones sobrepasado)
49 end
50 if nargout>1
51 varargout{1}=m;
52 end
53 if nargout>2
54 varargout{2}=sqrt(res(:));
55 end
r
56 return

El vector res guarda el residuo en cada iteracion para as tener un historial de como
ha ido la convergencia.
Prueba el metodo con un sistema donde la matriz sea simetrica definida positiva (nota:
para toda matriz B, B > B es simetrica (semi) definida positiva.)

90
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos


La grafica mostrada en la Figura 5.3 se ha construido utilizando las instrucciones

>> n=40;a=rand(n,n); a=a*a; %% a es sim\{e}trica definida positiva


>> x=ones(n,1); b=a*x;
>> [x,it,r]=gradiente(a,b,100,1e-5);
Bo
>> semilogy(r)

Hemos utilizado una escala logartmica para medir la norma del residuo. Observa su fuerte
comportamiento oscilatorio.

4 Residuo
10

3
10

2
10

1
rra
10

0
10

1
10

2
10
0 10 20 30 40 50 60 70
Iteraciones

Figura 5.3: Historial del residuo para el metodo del Gradiente.

Ejercicio 5.12 En este ejercicio tratamos de nuevo aspectos de la implementacion en Matlab.


do
Concretamente, que pasa si el usuario desea especificar el vector de arranque (x0 en la nota-
cion del metodo) pero desea dejar el numero maximo de iteraciones y la tolerancia por defecto?.
Como estandar en Matlab, se enva vaco ([ ]), de forma que los argumentos intermedios se
ignoran. Por ejemplo,

>> x=gradiente(a,b,[],1e-5)

especificara la tolerancia pero no el numero maximo de iteraciones. Implementa las modifi-


caciones necesarias en el programa anterior para que la funcion soporte este estandar.
(Ayuda: La funcion isempty puede resultarte util.)
r
Breves notas sobre el estudio del Metodo del Gradiente
La clave del analisis es la relacion

F (xm+1 ) F (x) = 21 (xm+1 x)> A(xm+1 x) = 12 k xm+1 x k2A


| {z }
em+1

91
5.2 Metodos iterativos para sistemas lineales LECCION II

donde claramente em+1 es el error entre la solucion exacta y la numerica medido en la


norma de energa de A. Por tanto, como F (xm+1 ) F (xm ),

kem+1 kA kem kA

luego en cada iteracion hay una reduccion del error en la norma de energa. Sin embargo,
Bo
en ningun caso implica que el residuo se reduzca en cada iteracion, como bien podemos
comprobar en la Figura 5.3. Aun es mas, de la eleccion hecha de m se sigue que

F (xm+1 ) := mn F (xm + rm )
R

y por tanto
h i
kem+1 kA mn kx xm rm kA = mn kem Aem kA mn kI AkA kem kA .
R R R

Observa que hemos utilizado la cota kM xkA kM kA kxkA , caracterstica de toda norma
vectorial y su norma matricial inducida.
rra
Proposicion 5.5 Sean 1 y n el mayor y menor valor propio de A. Entonces

1 n
mn kI AkA = mn kI Ak2 = < 1.
R R 1 + n

La convergencia se escribe de forma muy comoda en terminos del condicionamiento


de la matriz (A) = n1 , deduciendo la expresion

(A) 1
kem+1 kA kem kA .
(A) + 1

Es inmediato observar que


do
El factor de reduccion del error es siempre menor que uno, luego hay convergencia
para toda A simetrica definida positiva.

Si (A) >> 1, la convergencia puede ser muy lenta.

Ejercicio 5.13 (puramente matematico) Se puede probar que dada A simetrica definida
positiva existe B simetrica definida positiva tal que BB > = B 2 = A, conocida como raz
cuadrada de A. Utilizando este resultado prueba la identidad

kI AkA = kI Ak2
r
utilizada en la Proposicion 5.5.
(Ayuda: Observa que kxkA = kBxk2 . Utiliza ahora que

kI AkA = sup k(I A)xkA = sup kB(I A)B 1 (Bx)k2


kxkA =1 kBxk=1

y completa la demostracion).

92
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

Ejercicio 5.14 (demostracion de la Proposicion 5.5) Para toda matriz simetrica C


se cumple que
kCk2 = max |j |
j

con j el valor propio jesimo. Por tanto


Bo
kI AkA = kI Ak2 = max |1 j |.
j

Define gc () = |1 c | y traza la grafica de estas funciones para varios valores de c. Deduce


que = 2/(1 + n ) es el valor que hace mnimo kI Ak2 y que para este valor,

1 n
kI Ak2 = .
1 + n

(Ayuda: al dibujar gc () para diferentes valores de c obtendras obtendras algo similar a esto
rra
1

0.5

0
0 1 2 3 4 5

Cuales son las graficas de los valores extremos?)


do
El Gradiente Conjugado
El metodo del Gradiente Conjugado trata de resolver alguna de las dificultades obser-
vadas con el metodo del Gradiente, como por ejemplo el comportamiento oscilatorio del
residuo.
Observemos que en un metodo de descenso, y por la eleccion de m hecha en (5.3),

r> > >


m+1 dm = rm dm m dm Adm = 0,

por lo que rm+1 dm . Esto es, en un metodo de descenso el residuo del paso m + 1 es
r
ortogonal a la direccion de descenso anterior.
Sin embargo, en general ya no es cierto que

rm+1 dm1 (5.4)

y por tanto se pierde esta propiedad de ortogonalidad.

93
5.2 Metodos iterativos para sistemas lineales LECCION II

Una forma de evitar, o de mitigar, el aspecto oscilante del metodo del Gradiente, es
exigir que la direccion de descenso dm satisfaga (5.4). Es decir, tomamos

rm+1 = rm m Adm ,

y concluimos que
Bo
d>
m1 rm+1 = 0 dm1 Adm dm1 A dm .

En vista de lo anterior optamos por tomar como direccion de descenso una perturbacion
de la direccion natural rm (el residuo) en la direccion del descenso anterior (dm1 ) que
satisfaga la propiedad de ortogonalidad anterior. Es decir, tomamos

dm = rm + m dm1

con m adecuado. Exigiendo que se satisfaga (5.4) deducimos que

r>
m Adm1
dm A dm1 r> >
m Adm1 + m dm1 Adm1 = 0 m = >
.
dm1 Adm1
rra
Como eleccion inicial de la direccion de descenso tomamos simplemente r0 , el residuo
de la aproximacion inicial. Con todo esto, la primera version del metodo del Gradiente
Conjugado es la que sigue

Gradiente Conjugado - Primera version

01 x0 inicial; r0 = b Ax0 ; d0 = r0 ;
02 for m=0:mmax
03 pm = Adm
r>
m dm
04 m =
do
d>
m pm

05 xm+1 = xm + m dm
06 rm+1 = rm m pm
07 if krm+1 k epskbk
08 break
09 end
r > pm
10 m+1 = m+1
d>m pm
11 dm+1 = rm+1 + m+1 dm
12 end
r
13 disp(Numero maximo de iteraciones alcanzado)

Como puede verse, las modificaciones sobre el metodo del Gradiente son mnimas
y estan concentradas en las lneas 04, 10 y 11. En cuanto al numero de operaciones,

94
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

coincide con las del metodo del Gradiente: en cada paso es necesario calcular un producto
matrizvector (lnea 03) y tres productos escalares (04 y 10).
Listaremos a continuacion algunas propiedades entre los residuos y las direcciones de
descenso que permiten dar una expresion distinta del metodo, y deducir alguna de las
propiedades de convergencia.
Bo
Lema 5.6 Para todo m 0
r> >
m dm = r m r m .

Por tanto
r>
m rm
m = .
d>
m Adm

Demostracion. Como rm dm1 ,


r> > >
m dm = rm rm + m rm dm1 . (5.5)
| {z }
=0

El segundo resultado es inmediato de la definicion de m . 


Lema 5.7 Para todo m 0 se satisfacen las siguientes relaciones
rra
i) dm+1 A dm .
ii) rm+1 dm , rm+1 dm1 .
iii) rm+1 rm .
Demostracion. Los puntos i) y ii) ya se han probado. Para probar iii) basta comprobar
que
r> > > > > >
m+1 rm = rm rm m dm Arm = rm rm m dm Adm + m m dm Adm1
| {z }
=0
= r>
m rm m d>
m Adm .
do
El resultado es ahora una consecuencia del Lema 5.6. 
Lema 5.8 Para todo m 0
r> rm+1
m+1 := m+1
>
.
rm rm
Demostracion. Como
1
Adm = (rm+1 rm ),
m
se tiene
r>
m+1 Adm 1 r>
m+1 (rm+1 rm ) 1 r>
m+1 rm+1 r>
m+1 rm+1
m+1 = = = =
r
>
dm Adm m >
dm Adm >
m dm Adm r>
m rm

donde hemos utilizado que rm+1 rm , y en el ultimo paso, la expresion alternativa de


m . 
Los Lemas 5.6 y 5.8 dan expresiones mas simples de los parametros m y m . De hecho
mas economicas, dado que r>m rm es conocido del paso anterior y por tanto no es preciso
calcularlo de nuevo. En total dos productos escalares por iteracion.

95
5.2 Metodos iterativos para sistemas lineales LECCION II

Ejercicio 5.15 Modifica el algoritmo del Gradiente Conjugado con las nuevas expresiones
de m y m . Observa que podemos evitar en esta version un producto escalar por iteracion.

El resultado sorprendente, y que descubre parte de las buenas propiedades del Gradien-
te Conjugado, es que estas propiedades de ortogonalidad se extienden a todo el conjunto
de residuos y direcciones generados en los pasos anteriores.
Bo
Lema 5.9 Para todo m n
i) dm A d` , ` m 1;
ii) rm+1 d` , ` m;
iii) rm+1 r` , ` m.

La tercera propiedad implica en particular la convergencia del Gradiente Conjugado en


aritmetica exacta en a lo sumo n pasos dado que no puede haber n+1 vectores ortogonales
en Rn y por tanto rn+1 = 0. Sin embargo, en aplicaciones practicas puede requerir mas
de n iteraciones por los errores introducidos por la precision de la maquina.
rra
Ejercicio 5.16 Modifica el programa gradiente para implementar en una funcion de nom-
bre 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);
>> semilogy(r)
y hemos desplegado en la Figura 5.4 las normas de los residuos en cada paso. Como se

4
Residuo
10
do
3
10

2
10

1
10

0
10

1
10

2
10
0 2 4 6 8 10 12 14
r
Iteraciones

Figura 5.4: Historial del residuo para el metodo del Gradiente Conjugado

puede comprobar la convergencia es mas rapida y hemos reducido notablemente el molesto


comportamiento oscilatorio del residuo.

96
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

Analisis del metodo

En esta seccion probaremos el Lema 5.9. El lector mas interesado en la implementacion


del metodo puede saltar esta seccion sin mayor problema. Animamos, no obstante, a
su lectura pues ilustra un conjunto de tecnicas habituales en otras familias de metodos
iterativos. Ademas sirve de ejemplo que demostrar el buen funcionamiento de un esquema
Bo
numerico mas elaborado, generalmente obtenido mediante modificaciones intuitivas de
algoritmos mas simples, puede requerir un analisis nada trivial. Tampoco es extrana la
situacion contraria: un metodo puede fallar por razones no inmediatamente comprensibles.
En la demostracion juega un papel muy importante el subespacio

Km (A, r0 ) := Rhr0 , Ar0 , . . . , Am r0 i

esto es, el subespacio formado por todas las combinaciones lineales

0 r0 + 1 Ar1 + . . . + m Am r0 , i R.

Estos subespacios reciben el nombre de subespacios de Krylov y son clave en multitud


rra
de metodos numericos para la resolucion de sistemas lineales. Antes de proseguir haremos
unos simples comentarios:

1. El subespacio tiene a lo sumo dimension m + 1.

2. Si q Km (A, r0 ), entonces Aq Km+1 (A, r0 ). Es decir, AKm (A, r0 ) Km+1 (A, r0 ).

3. Si Km (A, r0 ) = Km+1 (A, r0 ), entonces Km (A, r0 ) = Km+1 (A, r0 ) = Km+2 (A, r0 ) = ...

4. Es facil comprobar que rm , dm Km (A, r0 ).


do
La demostracion del Lema 5.9 se llevara a cabo por induccion sobre m. Para m = 0 es
un simple ejercicio de comprobacion (en este caso r0 = d0 y por tanto ii) y iii) coinciden).
Supongamos pues que el resultado esta probado para m. Concretamente, supongamos que
para m

i) dm A d` , ` m 1 y {d0 , d1 , . . . , dm } es una base de Km (A, r0 ).

ii) rm+1 d` , ` m.

iii) rm+1 r` , ` m y {r0 , r1 , . . . , rm+1 } es una base ortogonal de Km+1 (A, r0 ).


r
Veamos que los puntos i)iii) se satisfacen entonces para m + 1.

i) dm+1 A d` , ` m:

97
5.2 Metodos iterativos para sistemas lineales LECCION II

Este resultado esta probado ya para ` = m. Para ` m 1, utilizamos que

dm+1 = rm+1 + m+1 dm .

Por tanto, basta probar que

rm+1 A r` , dm A d` .
Bo
El segundo es ya conocido (hipotesis de induccion). Por otro lado

rm+1 A r` rm+1 Ar` .

Como Ar` K`+1 (A, r0 ) y una base de este subespacio es {r0 , r1 , . . . , r`+1 } ,
concluimos que
Ar` = 0 r0 + 1 r1 + . . . + `+1 r`+1
con j R adecuados. El resultado se sigue ahora de iii) puesto que rm+1 rk ,
para todo k m.
Por ultimo si dm+1 6= 0 entonces {d0 , . . . , dm+1 } es una base de Km+1 (A, r0 ) por
ser Aortogonales y por tanto linealmente independientes. 
rra
ii) rm+2 d` , ` m + 1

Para ` = m, m + 1 es cierto por construccion (vease Lema 5.7). Para el resto de


valores ` m 1, utilizamos

rm+2 = rm+1 m+1 Adm+1 .

Por induccion, rm+1 d` , mientras que para el otro termino observamos que

(Adm+1 ) d` dm+1 A d` ,
do
y esto es lo que acabamos de probar en el apartado anterior. 

iii) rm+2 r` , ` m + 1.

Tomemos ` m. Entonces

rm+2 r` (rm+1 m+1 Adm+1 ) r` (Adm+1 ) r`


(dm+1 ) A r` .

donde hemos aplicado la hipotesis de induccion en el segundo paso. Ahora, como


r` K` (A, r0 ), por el punto i) podemos escribir
r
r` = 0 d0 + 1 d1 + . . . + ` d` . (5.6)

El resultado se sigue de la propiedad i) ya que dm+1 A dk para k m. Final-


mente, si rm+1 6= 0 entonces {r0 , . . . , rm+1 } es una base de Km+1 (A, r0 ) por ser
ortogonales. 

98
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

Un examen mas cuidadoso de la demostracion anterior comprueba que esta falla en el


caso de que en un paso rm+1 o dm+1 sean nulos. En cualquiera de estos casos

Km (A, r0 ) = Km+1 (A, r0 ).

Ahora bien esto sucede si y solo si ha habido convergencia en el paso m (si dm+1 = 0 y
Bo
por tanto rm = 0) o en el paso m + 1 (si rm+1 = 0). Esto es, si la direccion de descenso es
la nula simplemente es porque ya hemos alcanzado la solucion, y viceversa, si el residuo
es nulo, la direccion de descenso para la siguiente iteracion es la nula.

Notas finales
El Gradiente Conjugado fue propuesto por Magnus R. Hestenes y Eduard Stiefel en
1952. Lo mas curioso es que el metodo fue desarrollado de forma independiente por estos
dos autores. Segun cuenta Marvin Stein13 , un estudiante postdoctoral en aquellos anos que
programo el algoritmo por primera vez para Hestenes, Stiefel coincidio con Hestenes en
una conferencia en UCLA (University of California, Los Angeles) y le comento a grandes
trazos el metodo en el que estaba trabajando. Stiefel estaba impresionado sobre las buenas
rra
propiedades que mostraba este metodo hasta que revisando las tarjetas perforadas que
contenan el programa implementado cayo en la cuenta de que se trataba del mismo
metodo sobre el que independiente el estaba trabajando14 .
Hemos visto que el metodo del Gradiente Conjugado es un metodo directo, en tanto
en cuanto da la solucion en un numero finito de pasos, concretamente n, el numero de filas
de la matriz. Sin embargo, se programa como un metodo iterativo, de forma que se busca
la convergencia en muchas menos iteraciones. En cada iteracion se tiene la estimacion
p !m
(A) 1
kem+1 kA 2 p ke0 kA
(A) + 1

donde de nuevo em := xm x es el error en el paso mesimo y e0 el error inicial.


do
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 tiene
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 volumenes finitos, suelen ser, ademas de matrices sparse, mal condicionadas,
por lo que el metodo del Gradiente Conjugado requiere de bastantes iteraciones15 .
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
r
resolucion de sistemas de ecuaciones lineales que iban surgiendo a su alrededor. Esta
13
Anecdota recogida por Yousef Saada y Henk A. van der Vorstb en Iterative solution of linear systems
in the 20th century publicado en Journal of Computational and Applied Mathematics en el ano 2000.
14
Esta coincidencia 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 flotando en el ambiente a la espera de que
alguien diera el paso final de plasmarlas.
15
O(n1/3 ) en problemas en 3D, O(n1/2 ) en 2D es un comportamiento tpico.

99
5.2 Metodos iterativos para sistemas lineales LECCION II

situacion se prolongo durante casi 20 anos hasta que las ideas del precondicionamien-
to cambiaron radicalmente esta situacion y encumbraron al Gradiente Conjugado a su
posicion actual16 .
El precondicionamiento consiste, a grandes rasgos, en cambiar el sistema por uno
equivalente17
Bo
1 > 1
Ax = b, L
| AL {z } y = L
| {z b}, x = L> y
B c

y aplicar el metodo al sistema By = c. Para su implementacion basta con conocer simple-


mente la matriz producto M = LL> que recibe el nombre de precondicionador de A. En
general, la matriz L1 AL> no se construye, porque el producto por el precondicionador
hace que se pierdan algunas de las buenas propiedades de la matriz original. Ahora bien,
y he aqu la ventaja del metodo, solo necesitamos calcular productos por M 1 , que
se reducen sistemas lineales con M como matriz de coeficientes. Obviamente, y de forma
similar a como procedamos con la descomposicion de Cholesky, esto equivale resolver dos
sistemas lineales con L y L> . La buena noticia es que es posible construir matrices para
las que estos sistemas son faciles de resolver. Por ejemplo, L puede ser sparse y triangular.
rra
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.
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, etc. Algunos de estos metodos requieren
que la matriz sea simetrica y otros son validos para matrices arbitrarias.
Un precondicionador universal, es valido en muchos casos, es la descomposicion de
Cholesky incompleta. Va mas alla de los contenidos de este curso describir detalladamente
en que consiste pero podemos dar una idea. Se trata de, 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 algun sentido. Por tanto, L1 AL> In y su condicionamiento
do
es moderado, o al menos mejor que el de A. En Matlab se encuentra implementada en
el comando cholinc. El siguiente ejercicio ilustra el efecto del precondicionamiento en la
convergencia del Gradiente Conjugado y con ello trata de convencer de la necesidad de
utilizarlo en la resolucion de (muy) grandes sistemas de ecuaciones.

Ejercicio 5.17 Las siguientes instrucciones


>> [p,e,t]=initmesh(lshapeg,Hmax,0.05);
>> [a,b]=assempde(lshapeb,p,e,t,1,0,1);
devuelven en a una matriz sparse simetrica definida positiva proveniente de resolver la ecuacion
r
de Poisson (una ecuacion en derivadas parciales) por el metodo de elementos finitos en un
16
La American Mathematic Society lo situo entre los diez algoritmos mas relevantes del siglo XX, junto
con, por ejemplo, la Transformada Rapida de Fourier (FFT) o el algoritmo QR para el calculo de valores
y vectores propios.
17
Utilizamos la notacion L> = (L1 )> , es decir invertir y trasponer (o equivalentemente, trasponer e
invertir).

100
LECCION II Captulo 5. Matrices sparse en Matematicas. Metodos iterativos

0 Metodo del gradiente


10
sin precondicionar
precondicionado
1
10
Bo
2
10

3
10

4
10
Residuo
5
10

6
10

7
10

8
10
0 50 100 150 200 250
Iteraciones
rra
Figura 5.5: Efecto del en el Gradiente Conjugado.

dominio en forma de L. La matriz tiene aproximadamente 2100 filas con 14500 elementos no
nulos18 .
Con el comando spy se puede ver la forma de a, su tamano y el numero 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 107 y un numero maximo de 100 iteraciones.
En relres se recoge el residuo relativo de la solucion calculada (kb Axk/kbk), en resvec
do
un historial del residuo en cada paso y en flag una variable que informa sobre que ha sucedido
en la aplicacion del metodo. As flag==1 indica que se ha alcanzado el numero maximo de
iteraciones sin convergencia, mientras que si flag==0 entonces ha habido convergencia. Para
ver el historial de la convergencia del metodo se puede ejecutar
>> semilogy(resvec);
Observa que es necesario o aumentar el numero de iteraciones maximas o disminuir la tolerancia
para obtener convergencia.
A continuacion vamos a utilizar un precondicionador muy sencillo basado en la descompo-
sicion de Cholesky incompleta. Teclea
r
>> R=cholinc(a,0);
De nuevo, con los comandos habituales puedes ver tanto la forma como el numero de entradas
no nulas de R.
Modificando las instrucciones anteriores con
18
Por cierto, el logo de Matlab es la solucion de un problema de este tipo.

101
5.2 Metodos iterativos para sistemas lineales LECCION II

>>[x2,flag2, relres2,iter2,resvec2] = pcg(a,b,[],100,R,R);

estas aplicando el metodo del Gradiente Conjugado precondicionado con R> R. Disminuye el
numero de iteraciones? (ver iter2). Y el tiempo de calculo?. Puedes ser ahora mas exigente
con la tolerancia?.
Bo
Ejercicio 5.18 Con la orden helpwin lee la ayuda que proporciona Matlab para pcg. Que otros
metodos iterativos estan implementados?. Consulta tambien la ayuda de cholinc y luinc.
rra
do
r
102
Bo
Leccion III
rra
Funciones como argumento. Recursividad
Formulas de cuadratura. FFT
do
r
103
Introduccion
Bo
Hobbes clearly proves that every creature
Lives in a state of war by nature;
So naturalists observe a flea
Has smaller fleas that on him prey,
And these have smaller still to biteem,
And so proceed ad infinitum.

Swift, Poetry: a Rhapsody


rra
En esta leccion abordaremos dos nuevos aspectos de Matlab: el envo de funciones
como argumentos de otras funciones y la recursividad, esto es, la habilidad de que las
funciones se llamen a s mismas. Ademas mostraremos una forma alternativa de definir
funciones en la ventana de comandos.
En la segunda parte hablaremos de las reglas de cuadratura clasicas para la aproxi-
macion de integrales y veremos una implementacion sencilla de un metodo de integracion
adaptativa. Finalizaremos con la transformada discreta de Fourier, y su calculo mediante
la transformada rapida de Fourier (FFT). La implementacion de estos algoritmos ser-
vira de ilustracion de las estrategias de recursividad, que sirven para obtener un codigo
simple y legible.
do
r
105
Captulo 6
Bo
Matlab: Funciones como argumentos.
Recursividad

6.1. Funciones inline


En la seccion 3.2 de la Leccion I mostramos la definicion de funciones mediante ficheros
rra
de texto (con extension *.m). Existe una forma alternativa de introducir funciones en
Matlab que puede utilizarse directamente en la lnea de comandos o en el codigo de una
funcion. Por ejemplo,

>> f=inline(exp(-x)*sin(x),x);

define la funcion f (x) = ex sen(x). Para evaluar se procede igual

>> f(2)

ans =
do
0.1231

A efectos practicos, inline es equivalente a editar una funcion con nombre f y a escribir
el correspondiente codigo. La definicion queda en memoria pero una vez cerrada la sesion
de Matlab (esto es, al salir del programa) la funcion se pierde. Esta es pues una importante
desventaja frente la funciones basada en m-files1 . Sin embargo puede resultar util para
tareas sencillas tanto en el modo comando como en el codigo de una subrutina.
Nada impide definir funciones con mas argumentos,

>> g=inline(x*cos(y)-y*cos(x),x,y);
r
Los ultimos argumentos del comando inline definen las variables de la funcion. Si no se
especifican, Matlab trata de reconocer cuales son las variables y las ordena alfabeticamente:
1
En el menu, seleccionando File Save workspace as se pueden grabar las variables y funciones
utilizadas en la sesion actual de Matlab. Otra posibilidad es utilizar la orden save indicando que queremos
grabar f . En cualquier caso, ambas opciones no son muy naturales.

107
6.1 Funciones inline LECCION III

>> g=inline(x^2*cos(y)-y*cos(x)*z);
>> g

g =

Inline function:
Bo
g(x,y,z) = x^2*cos(y)-y*cos(x)*z

De todas formas, expresar todas las variables explcitamente puede aclarar y facilitar la
lectura, ademas de especificar el orden de las variables en la definicion de la funcion:

>> f=inline(x*cos(k*x))

f =

Inline function:
f(k,x) = x*cos(k*x)
rra
>> f=inline(x*cos(k*x),x,k)

f =

Inline function:
f(x,k) = x*cos(k*x)

Las funciones anteriores no estan vectorizadas, es decir, al aplicarlas sobre un vector o


matriz no actuan elemento a elemento. Para ello, debera escribirse

>> g = inline(x.^2.*cos(y)-y.*cos(x).*z);
>> g([0 pi 0],[pi 0 0], [0 0 pi]) % funcion vectorizada
do
ans =

0 9.8696 0

Otra forma, mas sencilla, es introducir la funcion de la forma habitual y pedir luego a
Matlab que la prepare para su aplicacion a vectores. El comando dedicado a esta tarea es
vectorize:

>> g = inline(x^2*cos(y)-y*cos(x)*z) % funcion sin vectorizar

g =
r
Inline function:
g(x,y,z) = x^2*cos(y)-y*cos(x)*z

>> g= vectorize(g)

108
LECCION III Captulo 6. Matlab: Funciones como argumentos. Recursividad

g =

Inline function:
g(x,y,z) = x.^2.*cos(y)-y.*cos(x).*z
Observa que tras la aplicacion de este comando, Matlab redefine la funcion anadiendo .
Bo
en los sitios adecuados.

6.2. Funciones como argumentos


Es frecuente que en programacion mas avanzada se requiera que las funciones trabajen
sobre funciones. Por ejemplo, podemos plantearnos implementar una funcion que realice
la siguiente tarea
dada una funcion de una variable y dos valores dibujar la funcion entre
esos valores
En este caso, uno de los argumentos es la funcion a dibujar. Veamos como se ha
implementado
rra
01 % MIPLOT
02 %
03 % MIPLOT(F,A,B) Dibuja la funcion F entre A y B
04 % MIPLOT(F,A,B,N) Toma N puntos entre A y B
05 %
06
07 function miplot(f,a,b,varargin)
08
09 if nargin<3
10 disp(argumentos insuficientes)
11 end
do
12
13 if nargin>3
14 n=varargin{1};
15 else
16 n=200;
17 end
18
19 x=linspace(a,b,n); % vector con n puntos entre a y b
20 y=feval(f,x); % f debe estar vectorizada
21 plot(x,y)
22 return
r
En la lnea 07, f recoge la funcion argumento, mientras que en 20 se procede a evaluar
esta mediante
feval
Para enviar la funcion existen dos posibilidades:

109
6.2 Funciones como argumentos LECCION III

Si enviamos una funcion inline, basta con insertar su nombre

>> fun=vectorize(inline(exp(-x)*cos(4*x)));
>> miplot(fun,0,2*pi,200)

Si la funcion es propia de Matlab o esta implementada en un fichero m-file en la


Bo
carpeta de trabajo (o en alguna accesible), podemos
utilizar @2
>> miplot(@sin,0,2*pi,200)
indicar el nombre de la funcion entre comillas
>> miplot(sin,0,2*pi,200)

Nota. La funcion plot dibuja el vector y versus x. Concretamente, por defecto construye
el polgono con vertices(x(i),y(i)). Si se toma un numero suficiente de puntos esto basta
para obtener una buena grafica. Este comando es una de las salidas graficas mas simples de
Matlab y admite una amplia variedad de argumentos opcionales que controlan el aspecto
rra
final del dibujo. En una leccion posterior (Leccion V) veremos este comando y otros
relacionados con las salidas graficas. 

Ejercicio 6.1 Modificar el programa miplot para que en caso de no recibir los argumentos
a y b los pida por pantalla.
(Ayuda. La orden input lee datos por pantalla tras mostrar un mensaje. Necesitaras que ahora a
y b pasen a ser argumentos opcionales.)

Ejercicio 6.2 Lee la ayuda de Matlab sobre plot. Ensaya diferentes variantes, observa como
se puede cambiar de forma sencilla tanto la forma de la grafica (lnea continua, lnea a trozos,
raya-punto, solo puntos,...), el color,...
do
6.2.1. Recursividad
Un aspecto ya habitual en muchos lenguajes de programacion es la recursividad, es
decir, la habilidad de que una funcion se llame a s misma. Es habitual su utilizacion
cuando se programan estrategias de tipo divide y venceras, que consiste, a grandes trazos,
en dividir un problema en problemas iguales pero de menores dimensiones.
Quizas el ejemplo mas sencillo (y clasico) se basa en la funcion factorial.

n! = n (n 1) 1.

De una manera simple, podemos definir de forma recursiva


r

n (n 1)!, si n > 0,
n! =
1, si n = 0.
Su implementacion en Matlab es ahora tan sencilla como sigue
2
Matlab recomienda esta forma. El operador @ accede al handle de la funcion que es la referencia que
tiene Matlab de la funcion. Para mayor informacion, ver helpwin function handle.

110
LECCION III Captulo 6. Matlab: Funciones como argumentos. Recursividad

01 % FACT
02 %
03 % FACT(N) devuelve n!
04 %
05
06 function f=fact(n)
Bo
07
08 if (n<0)
09 disp(error. Argumento inapropiado);
10 f=[]; % devolvemos el vacio
11 elseif (n==0)
12 f=1;
13 else
14 f=fact(n-1)*n; % llamada a fact con n-1
15 end
16 return

Obviamente, esta no es la forma mas apropiada de programar la funcion factorial


rra
que en Matlab se encuentra implementada en una funcion con el mismo nombre3 . Es
mas, abusar de este tipo de programacion suele generar codigo poco eficiente. Ademas el
control que debe hace el ordenador de las sucesivas llamadas puede dar lugar a un costo
en memoria elevado. Sin embargo es cierto que el codigo resultante suele ser bastante mas
simple.
do
r
3
Tienes de hecho acceso al codigo, basta con ejecutar edit factorial.

111
Captulo 7
Bo
Formulas de cuadratura.
Transformada rapida de Fourier

7.1. Formulas de cuadratura


Un problema ya clasico es la aproximacion de una integral
rra
Z b
f (s) ds
a

cuyo calculo no se puede llevar a cabo por medios analticos o bien porque conlleva un
costo elevado. Este tipo de problemas se ha planteado desde la antiguedad, con algunas
referencias que se remontan a las Matematicas clasicas en el calculo de areas y volumenes
de figuras curvas. Quizas este sea el origen de la denominacion de formula de cuadratura
a cualquier expresion que aproxime una integral definida.
La propia definicion de integral1 se formula actualmente en terminos del lmite de
formulas de cuadratura, concretamente formulas del rectangulo. El Analisis Numerico
trata de analizar no solo la convergencia de estas formulas y otras que se puedan plantear,
do
sino especialmente la calidad de estas aproximaciones estimando el error que comenten.
En ultima medida, el uso local de estimaciones del error permiten dilucidar que zonas
del intervalo de integracion concentran el error cometido por nuestra formula y por tanto
donde debemos concentrar nuestro esfuerzo para reducir el error cometido. Obtenemos
as un metodo adaptativo, no rgido, que reconoce las dificultades del problema y se adapta
a el.
En esta seccion esbozaremos estas ideas recurriendo siempre a casos sencillos e ideas
intuitivas y dejando la teora en el mnimo imprescindible.

7.1.1. Primeras nociones


r
Desde una optica completamente ingenua, y a la vista de la grafica de la funcion por
integrar, podemos plantear su aproximacion por una suma de areas de rectangulos que
aproximen el area total que define f (Figura 7.1)2 . A este tipo de aproximaciones se les
1
Hablamos de la integral de Rienmann.
2
Esta aproximacion esta, de hecho, detras de la definicion de la integral de Rienmann.

113
7.1 Formulas de cuadratura LECCION III

conoce como reglas del rectangulo. Queda por elegir el punto que al evaluar define la
altura de cada rectangulo. Las elecciones mas sencillas son tomar el extremo inferior de
cada subintervalo, el extremo superior o, la a priori mas logica, tomar el punto medio.
Bo
0.6

0.5

0.4

0.3

0.2

0.1

-0.1

-0.2
0 0.5 1 1.5 2 2.5

0.6 0.6
particin Particion
0.5 Regla del punto medio 0.5 Regla del trapecio
0.4 0.4
rra
0.3 0.3

0.2 0.2

0.1 0.1

0 0

-0.1 -0.1

-0.2 -0.2
0 0.5 1 1.5 2 2.5 0 0.5 1 1.5 2 2.5

Figura 7.1: Reglas de cuadratura: punto medio y trapecio

Si, por simplicidad, nos limitamos a trabajar con particiones uniformes, es decir, a
do
construir rectangulos con igual base, las formulas anteriores se pueden exponer de forma
simple: en primer lugar introducimos la malla

ba
n N, h = , xj = a + hj, xj+1/2 = a + h(j + 1/2)
n
o particion asociada. Las reglas quedan ahora de la siguiente forma
n1
X
Q1 (f, h) := h f (xj ) (Punto inferior),
j=0
n
r
X
Q2 (f, h) := h f (xj ), (Punto superior)
j=1
n1
X
Qpm (f, h) := h f (xj+1/2 ), (Punto medio)
j=0

Es difcil escapar a la sensacion de que la regla del punto medio goza de mejores

114
LECCION III Captulo 7. Formulas de cuadratura. FFT

propiedades que las que definen el resto de elecciones3 . Esta impresion es correcta, como
veremos mas adelante.
Un analisis algo mas profundo nos descubre la regla del trapecio como una mejor
manera de aproximar la integral (ver de nuevo la Figura 7.1). En este caso la integral se
aproxima como suma del area de trapecios, como su propio nombre indica. Es un simple
ejercicio comprobar que la regla obedece a la siguiente formula
Bo
h1 n1
X 1 i
Qtr (f, h) := h f (x0 ) + f (xj ) + f (xn ) , (Regla del trapecio).
2 j=1
2

Parecera evidente que esta aproximacion es mejor que la de las formulas de rectangulo
que hemos visto. Esta impresion es solo parcialmente correcta: de hecho la regla del punto
medio es ligeramente mejor que la regla del trapecio, como veremos mas adelante.
En cualquier caso, la regla del trapecio sugiere que podemos desarrollar formulas mas
complejas sobre cada subintervalo [xi , xi+1 ] para luego construir con ellas, simplemen-
te sumandolas, una formula en todo el intervalo [a, b]. Es por ello que a las reglas del
rectangulo y trapecio se les llama reglas compuestas, mientras reglas que no impli-
can subdividir el intervalo de integracion en intervalos mas pequenos se las conoce como
rra
reglas simples.

Ejercicio 7.1 Implementa en Matlab la regla del punto medio.

Solucion. Observemos primero que necesitamos cuatro argumentos de entrada:

Funcion a integrar f.

Puntos inicial y final del intervalo a,b.

Numero de divisiones del intervalo n.

Una vez ledos estos datos podemos calcular h, la distancia entre dos puntos consecu-
do
tivos, construir un vector con los puntos donde hay que evaluar f , evaluar la funcion en
esos puntos (un nuevo vector de valores), sumar el vector y multiplicar por h.
El programa podra ser as

01 % PUNTOMEDIO
02 %
03 % PUNTOMEDIO(F,A,B,N) devuelve el valor aproximado de la
04 % integral de F entre A y B con la
05 % regla del punto medio con N puntos
06 % F debe estar vectorizada
r
07
08 function s=puntomedio(f,a,b,n)
09
3
Quizas por razones de simetra. La intuicion es una arma poderosa en todas las Ciencias y en las
Matematicas en particular. Sin embargo en el Analisis Numerico puede llevar a confusiones e impresiones
erroneas. En ocasiones los metodos numericos funcionan o fallan por razones que escapan a la pura
intuicion. De todos modos, no por ello se debe desdenar, sino manejarla con algo de cuidado.

115
7.1 Formulas de cuadratura LECCION III

10 h=(b-a)/n;
11 x=linspace(a+h/2,b-h/2,n); % calculamos puntos por evaluar
12 y=feval(f,x); % evaluamos f en esos puntos
13 s=h*sum(y); % aplicamos regla


Bo
Ejercicio 7.2 Implementa en Matlab la regla del trapecio.
Ejercicio 7.3 Tomando un numero de puntos suficientemente alto y siempre que la funcion
sea regular (sea derivable un numero suficiente de veces) puedes tomar ese valor como el
resultado exacto de la integral. Con un ejemplo arbitrario compara los resultados de la regla
del punto medio y la regla del trapecio.

Nota. Existe una cuestion, algo tonta, sobre el parametro n. Lo habitual es tomar n de
forma que h = (b a)/n sea la distancia entre los puntos que se evaluan para construir
la regla de cuadratura. Esta eleccion hace que en la regla del punto medio la funcion se
evalue en n puntos mientras que en la regla del trapecio, se haga en n + 1 puntos. En
rra
cualquier caso, y adelantandonos a lo que sigue, el parametro relevante es precisamente
h. 

7.1.2. Reglas simples


Tanto la regla del punto medio como la del trapecio se basan en interpolar la funcion
por un polinomio de grado 0 (constante) y grado 1 (una recta) sobre cada subintervalo
e integrar dicho polinomio. Esto es, si c es el punto medio de (a, b), la regla del punto
medio consiste en reemplazar la funcion por la constante, polinomio de grado 0, que pasa
por (c, f (c)) y aproximar la integral de f por la de dicha constante:
Z b Z b
f (s)ds f (c)ds = f (c)(b a).
a a
do
Analogamente, la regla del trapecio se basa en aproximar la funcion por una recta p1 (s),
polinomio de grado 1, que pase por (a, f (a)) y (b, f (b)) y luego dar como resultado apro-
ximado de la integral la de p1 (s):
Z b Z bh
bs sa i ba
f (s)ds f (a) + f (b) ds = [f (a) + f (b)] .
a a |b a {z b a } 2
p1 (s)

El estudio del error de las formulas anteriores queda as reducido a las propiedades de
aproximacion de los polinomios de grado 0 y 1 correspondientes.
r
Proposicion 7.1 Existen 1 , 2 [a, b] tales que
Z b
1 00
f (s) ds (b a)f (c) = f (1 )(b a)3 ,
a 24
Z b
ba   1
f (s) ds f (a) + f (b) = f 00 (2 )(b a)3 .
a 2 12

116
LECCION III Captulo 7. Formulas de cuadratura. FFT

Obviamente, nada se dice sobre cuales son los puntos 1 , 2 , puesto que conocer esos
puntos en cada caso sera equivalente a conocer la integral para cualquier funcion arbitra-
ria. Es remarcable que ambas formulas son exactas para polinomios de grado 1 (porque
en tal caso f 00 = 0) y que el error que se puede esperar de la formula del punto medio es
la mitad que el de la formula del trapecio y ademas con signo opuesto4 .
Siguiendo con estas ideas, podemos avanzar un paso mas trabajando con polinomios
Bo
de grado dos. Denotando por Pn (x) los polinomios de grado n, procedemos como sigue

Construir p P2 (x) tal que (c = (a + b)/2)

p2 (a) = f (a), p2 (c) = f (c), p2 (b) = f (b).

Dar como aproximacion


Z b Z b
f (s) ds p2 (s) ds.
a a
rra
a c b

Figura 7.2: Regla de Simpson


do
En la terminologa habitual se habla de una regla de precision 2. La formula que
as obtenemos viene dada por
b
b a
Z 
f (s) ds f (a) + 4f (c) + f (b) . (7.1)
a 6

Esta regla de cuadratura recibe el nombre de regla de Simpson y es una de las mas
utilizadas en la practica. A primera vista se puede esperar que de el valor exacto de la
integral para polinomios de grado de 2, puesto que as se ha impuesto en la definicion.
r
Sin embargo tiene un grado de precision adicional fruto de la disposicion simetrica de los
puntos de evaluacion (es decir, del hecho de que c sea el punto medio de [a, b]), lo que lleva
a que la formula sea exacta para polinomios de grado 3. Esto es, la regla de Simpson
tiene precision 3:
4
Salvando el hecho de que en principio 1 6= 2 . Un analisis mas elaborado permite probar que esta
conclusion es esencialmente cierta.

117
7.1 Formulas de cuadratura LECCION III

Proposicion 7.2 Existe 3 [a, b] tal que


Z b
b a  1 (4)
f (s) ds f (a) + 4f (c) + f (b) = f (3 )(b a)5 .
a 6 2880
En general, tenemos la siguiente estrategia para construir reglas de mayor precision:
Bo
Tomar n N, h = (b a)/n, xj = a + jh con j = 0, . . . , n (n + 1 puntos).

Construir un polinomio pn Pn (x) tal que

pj (xj ) = f (xj ).

Aproximar Z b Z b
f (s) ds pn (s) ds.
a a

Las formulas as obtenidas reciben el nombre de formulas de Newton-Cotes cerradas5 . Las


formulas de Newton-Cotes abiertas se definen de forma similar pero tomando
rra
ba
xj+1/2 = a + (j + 1/2)h, j = 0, . . . , n, h= .
n
Se denominan reglas abiertas porque ni a ni b se evaluan para aproximar la integral.
Sin embargo no es conveniente recurrir a estas formulas de cuadratura porque conforme
aumenta el numero de puntos, las formulas tienden a ser mas inestables numericamente.
En lugar de ello, se utilizan formulas compuestas, como las del rectangulo o trapecio,
definidas a partir de formulas simples de pocos puntos. Volveremos a ello en proximos
apartados.

Ejercicio 7.4 (Matematico) Deducir los coeficientes de la regla de Simpson expuestos en


(7.1).
(Ayuda: Todo polinomio de grado 2 se puede escribir en la forma p2 (s) = 1 (s b)(s c) +
do
2 (s a)(s c) + 3 (s a)(s b). Cuanto valen 1 , 2 , 3 si exigimos que p2 (a) = f (a),
p2 (b) = f (b), p2 (c) = f (c)?. Integra p2 (x) y deduce la regla. Ten en cuenta que c = (a + b)/2.)

Ejercicio 7.5 Otra forma equivalente de definir y calcular las formulas de Newton-Cotes es
exigir que la formula de cuadratura integre a los polinomios de maximo grado. En el caso de
la formula de Simpson, bastara con partir de
ba
xj = a + jh, j = 0, 1, 2, con h = ,
2
definir
b
r
Z
f (s) ds 0 f (x0 ) + 1 f (x1 ) + 2 f (x2 ).
a

y exigir que la formula sea exacta para f = 1, s, s2 . Calcula as los pesos de la formula de
Simpson.
5
El hecho de que Isaac Newton aparezca ligado a estas ideas da una pista sobre la fecha a la que se
remontan estas tecnicas.

118
LECCION III Captulo 7. Formulas de cuadratura. FFT

Ejercicio 7.6 Siguiendo las ideas del ejercicio anterior, podemos deducir las formulas con
mas puntos. Para facilitar el estudio realizamos el cambio de variables
Z b
ba n
Z
f (s) ds = f (a + ht) dt
a n 0
Bo
Se introduce a continuacion la regla de cuadratura en [0, n]
Z n  
g(t) dt n 0 g(0) + 1 g(1) + . . . + n g(n) .
0

Los pesos se determinan sin mas que exigir que sea exacta para polinomios6 , de grado n en t.
Llegamos por tanto a las condiciones
Z n
g(t) dt = n(0 g(0) + 1 g(1) + . . . + n g(n)), g {1, t, . . . , tn }.
0

Esta forma directa de abordar el problema nos conduce al sistema



rra
1

1 1 1 1 0
0 1 2 n n/2
1
2

n /3

0 1 4 n2 2 =

.

. .
. . . . . . . . . . . . . . . . . ..
..

n n
0 1 2 n n nn /(n + 1)

Implementa una funcion que reciba como argumento n y devuelva los pesos de la formula de
Newton-Cotes cerrada de n + 1 puntos7 .

Solucion. Recordemos en primer lugar que los vectores en Matlab se numeran a partir
de 1, lo que exige desplazar todos los ndices una unidad. Dicho esto, una implementacion
de la solucion de este ejercicio es como sigue
do
01 % PESOSNEWTONCOTES
02 %
03 % V=PESONEWTONCOTES(N) devuelve en V los pesos de la
04 % formula de Newton-Cotes cerrada
05 % de N+1 puntos.
06 %
07 % Esto es, la integral de f en [a,b] se aproxima por
08 %
09 % (b-a)*(w(1)*f(x(1))+w(2)*f(x(2))+...+w(n+1)*f(x(n+1)))
r
10 %
11 % donde x(i)=a+(i-1)*(b-a)/n i=1,...,n+1,
12
6
observa que el cambio de variable lleva polinomios de grado n a polinomios de grado n
7
La matriz del sistema recibe el nombre de Matriz de Vandermonde. Desafortunadamente es una
matriz muy mal condicionada que da problemas en su resolucion para n moderado. Ello es consecuencia
de que la base de monomios no es buena eleccion como base de los polinomios.

119
7.1 Formulas de cuadratura LECCION III

13 function w=pesosnewtoncotes(n)
14
15 r=0:n;
16 c=1; m=ones(1,n+1);
17 for i=1:n
18 m=[m; r.^i]; % construimos matriz del sistema
Bo
19 c=[c; n^(i)/(i+1)]; % construimos el termino independiente
20 end
21
22 w=m\c;
23 return


Con diferentes valores de n hemos obtenido los siguientes resultados
1 2 3 4 5 6 7 8 9 10
1/2 1/6 1/8 7/90 19/288 41/840 322/7409 248/7109 177/5551 94/3503
1/2 2/3 3/8 16/45 25/96 9/35 337/1628 578/2783 458/2607 2431/13693
rra
1/6 3/8 2/15 25/144 9/28 49/64 111/3391 27/224 410/5059
1/8 16/45 25/144 34/105 585/3382 97/262 451/2089 722/1587
7/90 25/96 9/28 585/3382 454/2835 282/4373 406/933
19/288 9/35 49/64 97/262 282/4373 783/1097
41/84 337/1628 111/3391 451/2089 406/933
429/9871 578/2783 27/224 722/1587
248/7109 458/2607 351/4331
177/5551 2284/12865
94/3503
Se puede comprobar que aparecen pesos negativos a partir de n = 8. Es decir, la formula
de cuadratura puede dar valores negativos para una funcion positiva. Esta inestabilidad se
vuelve mas acusada conforme n . De hecho es muy probable que a partir de n 10
do
la resolucion del sistema lineal de Vandermonde de resultados muy poco fiables dado el
mal condicionamiento de la matriz8 . En cuanto a los pesos, estos se pueden calcular de
forma mas estable sin mas que elegir una base adecuada de los polinomios de n.
La formula para n = 3 se suele denominar en la literatura, por razones obvias, regla
de 3/8. El grado de precision de estas reglas (es decir, el grado de los polinomios para
los que las formulas dan la integral exacta) es n o n + 1 dependiendo si n es impar o par
respectivamente.
Ejercicio 7.7 Implementa una funcion que devuelva los pesos para las formulas de Newton-
Cotes abiertas.
r
7.1.3. Retorno a las reglas compuestas
En la seccion precedente indicamos que el uso de formulas de cuadratura simple con
un numero de puntos elevados equidistribuidos no es recomendable dado que exhiben
8
Se puede atenuar este mal condicionamiento utilizando la descomposicion QR (ver Leccion IV) para
resolver el sistema lineal

120
LECCION III Captulo 7. Formulas de cuadratura. FFT

una gran inestabilidad numerica. Este hecho esta ntimamente con la inestabilidad de la
interpolacion numerica en estos nodos, tema al que volveremos mas adelante (Leccion V).
Una alternativa que proporciona mejores resultados, y que es muy sencilla de imple-
mentar, es volver a las formulas de cuadratura compuestas, dividiendo el intervalo original
en varios subintervalos y aplicar en cada uno de ellos una formula de cuadratura simple.
Por ejemplo la regla del trapecio es la formula de cuadratura compuesta obtenida al divi-
Bo
dir el intervalo de integracion en n subintervalos y aplicar en cada uno de ellos la formula
de Newton-Cotes cerrada de dos puntos:
Z b
ba
f (s) ds (f (a) + f (b)).
a 2
Deduciremos a continuacion la regla compuesta de Simpson. Tomemos en primer lugar
n subintervalos, con lo que habremos de evaluar en 2n + 1 puntos. Definiendo h = (b
a)/(2n), xi = a+ih (i = 0, . . . , 2n) aplicaremos la regla de Simpson simple sobre [x2i , x2i+2 ]
(longitud 2h). Aparecen as tres terminos diferentes:
Los puntos x0 (= a) y x2n (= b) son extremos de un unico subintervalo.
Los puntos x2j , j = 1, . . . , n 1, que son extremo superior de un subintervalo e
rra
inferior del siguiente ([x2j2 , x2j ] y [x2j , x2j+2 ]).
Los puntos x2j1 que son puntos interiores de los subintervalos ([x2j2 , x2j ]).
La formula que obtenemos es
h1 n n1
4X 2X 1 i
Qsp (f, h) := h f (x0 ) + f (x2j1 ) + f (x2j ) + f (x2n ) . (7.2)
3 3 j=1 3 j=1 3

La siguiente proposicion informa sobre el comportamiento de las tres formulas com-


puestas hasta ahora
Proposicion 7.3 Existen 1 , 2 , 3 [a, b] tales que
Z b
h2 00
do
Qpm (f, h) f (s) ds = f (1 )(b a),
a 24
Z b
h2
Qtr (f, h) f (s) ds = f 00 (2 )(b a),
a 12
Z b
h4 (4)
Qsp (f, h) f (s) ds = f (3 )(b a).
a 180
A la luz de este resultado se concluye que el error se divide por cuatro cuando h se
divide por dos para las formulas del punto medio y trapecio, y por dieciseis en el caso de la
formula de Simpson. Se dice entonces que las formulas tienen orden de convergencia
2 en los dos primeros casos y orden 4 para la regla de Simpson.
r
Esencialmente, el resultado anterior informa de como mejora la aproximacion de la
formula cuando aumentamos el esfuerzo computacional. Comprobamos que hay una clara
ventaja de la regla de Simpson respecto a la regla del punto medio y del trapecio. No
obstante, se observa que es necesario que la funcion tenga derivada cuarta continua para
alcanzar orden 4. En caso de que la funcion no sea tan regular, es esperable que la regla
de Simpson pierda orden.

121
7.1 Formulas de cuadratura LECCION III

Ejercicio 7.8 Deducir que la formula compuesta de Simpson viene efectivamente dada por
(7.2). Programar en una funcion la regla de Simpson compuesta, siguiendo las directrices
marcadas en el Ejercicio 7.1.

Ejercicio 7.9 Se trata de observar experimentalmente el orden de convergencia de las reglas


del punto medio, trapecio y de Simpson, programadas en los ejercicios 7.1, 7.2 y 7.8 mediante
Bo
una batera de experimentos.
Para ello, definimos una funcion mediante inline:

>> f=inline(x*cos(x)); f=vectorize(f);

La integral exacta se puede calcular tomando un numero muy elevado de puntos (por ejem-
plo n = 10000) con la regla de Simpson, que es la de mayor precision. Mide el error pa-
ra diferentes valores de n y observa como decrece el error. Una buena eleccion podra ser
n = 10, 20, 40, 80, ..., esto es, multiplicando por 2 el numero de puntos. Deberas observar que
para funciones suaves el error se divide por 4 o por 16, segun la regla que se aplique.
Testa los programas con los siguientes ejemplos
rra
i) f1 (x) = x cos(x) en [0, ]

ii) f2 (x) = xex en [0, 3]

iii) f3 (x) = x log(x) en [1, 2] y en [0, 2]9

iv) f4 (x) = cos2 (x) en [0, /2], en [0, ] y en [0, 2].

Un fichero script te puede venir bien para este ejercicio. Que observas con las reglas del
trapecio y del punto medio en el ultimo caso?.
do
Nota. En esta serie de experimentos se observa que la regla de Simpson no alcanza el
orden que la teora predice en el ejemplo iii) sobre el intervalo [0, 2]. Ello es debido a que
las derivadas de la funcion tienen una singularidad en el origen.
Menos simple de explicar
R 2 es la superconvergencia (convergencia mejor de lo esperado)
2
que se observa para 0 cos (x) (punto iv)).Esto es consecuencia de que el integrando,
ademas de regular, es periodico y se esta integrando en un multiplo de su intervalo
de periodicidad. En una seccion posterior daremos una explicacion a este fenomeno tan
sorprendente. 
r
Ejercicio 7.10 Implementa la regla compuesta de 3/8, la siguiente a la regla de Simpson, que
apareca en el Ejercicio 7.6. Compara los resultados con la regla de Simpson. Que observas?
9
En este caso, evaluar en 0 es una singularidad de tipo 0 . En realidad el lmite cuando x 0 es
cero, que se puede tomar como valor de f (0). Una forma de evitar este problema es aplicar la formula en
[, 2] con  << 1, por ejemplo,  = 1016 . Esta breve discrepancia en el extremo de integracion no afecta
al resultado.

122
LECCION III Captulo 7. Formulas de cuadratura. FFT

7.1.4. Reglas gaussianas


En el estudio de las formulas de Newton-Cotes vimos que los pesos estaban escogidos
de manera que la formula tuviese grado maximo de precision aunque la eleccion de los
nodos, es decir, de los puntos en los que se evalua la funcion, estaba fijada a priori.
Podemos plantearnos ahora hacer de la posicion de los nodos una variable mas del
Bo
problema. Para ello, y con objeto de simplificar el analisis, nos situamos en el intervalo
[1, 1] y buscamos la formula de mayor precision de dos puntos:

1 , 2 , 1 , 2 R
Z 1
1 p(1 ) + 2 p(2 ) = p(s) ds, p {1, s, s2 , s3 }
1

Es decir, tenemos cuatro incognitas, 1 , 2 (los nodos de la formula) y 1 , 2 (los pesos),


y exigimos que la formula integre de forma exacta a polinomios de grado 3. En principio
el problema esta bien planteado10 .
Es un ejercicio ilustrativo resolver el sistema no lineal

1 + 2 = 2,
rra




1 1 + 2 2 = 0,



1 12 + 2 22 = 23 ,


1 13 + 2 23 = 0.

La solucion a dicho sistema es



3 3
1 = 2 = 1, 1 = , 2 = .
3 3
En resumen, una eleccion de los nodos nada obvia define una regla de dos puntos
con mejores propiedades de convergencia que, por ejemplo, la regla del trapecio11 .
do
Podemos proceder de la misma forma y dada una regla de cuadratura de n nodos
exigir que esta integre de forma exacta a polinomios de grado 2n 1. Dada la dificultad
del sistema no lineal resultante, patente ya con n = 2, se deduce que el problema debe
ser atacado desde un punto de vista muy diferente.
Existe una teora ya clasica que demuestra que
existe una unica regla de cuadratura que cumpla esas condiciones;
los pesos i son siempre positivos.
El segundo punto es importante, pues asegura que los pesos no puedan crecer sin
r
control dado que al ser positivos y al integrar de forma exacta a las constantes, 1 + . . . +
n = 2, situacion que no se daba en las formulas de Newton-Cotes.
10
Tenemos cuatro ecuaciones con cuatro incognitas. Sin embargo el sistema es no lineal luego la teora
clasica de sistemas lineales no es aplicable. Podramos tener cuatro soluciones, siete soluciones, infinitas
soluciones o ninguna solucion...
11
Este resultado le resulto ya muy chocante a Carl Friedrich Gauss, que fue el primero en notar que
una distribucion nada logica de los nodos defina una formula de cuadratura de mayor grado de precision.

123
7.1 Formulas de cuadratura LECCION III

La teora va mas alla puesto que es constructiva: da una forma de calcular la formula
(nodos y pesos) mucho mas eficiente. En concreto, los nodos de la formula de cuadratura
son las races de una familia de polinomios, los polinomios de Legendre, que se encuentra
tabulada en multitud de textos cientficos. Los pesos i se pueden calcular a continuacion
resolviendo un simple sistema lineal. En la Tabla 7.1 se pueden ver los coeficientes de
las primeras reglas gaussianas. Observa que la disposicion simetrica de los nodos en el
Bo
intervalo [1, 1] y de los pesos asociados.

n i i
n=1
0 2
n=2
3/3 1
3/3 1
n=3
0.774596669 0.555555556
0.0 0.888888889
rra
0.774596669 0.555555556
n=4
0.861136312 0.347854845
0.339981044 0.652145155
0.339981044 0.652145155
0.861136312 0.34785484
n=5
0.906179846 0.236926885
0.538469310 0.478628670
0.0 0.568888889
0.538469310 0.478628670
0.906179846 0.236926885
do
Cuadro 7.1: Primeras formulas gaussianas

Ejercicio 7.11 (Reglas gaussianas en un intervalo arbitrario) Las formulas gaus-


sianas se dan en el intervalo de referencia [1, 1] por comodidad. Como se aplicaran en un
intervalo [a, b]?.

7.1.5. Extrapolacion de Richardson


r
La extrapolacion de Richardson es una estrategia que permite acelerar la velocidad de
convergencia de un metodo numerico bajo determinadas condiciones.
Nos centraremos en esta seccion en la descripcion de esta tecnica aplicada a la formula
del trapecio. El metodo resultante se conoce como metodo de Romberg.

124
LECCION III Captulo 7. Formulas de cuadratura. FFT

Proposicion 7.4 Existe una sucesion de numeros (b2j )j tales que para f suficientemente
regular
Z b m
X h i
2j (2j1) (2j1)
f (s) ds Qtr (f, h) = b2j h f (b) f (a) + O(h2m+2 ).
a j=1
Bo
El smbolo de Landau O(hM ) indica una cantidad que es menor que una constante
multiplicada por hM y con dicha constante independiente de h. En otras palabras, es
equivalente a escribir
Z b m
X h i
2j (2j1) (2j1)

f (s) ds Qtr (f, h) b2j h f (b) f (a) Cm h2m+2
a j=1

donde Cm depende de m y de la derivada m + 1 de f pero no de h.


Denotando por
Z b h i
I= f (s) ds, 0 (h) = Qtr (f, h) c2j := b2j f (2j1) (b) f (2j1) (a)
a
rra
se observa que para h y h/2 se dispone de los desarrollos
m
X
I = 0 (h) + c2j h2j + O(h2m+2 ),
j=1
m
X
I = 0 (h/2) + 1
c h2j
4j 2j
+ O(h2m+2 ).
j=1

Multiplicando la segunda ecuacion por 4, restando la primera y despejando I obtenemos


m
40 (h/2) 0 (h) X 1 1
1 c2j h2j + O(h2m+2 ).

I= + 3 4j1
| 3
{z } j=1 | {z }
(1)
c2j
do
1 (h)

(1)
En particular observamos que c2 = 0, esto es hemos cancelado el primer termino del
desarrollo, por lo que
m
X (1)
I = 1 (h) + c2j h2j + O(h2m+2 ). (7.3)
j=2

Como consecuencia

I 1 (h) = O(h4 ) |I 1 (h)| C4 h4 .




Por tanto 1 (h) es una aproximacion de la integral con orden 4. Es mas, 1 (h) cumple de
r
nuevo un resultado similar al de la proposicion anterior (ver (7.3)), por lo que podemos
repetir el mismo argumento y definir12
161 (h/2) 1 (h)
2 (h) = .
15
12
1 (h/2) se ha obtenido igual partiendo de 0 (h/2) y 0 (h/4)

125
7.1 Formulas de cuadratura LECCION III

Paso 0 Paso 1 Paso 2 Paso 3

0 (h) / 1 (h) / 2 (h) / 3 (h)


c nn n6 nn n6 nnn6
o nnn nnn nnn
nnnn nnnn nnnn
Bo
n nnn nnn nnn
v 0 (h/2) / 1 (h/2) / 2 (h/2)
e nn6 nn6
r nn nnn nn nnn
nn nn
g nnn nnn
e / 1 (h/4)
n 0 (h/4)
n n 6
c n nnn
i nnn
a  nnn
0 (h/8)

Figura 7.3: Diagrama del metodo de Romberg

Es facil ver que nuevamente I 2 (h) tiene un desarrollo del error que comienza con
rra
h6 puesto que este combinacion ha cancelado el primer termino que apareca con 1 (h).
Como consecuencia, 2 (h) da una aproximacion de la integral de orden 6. En general se
pueden definir
22j j (h/2) j (h)
j+1 (h) = .
22j 1
Cada una ellas satisfaciendo
|I j (h)| Cj h2j+2 ,
donde Cj es independiente de h pero de j o de f . Observa que la convergencia solo se
asegura para j fijo y h 0.
Su ventaja mas palpable es que unicamente requiere aproximaciones de la integral
obtenidas con una formula de cuadratura sencilla. Combinando resultados para valores
do
distintos de h se obtiene una mejora sustancial en la aproximacion de la integral. Aqu nos
hemos centrado en la formula del trapecio, pero se pueden adaptar a la formula del punto
medio o a la de Simpson. Es mas, estrategias de este tipo se aplican en diversa areas del
Analisis Numerico. Para ello, es esencial contar con un resultado del tipo enunciado en la
Proposicion 7.4. La extrapolacion sigue el sencillo diagrama de la Figura 7.3

Nota. Los resultados expuestos en esta seccion, y en concreto la Proposicion 7.4, expli-
can por que la formula del trapecio converge mejor de lo esperado para funciones regulares
y periodicas cuando se integra en un intervalo de periodicidad. Observa que en este caso
f (2j1) (b) = f (2j1) (a) y por tanto no hay terminos en hm para ningun m. Esto es, el
r
orden de convergencia es m para cualquier m, o lo que es lo mismo
Z b
f (s)ds Qtr (f, h) Cm hm , m N


a

donde Cm que depende de la derivada m-esima de f (y por tanto de m) pero no de h. Con


ello se consigue una convergencia muy rapida a la integral y bastaran unos pocos puntos

126
LECCION III Captulo 7. Formulas de cuadratura. FFT

para calcular la integral con una precision muy fina.


En la terminologa habitual en Analisis Numerico se dice que el metodo tiene un orden
de convergencia superalgebraico. Es posible probar que bajo condiciones algo mas fuertes
que la existencia de todas la derivadas13
Z b
f (s)ds Q (f, h) Crn
Bo

tr
a

con r > 1 y C independiente de r y de n, con lo que el orden es de hecho exponencial. 

Ejercicio 7.12 Comprueba que si aplicas un paso de extrapolacion a la formula del trapecio
compuesta obtienes el metodo de Simpson.

Ejercicio 7.13 Implementa la extrapolacion de Richardson, segun el siguiente prototipo de


funcion

01 % RICHARDSON
02 %
03 % V= RICHARDSON(F,A,B,N,M) Aplica la formula del trapecio con
rra
04 N, 2*N,4*N,..., 2^(M-1)*N puntos
05 Construye la matriz de extrapolacion
06 V M x M donde V(:,i) es el resultado
07 de aplicar el paso i-1 de Richardson.

Ejercicio 7.14 Existe una forma mas general de definir la extrapolacion. Para ello precisamos
que las sucesivas h decrezcan de una forma proporcional

0 (h), 0 (rh), 0 (r2 h), . . . , 0 (rn h).

En el caso expuesto, r = 1/2. Como se adapta la extrapolacion para otras elecciones de


r (0, 1)?.
do
7.1.6. Integracion adaptativa
Las formulas anteriores adolecen de un importante defecto: todas asumen que el com-
portamiento de la funcion es mas o menos uniforme en todo el intervalo de integracion.
La situacion usual es que la funcion tenga zonas donde vara de forma brusca y zonas
donde su comportamiento sea considerablemente mas suave. Intuitivamente, se entiende
que las primeras zonas son las mas problematicas. El siguiente paso en cualquier algorit-
mo numerico es disenar metodos adaptativos. Estos esquemas reconocen aquellas zonas
que requieren mayor trabajo (refinar, en la terminologa habitual) y aquellas donde basta
r
unas pocas evaluaciones para obtener una aproximacion suficientemente buena.
Para abordar esta tarea debemos disponer en primer lugar de un buen estimador
del error, esto es, de un postproceso que nos de informacion sobre el error que estamos
cometiendo y que as permita dilucidar que partes del intervalo de integracion requieren
mayor esfuerzo y cuales no.
13
Concretamente que la funcion sea analtica

127
7.1 Formulas de cuadratura LECCION III
Bo
Zona regular Zona Irregular Zona regular

Figura 7.4: Integracion adaptativa

A continuacion expondremos una implementacion muy sencilla de una integracion


rra
adaptativa basada en la regla de Simpson. El estimador se basa en comparar el resultado
obtenido, en cada subintervalo, por la regla de Simpson simple, y la compuesta con dos
subintervalos.
Dado que la regla de Simpson se obtiene de la regla del trapecio utilizando un unico
paso de extrapolacion (Ejercicio 7.12), obtenemos de (7.3)
Z b
h 
(1)
f (s) ds f (a) + 4f (c) + f (b) = c2 h4 + O(h6 ) (7.4)
a |6 {z }
Q1 (f )
Z b (1)
h  c
f (s) ds f (a) + 4f (d) + 2f (c) + 4f (e) + f (b) = 2 h4 + O(h6 ) (7.5)
a |12 16
do
{z }
Q2 (f )

donde h = (b a), c es el punto medio de (a, b), d y e, los puntos medios de (a, c) y (c, b).
(1)
El termino dominante del error, para h suficientemente pequeno, es c2 h4 de forma que
Z b
(1)
f (s) ds Q1 (f ) c2j h4 .
a

A priori este termino no puede ser calculado, pero puede ser despejado de (7.4) y (7.5),
sin mas que sustraer a la primera identidad la segunda. As obtenemos
r
1
 (1) 4
Q2 (f ) Q1 (f ) 1 16 c2j h

y por tanto Z b
16 (1)
(Q2 (f ) Q1 (f )) c2j h4 f (s) ds Q1 (f ) .
15 a
| {z }
error

128
LECCION III Captulo 7. Formulas de cuadratura. FFT

La idea de nuestro esquema adaptativo es la que sigue: dado un intervalo [a, b] y una
tolerancia

Calculamos Q2 (f ) y Q1 (f ) como antes, y



16
est = (Q1 (f ) Q2 (f ))
Bo
15

Si est < el resultado se considera bueno y se devuelve Q2 (f );

Si est > se aplica el argumento anterior en los subintervalos [a, c] y en [c, b] con
una tolerancia de /2 y se devuelve como integral la que calculada en [a, c] y en [c, b]

Hay por lo tanto un proceso de subdivision de los intervalos, de manera que la unica
forma, en este estado inicial, de que un subintervalo no se divida es que la integral se
calcule dentro de la tolerancia prefijada. Obviamente el algoritmo anterior se programa
de forma natural de manera recursiva.
El papel fundamental lo juega una funcion, que podra seguir el siguiente prototipo
rra
simpsonadaptativo(f,a,c,b,fa,fc,fb,integ,tol)

donde f es la funcion a integrar, a y b son los extremos de integracion, c el punto medio,


fa, fb y fc los valores de f en a, b y c, integ es el resultado de aplicar la regla de Simpson
en [a,b] y tol la tolerancia con la que se pide la integral. Se procede entonces siguiendo
los siguientes pasos

1. Se toma h=(b-a), d=(a+c)/2, e=(c+b)/2 y se calcula fd = f (d) y fe = f (e)

2. Se calcula
do
integ21 = h/12*(fa + 4fd + fc) integ22 = h/12*(fc + 4fe + fb)
integ2 = integ21 + integ22

3. Se calcula el estimador

16
est = (integ integ2)

15

4. Si est<tol entonces integ = integ2 y se hace return.


r
5. Si est>tol entonces se calcula

integ21 = simpsonadatativo(f, a, d, c, fa, fd, fc, integ21, tol/2)


integ22 = simpsonadatativo(f, c, e, b, fc, fe, fb, integ22, tol/2)
integ = integ21 + integ22.

129
7.1 Formulas de cuadratura LECCION III

Si hemos seguido el esquema anterior y nos vemos forzados a dividir en dos subinter-
valos, habremos evaluado ya f en a, c y en su punto medio d y en c, b y el correspondiente
punto medio e. Tambien se habra calculado la regla de Simpson en estos intervalos. Es por
ello que enviamos todos estos valores en las llamadas de la funcion simpsonadaptativo,
dado que generalmente la operacion mas costosa es precisamente evaluar la funcion.
Notemos que se ha optado por devolver como aproximacion de la integral Q2 (f ), en
Bo
lugar de Q1 (f )14 . Otra variante es devolver
16Q2 (f ) Q1 (f )
15
que es el primer paso de extrapolacion de Simpson (o el segundo del trapecio, de acuerdo
al problema 7.2).
La forma mas simple de implementar el proceso anterior es introduciendo una funcion
de cabecera que prepare los datos iniciales: recibe la funcion, el intervalo de integracion y
la tolerancia solicitada, y calcula para arrancar la subrutina simpsonadaptativo el punto
medio c, los valores de f en a, b y c y el resultado de aplicar la regla de Simpson simple
en [a, b]. Por ejemplo
rra
01 % SIMPSONRECURSIVO
02 %
03 % INTEG= SIMPSONRECURSIVO (F,A,B,TOL)
04 %
05 % Devuelve una aproximacion de la integral mediante
06 % una integracion adaptativa basada en la regla de Simpson
07 % con tolerancia TOL
08
09 function integ=simpsonrecursivo(f,a,b,tol)
10
11 c=(a+b)/2;
12 fa=feval(f,a);
13 fb=feval(f,b);
do
14 fc=feval(f,c);
15 integ=(b-a)*(fa+4*fb+fc)/6; %regla de Simpson
16 integ=simpsonadaptativo(f,a,c,b,fa,fc,fb,integ,tol);
17 return
Resta por programar la funcion simpsonadaptativo, trabajo que proponemos al lec-
tor.
Ejercicio 7.15 Implementa la regla de Simpson adaptativa.
Ejercicio 7.16 El metodo tal como esta programado puede entrar en un bucle infinito si no
r
se consigue integrar con la tolerancia exigida en las sucesivas subdivisiones de un intervalo.
Para evitar este problema hacemos que el programa lleve control del numero de veces que ha
subdividido un intervalo. La funcion puede seguir la siguiente sintaxis
14
Casi nadie dudara en esta eleccion. Es decir, es esperable que Q2 (f ) sea mejor que Q1 (f ), as que por
que no devolver lo mejor que se tiene?. Matematicamente, sin embargo, el estimador del error controla
el error de Q1 (f ) y no de Q2 (f ).

130
LECCION III Captulo 7. Formulas de cuadratura. FFT

1.5
Bo
1

0.5

0
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2


rra
Figura 7.5: Integracion adaptativa de x

[integ,subd2]=simpsonadaptativo(f,a,c,b,fa,fc,fb,integ,tol,subd)

donde subd2=subd+1. Si subd2 > subdmax se devuelve un mensaje de error, se deja de


subdividir y se continua la ejecucion del programa devolviendo el ultimo valor calculado. El
parametro subdmax puede dejarse como un valor por defecto que puede modificarse si el usuario
especifica otro valor. Es decir, entra a formar parte de un conjunto variable de argumentos de
entrada.
Implementa el metodo resultante.

Ejercicio 7.17 Por ultimo podemos llevar un control sobre los puntos que hemos evaluado.
do
Para ello basta utilizar

[integ,subd2,x2]=simpsonadaptativo(f,a,c,b,fa,fc,fb,integ,tol,subd,x)

con x2=[x d e] donde d y e son los puntos medios de [a,c] y [c,b] respectivamente.
Implementa el metodo resultante.
(Ayuda: si al final se desea que los puntos x2 esten ordenados se puede aplicar la instruccion
sort(x2) que devuelve el vector con sus componentes ordenadas de menor a mayor.)

Nota final
r
De un estimador se suele hablar de dos conceptos bien importantes: confiabilidad y
eficiencia. Un estimador es confiable si efectivamente el error esta por debajo de lo que el
estimador calcula. Por contra, es eficiente si el estimador aproxima bien el error cometido.
Nuestro estimador, en general, es poco eficiente: el error real suele estar muy por debajo de
la cantidad que nos devuelve elestimador, especialmente si el intervalo de integracion es
grande. Por ejemplo, para f = x e integrando en [0, 2], se observa que con una tolerancia

131
7.2 Transformada rapida de Fourier LECCION III

Adaptativa Pto. medio Trapecio Simpson

tol Error neval Error Error Error


101 8.91e03 7 8.01e3 3.67e2 1.01e2
102 1.41e04 15 2.70e3 1.06e2 3.59e3
Bo
103 1.57e06 29 1.03e3 3.81e3 1.40e3
104 2.12e07 47 5.01e4 1.82e3 6.90e4
105 8.48e09 77 2.45e4 8.67e4 3.33e4
106 2.64e10 133 1.09e4 3.81e4 1.36e4
107 8.27e12 233 4.73e5 1.64e4 6.41e5
108 2.25e13 421 1.96e5 6.76e5 2.65e5

R2
Cuadro 7.2: Resultados numericos para 0 x dx. Tolerancia exigida (tol), numero de
evaluaciones (neval) y error cometido (Error). Comparativa con las reglas del punto medio,
del trapecio y de Simpson con h fijo y el mismo numero de evaluaciones
rra
de 105 el error real cometido por el metodo adaptativo es 8.48 109 , un error 1000 veces
menor en magnitud. Una forma de corregir este problema es, una vez que se ha decidido
dividir el intervalo de integracion en dos subintervalos, no exigir una tolerancia tol/2 en
cada uno de ellos, sino utilizar r tol con r [1/2, 1]. Matlab utiliza de hecho r = 1.
Matlab cuenta con algunas funciones encargadas de la integracion numerica:

quad quadl dblquad triplequad

Las dos ultimas aplican reglas de cuadratura para integrales dobles y triples respectiva-
mente.
El comando quad implementa esencialmente el metodo de Simpson recursivo que he-
mos visto en esta seccion. Por otro lado, quadl utiliza una regla de orden mayor que da
mejores resultados si el integrando es mas regular.
do
El codigo de estas funciones esta abierto, luego se puede editar para ver los detalles
de su implementacion.

7.2. Transformada rapida de Fourier


La transformada rapida de Fourier, o FFT, segun sus siglas en ingles15 , es una he-
rramienta muy potente en el analisis de senales periodicas y cuyas aplicaciones se han
extendido a aspectos muy diferentes del Calculo Numerico.
Existen diversas formas de introducir la FFT. Hemos escogido la interpretacion que
r
relaciona la transformada de Fourier discreta con los coeficientes de Fourier para enlazar
seguidamente con algunas aplicaciones.
15
El nombre correcto sera transformada discreta rapida de Fourier, para distinguirla de la transformada
de Fourier continua. Sus siglas en ingles, FFT, podran entonces provenir de Fast Fourier Transform o
Finite Fourier transform. De acuerdo a lo anterior, las siglas mas adecuadas seran FFFT (Fast Finite
Fourier transform), pero nadie utiliza esta nomenclatura, seguramente por el exceso de Fs)

132
LECCION III Captulo 7. Formulas de cuadratura. FFT

Parte de esta seccion, especialmente la referente a la transformada rapida de Fourier,


se ha obtenido del libro Numerical Computing with Matlab, de Cleve Moler.

7.2.1. Transformada de Fourier discreta


Nota En esta seccion seguiremos la notacion de Euler
Bo
exp(i) = ei = cos + i sen , R,

donde i es la unidad imaginaria. 


Dada una funcion 1periodica, esta se puede expresar en forma de serie de Fourier
X
f () = fb(m) exp(2im), R (7.6)
mZ

donde fb(m) es el coeficiente m-esimo de Fourier


1
rra
Z
fb(m) = f () exp(2im)d, m Z.
0

La convergencia de la serie es un asunto algo delicado16 , pero si la funcion tiene, por


ejemplo, derivada continua, la convergencia de la serie es uniforme:
s
X
max f () fb(m) exp(2im)| 0, cuando r, s ,

[0,1]
m=r

lo que en particular justifica alguna de las manipulaciones que haremos a continuacion.


La identidad (7.6) se interpreta en el sentido de que la funcion original f es suma
infinita de unas frecuencias fundamentales. Observa que para cada m,
do
exp(2im),

es una funcion 1/m-periodica, o dicho de otra forma, su periodo es 1/m (ver la Figura
7.6).
Ademas se tiene la relacion
Z 1
X
2
|f ()| d = |fb(m)|2 (7.7)
0 m=
r
que se interpreta como que la energa de funcion original f es igual a la energa del vector
infinito (. . . , fb(2), fb(1), fb(0), fb(1), fb(2), . . .)> .
16
Mucho se ha escrito sobre esto. En cualquier caso hay que especificar en que sentido converge la
serie. El sitio mas adecuado, matematicamente hablando, es el espacio de las funciones cuyo cuadrado
es integrable, que se denota por L2 (0, 1). Fsicamente se interpreta como el espacio de las senales cuya
energa es finita.

133
7.2 Transformada rapida de Fourier LECCION III

Parte Real e Imaginaria de exp(2 i m) para m=1,2,3


Freq.1 periodo 1
1.5 Freq 2 periodo 1/2
Freq 3 periodo 1/3
Bo
1

0.5

-0.5

-1

-0.2 0 0.2 0.4 0.6 0.8 1 1.2


rra
Figura 7.6: Primeras exponenciales trigonometricas.

Nota. Utilizando la definicion de la exponencial trigonometrica, podemos expresar



X
X
f = fb(0) + (fb(m) + fb(m)) cos(2m ) + i(fb(m) fb(m)) sen(2m ) (7.8)
| {z } | {z }
m=1 =: m m=1
=: m
donde m y m se pueden calcular de forma alternativa mediante
do
Z 1 Z 1
m = 2 f () cos(2m) d, m = 2 f () sen(2m) d.
0 0

La expresion (7.8) puede resultar mas atractiva que (7.6), especialmente si la funcion es
real puesto que implica trabajar unicamente con cantidades reales, sin parte imaginaria.
Sin embargo, tanto el analisis como una notacion mas compacta animan a utilizar la
exponencial compleja. Aun es mas, en lo que sigue podemos suponer que las funciones
son complejas (devuelven valores en C) y por tanto se cubre este caso de forma muy
natural. 
Desde un punto de vista practico, es poco habitual que se pueda (o que se proceda a)
r
evaluar la funcion en cualquier punto. En lugar de ello se dispone de un muestreo es decir,
del valor de la funcion en una serie de puntos uniformemente distribuidos. As definimos
j
xj = N
, j = 0, . . . , N 1,
se evalua
yj := f (xj ) , j = 0, . . . , N 1

134
LECCION III Captulo 7. Formulas de cuadratura. FFT

y se construye el vector
y0
y1
y= .

..
.
yN 1
Bo
La primera cuestion es
Es posible recuperar los coeficientes de Fourier de f a partir de y?
La respuesta obvia es no: si tomamos una cantidad finita de informacion es imposible
recuperar (salvo en casos triviales) los coeficientes de Fourier, que en ultima media son la
funcion y, por tanto, conllevan una cantidad infinita de informacion.
Ahora bien, la situacion es muy diferente si disponemos de informacion a priori sobre
la funcion f . Si una funcion periodica f es regular podemos probar que
fb(k) 0, |k|
y de hecho de una forma muy rapida (ver Ejercicio 7.18), por lo que unos pocos coeficientes
pueden ser suficientes para reconstruir la funcion de forma muy aproximada.
rra
Para calcular estos coeficientes utilizamos la regla del trapecio, que como hemos visto
en la seccion anterior converge muy rapidos para funciones regulares y periodicas. Todo
lo anterior nos conduce a
Z 1
f (k) :=
b f ()exp(2ik) d
0
f (1) = f (0) = y0
1 h1
N
X 1
1 i
f (0) + f ( Nj ) exp( 2ijk
N
) + f (1) =
N 2 j=1
2
N 1
1 X
= yj jk
N j=0
do
donde
:= exp 2i

N
.
Lo anterior sugiere construir
N 1
1 X
Yk := yj jk
N j=0

como una aproximacion de fb(k). El vector



y0
y1
r

Y=

..
.
yN 1
recibe el nombre de transformada discreta de Fourier de y que denotaremos por
F y = Y. Por tanto F : CN CN , es decir, transforma vectores de numeros (en principio)
complejos en vectores complejos.

135
7.2 Transformada rapida de Fourier LECCION III

Ejercicio 7.18 Sea f es periodica con derivada primera continua,


Z 1 =1
1
f (k) :=
b f () exp(2ik) d = f () exp(2ik)
0 2ki =0
| {z }
=0
Z 1
1
Bo
+ f 0 () exp(2ik) d.
2ki 0

Demostrar entonces que


C
|fb(k)|
k
donde C es independiente de k. De que depende C?. Prueba reiterando este argumento que
si f es mas regular el decrecimiento de fb(k) es mas acusado.

Para estudiar la relacion entre transformada de Fourier continua y discreta precisamos


del siguiente lema

Lema 7.5 Para todo k Z


rra
N 1
(
1 X 1, k = `N para algun ` Z,
exp 2ijk

N
=
N j=0 0, en caso contrario.

Demostracion. Tomemos como antes


:= exp 2i

N
.
Entonces, la suma anterior es simplemente
N 1 N 1
1 X jk 1 X k j
= ( ) .
N j=0 N j=0

Si k = `N , es decir, si k es un multiplo de N , k = exp(2i`) = 1 y la suma anterior es


do
1. En caso contrario, teniendo en cuenta que
1 rm
1 + r + r2 + . . . + rm1 =
1r
obtenemos que
N 1
1 X k j 1 1 ( k )N 1 1 ( N )k
( ) = = .
N j=0 N 1 k N 1 k

Ahora, como N = 1, se sigue que la suma anterior es nula. 


Utilizando el desarrollo en Fourier de f e intercambiando el orden de los sumatorios17
r
podemos escribir
N 1 N 1 N 1
1 X 1 X 1 X b hX  i
jk 2ijk
exp 2i(mk)j

Yk := yj = f (xj ) exp N = f (m) N
.
N j=0 N j=0 N mZ j=0

17
Manipulaciones que deben siempre justificarse y que son validas si, por ejemplo, la funcion tiene
derivada primera continua.

136
LECCION III Captulo 7. Formulas de cuadratura. FFT

Por el lema anterior,


N 1 
X 
2i(mk)j
 1, si m = k + `N ,
exp N
=
0, en caso contrario,
j=0

por lo que
Bo
1 Xb
Yk = f (k + mN ).
N mZ
De esta forma, Yk recoge no solo el coeficiente kesimo de Fourier, sino contribuciones en
frecuencias mas altas, cuya distancia al coeficiente k dista un multiplo de N .
Llegado a este punto, conviene recordar que el decreciemiento rapido a cero de los
coeficientes de Fourier cuando |k| sugiere que Yk aproxima bien al coeficiente
de Fourier mas proximo a cero y la aproximacion mejora muy rapidamente cuando
N . Es decir,
X

f
b (k)+ fb(k + mN ), si 0 k N2

m6=0



| {z }
rra

pequeno


Yk = X (7.9)
N
f (k N )+ f (k + mN ), si 2 < k < N .

b b




m6 = 0

| {z }

pequeno

A la operacion que a cada Y le asocia el vector original y se conoce como transfor-


mada inversa de Fourier discreta y se denota

F 1 Y = y.

Con argumentos similares a los utilizados anteriormente se puede ver que


N 1
do
X
2ijk

yk := Yj exp N
,
j=0

obteniendose as una expresion muy similar a la transformada de Fourier. En particular,


concluimos que F 1 existe y esta bien definida.

Nota. En el marco continuo, tenamos que


Z 1 X
fb(m) = f () exp(2im) d, f () = fb(m) exp(2im).
0 mZ
r
Observese el paralelismo entre la Transformada de Fourier Discreta, y la integral de la
expresion superior (la primera es la aproximacion discreta de la segunda) y la inversa de
la Transformada de Fourier Discreta con la serie de Fourier.

Ejercicio 7.19 Prueba la expresion dada para la inversa de la transformada discreta de


Fourier.

137
7.2 Transformada rapida de Fourier LECCION III

Ejercicio 7.20 Dado que vamos a calcular aproximaciones de los coeficientes centrales de
Fourier, podramos plantearnos definir
N
X 1
Yek = yj jk , N/2 < k N/2
j=0
Bo
Sabras ver que relacion hay entre Yek e Yk ?.

7.2.2. Calculo de la transformada de Fourier Discreta


Es facil dar una expresion matricial de la transformada de Fourier discreta en terminos
de la matriz

1 1 1 1
1 2 N 1
2(N 1)
2

4 = exp 2i

W := 1 , N
...............................
2
1 N 1 2(N 1) (N 1)
rra
Con esta matriz, la relacion entre y y su transformada Y se escribe simplemente
1
Y = Fy = W y.
N
Analogamente,
y = F 1 Y = W Y
donde W es la matriz adjunta

1 1 1 1
2 N 1
1
do

2(N 1) = 1 = exp
2 4
2i

W = 1
,
N
...............................
2
1 N 1 2(N 1) (N 1)

La matriz W es una matriz de tipo Vandermonde, que ya surgido anteriormente.


Ademas es casi ortogonal:
W W = N IN
donde IN la matriz identidad de orden N .
En resumen, la transformada discreta de Fourier, y su transformada inversa, se reducen
a calcular un producto matriz-vector. El costo, en una implementacion directa, conlleva
r
la construccion de la matriz y realizar el producto. Solo el producto tiene un costo de
orden O(2N 2 ) operaciones (sumas y productos).

Ejercicio 7.21 Construye la matriz W .

Ejercicio 7.22 Implementa la transformada discreta de Fourier.

138
LECCION III Captulo 7. Formulas de cuadratura. FFT

Solucion. Esta es una implementacion que evita construir la matriz W . En su lugar


calcula sucesivamente las filas, la multiplica por y para hallar el correspondiente coeficiente
y calcula la siguiente fila. De esta forma se reduce la memoria utilizada pero no el numero
de operaciones
01 % FT
Bo
02 %
03 % Y=ft(y) devuelve la transformada de Fourier discreta
04 % la implementacion es la directa
05
06 function Y = ft(y)
07
08 y=y(:); % y es columna ahora
09 n=length(y);
10 w=exp(-i*2*pi*(0:n-1)/n);
11 W=ones(1,n);
12 Y=zeros(n,1);
13 for j=1:n
rra
14 Y(j)=W*y;
15 W=W.*w
16 end
17 Y=Y/n;
18 return
Ejercicio 7.23 Implementa la transformada inversa de Fourier.

Notas finales
Si f es real,
Re fb(k) = Re fb(k), Im fb(k) = Im fb(k).
Esta simetra se extiende a la transformada discreta: si y es real
do
Im y0 = 0, Re yk = Re yN k , Im yk = Im yN k , k = 1, . . . , N 1.
De esta forma, si ignoramos la primera componente, la parte real de Y, respectivamente
imaginaria, es simetrico, respectivamente antisimetrico, respecto al punto N/2. Este punto
se conoce como el punto de Nyquist.
Otra analoga con el marco continuo es que la transformada discreta de Fourier preser-
va, salvo constante multiplicativa, la norma k k2 del vector original, esto es, su energa.
Concretamente (comparar con (7.7))
1 1 1 1
kYk22 = Y Y = (W y) (W y) = 2 y W W y = y y = kyk22 . (7.10)
r
N 2 N N N
Hay una falta de consenso en la definicion de Transformada de Fourier discreta. Noso-
tros hemos tomado como definicion de la transformada y de su inversa las dadas por
N 1 N 1
1 X X
Yk := yj jk , yk := Yj jk , = exp( 2i
N
).
N j=0 j=0

139
7.2 Transformada rapida de Fourier LECCION III

En Matlab, la transformada de Fourier y su inversa estan implementadas en fft e ifft.


La definicion que se toma es ligeramente diferente
N 1 N 1
X 1 X
Yk := jk
yj , yk := Yj jk , = exp( 2i
N
).
j=0
N j=0
Bo

En otros textos se multiplica por 1/ N en ambos sumatorios con el fin de dar un aspecto
mas uniforme (en este caso la norma 2 del vector y de su transformada coinciden). En
cualquier caso, la diferencia entre las diferentes transformadas es simplemente el producto
por una potencia de N .
Todo lo desarrollado en esta seccion es perfectamente aplicable a funciones periodicas
con distintos periodos, sin mas que aplicar un cambio de variables y transformarla en
1periodica.

7.2.3. Aplicaciones a la eliminacion de ruido


Una de las primeras aplicaciones surge en el analisis de senales y fenomenos periodicos.
Vamos a mostrar un (muy) simple ejemplo en la eliminacion de ruido de una senal pe-
rra
riodica. Suponemos que la senal, dada por una funcion regular y suave, es perturbada por
un ruido que puede ser modelizado por una variable aleatoria que sigue una distribucion
uniforme.
Como la senal original es regular, sus coeficientes de Fourier decrecen rapidamente
a cero. En particular, la funcion puede ser aproximada por una suma parcial con unas
pocas exponenciales trigonometricas. Dicho de otra forma, la funcion tiene unas pocas
frecuencias importantes mientras que el resto tiene una aportacion despreciable.
Tomemos por ejemplo una senal dada por la funcion

f (x) := cos(cos(12x)) sen(2x)

En la Figura 7.7 se muestra la funcion y sus coeficientes de Fourier, que decrecen rapida-
do
mente a cero. Tambien se muestra una evaluacion en 64 puntos (un muestreo) uniforme-
mente distribuidos y la transformada de Fourier discreta resultante. Observese la relacion
entre transformada discreta de Fourier y los coeficientes de Fourier mostrada en (7.7).
En el campo discreto, tenemos un ruido r y el vector transformada de Fourier discreta
R = F r. Visto en el campo transformado, esta perturbacion tiene un tamano, relacionado
con la amplitud del ruido y con el numero de puntos que se han tomado de muestra. Dado
el comportamiento altamente irregular, es esperable que las contribuciones en todas las
frecuencias sean similares. Pero
1
kRk22 = krk22 max |rj |.
N j=0,...,N 1
r
Por tanto, si el ruido tiene un valor maximo controlado, las componentes del vector trans-
formado tienden a cero cuando N . De hecho es esperable que este decrecimiento
sea uniforme en todas las componentes, es decir,
1
Rj
N

140
LECCION III Captulo 7. Formulas de cuadratura. FFT

Seal continua con un muestreo de 64 puntos


1 1

0.5 0.5
Bo
0 0

-0.5 -0.5

-1 -1
0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1

Coef. Fourier (en valor absoluto) FT de la seal discreta (valor abs.)


0.4
0.4

0.3
0.3

0.2 0.2
rra
0.1 0.1

0 0
-40 -20 0 20 40 0 10 20 30 40 50 60

Figura 7.7: Coeficientes de Fourier y transformada discreta de Fourier

Ahora, si consideramos la influencia de este ruido sobre una senal y, tenemos la senal
perturbada y e = y + r. Se trata ahora de eliminar ese ruido observando la transformada
Y.
e
La estrategia que planteamos es la siguiente. En el caso de que Yej sea grande, pode-
do
mos aceptar este coeficiente dado que el error relativo es pequeno. Por contra, si Yej es
pequeno, el error relativo que hemos introducido es tal que la informacion ha quedado
irremediablemente contaminada y por tanto debemos desecharla.
Lo anterior sugiere una forma de depurar la senala, partiendo de un nuevo vector Z
(
0 si |Yek | es pequeno,
Zk = (7.11)
Yek en otro caso.
Con la informacion que nos queda, reconstruimos la senal discreta original y mediante
F 1 Z. As tenemos el siguiente diagrama
r
+ ruido F (7.11) F 1
y y
e Y
e Z z.

Al final de proceso, z es (debera ser) mejor aproximacion de y que la senal perturbada


y
e.
En la Figuras 7.9 se muestran los resultados obtenidos con n = 64 y n = 256. Se puede
observar como la senal es filtrada eliminando gran parte del ruido introducido.

141
7.2 Transformada rapida de Fourier LECCION III

0.08 0.015

0.06
0.01
Bo
0.04
0.005
0.02

0 0
10 20 30 40 10 20 30 40
-3
x 10
0.08 8

0.06 6

0.04 4
rra
0.02 2

0 0
50 100 150 50 100 150

Figura 7.8: Ruido en un conjunto de puntos (40 arriba, 160 abajo) y su transformada
discreta

7.2.4. Transformada rapida de Fourier


La importancia del analisis de Fourier, y por ende de la transformada discreta de
do
Fourier, fue cobrando fuerza a lo largo del siglo XX y muchos aspectos siguen demandando
este tipo de tecnicas en el siglo actual.
Pronto surgieron problemas que requeran calcular la transformada de Fourier de mi-
llones de elementos, lo que colocaba el problema mas alla de la potencia de los ordenadores
de la epoca y los de un futuro previsible18 . En cualquier caso duplicar N , el numero de
elementos de y, requerira multiplicar por cuatro la potencia del ordenador. Siguiendo el
progreso de la informatica, esto significara una espera de 36 meses19 .
18
Hemos mostrado algunas aplicaciones simples de la transformada de Fourier que son esencialmente
unidimensionales (una senal periodica). Existen aplicaciones que exigen trabajar ya con senales bidimen-
r
sionales. En ese caso, duplicar la precision con la que se trabaja implica multiplicar por 4 la dimension
del problema y por 16 la complejidad computacional del algoritmo que hemos visto. Problemas en mas
dimensiones y con numeros muy elevados de variables no son extranos.
19
La ley de Moore formulada por Gordon Moore cofundador de Intel en 1965 es un ejemplo de una
ley emprica que se viene satisfaciendo con asombrosa regularidad en los ultimos cuarenta anos. Esta ley
establece que la potencia de calculo y la capacidad de almacenamiento se multiplica por 2 cada 18 meses.
De forma paralela han surgido otras versiones de la ley de Moore que establecen comportamientos de
crecimiento exponencial en el mundo de la informatica.

142
LECCION III Captulo 7. Formulas de cuadratura. FFT

Seal con ruido


64 puntos FT (en valor absoluto)
1
0.4

0.35
0.5
0.3
Bo
0.25
0 0.2

0.15

-0.5 0.1

0.05

-1 0
0 0.2 0.4 0.6 0.8 1 0 10 20 30 40 50 60

Truncacion de la FT Seal filtrada


1
0.4

0.35
0.5
0.3

0.25
0
rra
0.2

0.15

0.1 -0.5

0.05

0 -1
0 10 20 30 40 50 60 0 0.2 0.4 0.6 0.8 1

Seal con ruido


256 puntos FT (en valor absoluto)
1
0.4

0.35
0.5
0.3

0.25
0 0.2
do
0.15

-0.5 0.1

0.05

-1 0
0 0.2 0.4 0.6 0.8 1 0 50 100 150 200 250

Truncacion de la FT Seal filtrada


1
0.4

0.35
0.5
0.3

0.25

0.2 0

0.15
r
0.1 -0.5

0.05

0 -1
0 50 100 150 200 250 0 0.2 0.4 0.6 0.8 1

Figura 7.9: Filtrado del ruido

143
7.2 Transformada rapida de Fourier LECCION III

En 1965, Jim Cooley, investigador ligado a IBM y John Tukey, de la Universidad de


Princeton mostraron una forma sencilla de programar la transformada de Fourier discreta
que reduca drasticamente el numero de operaciones.
La idea de partida del algoritmo es considerar el caso N = 2m. Entonces denotando
1 := 2
Bo
se tiene que
2jk = ( 2 )kj = 1jk .
De esta forma, si 0 k M 1 = N/2 1
N 1 M 1 M 1
1 X jk 1 X 2jk 1 X
Yk = yj = y2j + y2j+1 (2j+1)k
N j=0 N j=0 N j=0
| {z } | {z }
Pares Impares
N = 2M M 1 M 1
1h 1 X 1 X i
= y2j 1jk + k y2j+1 1jk
2 M j=0 M j=0
rra
1 h
(0) (1)
i
=: Yk + k Yk . (7.12)
2
(0) (1)
Notemos que Yk e Yk son el resultado de aplicar la transformada de Fourier dis-
creta a los vectores (y0 , y2 , . . . , y2M 2 )> y a (y1 , y3 , . . . , y2M 1 )> respectivamente, que son
vectores de longitud M = N/2.
Si M k N 1 la relacion cambia levemente. Para ello, escribamos k = M + ,
donde ahora 0 M 1. Entonces
N 1 M 1 M 1
1 X jk 1 X 2jk 1 X
Yk = yj = y2j + y2j+1 (2j+1)k
N j=0 N j=0 N j=0
M 1 M 1
1h 1 X 1 X i
= y2j 1jM 1j + M y2j+1 1j .
do
2 M j=0 M j=0

Dado que
M = exp(i) = 1, 1M = 1;
se deduce que
1  (0)
Y Y(1) .

Yk = (7.13)
2
v
Denotando por w el vector resultado de enlazar los vectores v y w, las identidades
(7.12) y (7.13) se puede escribir en notacion vectorial
r
 
1 Y(0) + . Y(1)
Y= (7.14)
2 Y(0) . Y(1)
donde Y(0) e Y(1) son las transformadas de Fourier de los vectores (y0 , y2 , . . . , y2M 2 )> y
(y1 , y3 , . . . , y2M 1 )> ,
= ( 0 , 1 , . . . , M 1 )> , := exp( 2i
N
), (7.15)

144
LECCION III Captulo 7. Formulas de cuadratura. FFT

y .* denota el producto elemento a elemento entre las componentes de los vectores.


En cuando al numero de operaciones, si f (N ) es el numero de multiplicaciones, se
comprueba que el total de productos es el de dos transformadas de longitud N/2 mas N
productos realizados al combinar dichas transformadas. En resumen,

f (N ) = 2f (N/2) + N.
Bo
Nada nos impide aplicar de forma reiterada el algoritmo anterior para calcular Y(0) e
Y(1) si M es divisible por 2 (o lo que es lo mismo, que N sea divisible por 4). De forma
natural, se puede programar el metodo de forma recursiva.
El caso optimo del algoritmo en la version anterior se da cuando N = 2p . El algoritmo
queda de la siguiente forma

FFT

N =length(y)
if N==1
rra
Y=y
else
Y(0) := FFT(y(0 : 2 : N 2)) % Parte par
Y(1) := FFT(y(1 : 2 : N 1)) % Parte impar
= exp(2i/N )
:= [ 0 , 1 , . . . , N/21 ]>
Y(0 : N/2 1) = (Y(0) + . Y(1) )/2
Y(N/2 : N 1) = (Y(0) . Y(1) )/2
end

En tal caso, se puede comprobar que el numero de productos es


do
f (N ) = 2p (p + 1) = N (log2 (N ) + 1)

que debe compararse con el N 2 esperable de la implementacion directa. De ah viene el


nombre de Transformada Rapida de Fourier.

Ejercicio 7.24 Implementa la transformada rapida de Fourier.

Ayuda. No utilices fft como nombre de esta funcion, dado que este es el comando de
Matlab para el calculo de la transformada rapida de Fourier. Entrando ya en programa, en
r
primer lugar podemos plantearnos como se va a devolver el resultado, si como un vector
fila o como un vector columna. Para ello, la primera instruccion de nuestra subrutina
podra ser

y=y(:); Y=y;

si se quiere trabajar solo con columnas, o

145
7.2 Transformada rapida de Fourier LECCION III

y=y(:).; Y=y;
si se desea implementar para filas. Fjate que ya hemos introducido el vector que va a
guardar la transformada de Fourier y que sus dimensiones coinciden con las del vector y.
Llegado a este punto, hay que tener cuidado al programar el producto
. Y(1)
Bo
para que los vectores implicados, e Y(1) tengan igual dimension.
Si el vector tiene un numero par de elementos, la transformada se calcula a partir de
la transformada de los vectores
y(1 : 2 : n) (y0 , y2 , . . . , yn2 )> , (Y(0) )
y(2 : 2 : n) (y1 , y3 , . . . , yn1 )> , (Y(1) )
de acuerdo con el algoritmo (vease tambien (7.14) y (7.15)).
Cuando el numero de entradas de y no sea una potencia de 2 se puede utilizar el primer
algoritmo que dimos (ejercicio 7.22). De esta manera tendramos la siguiente estructura
y=y(:); n=length(y);
rra
if mod(n,2)==0
...... % expresion RECURSIVA en terminos de dos transformadas
......
else % no es divisible por 2
...... % Algoritmo del ejercicio 7.22
end
En las lneas anteriores, mod(m,n) devuelve el resto de la division de m entre n y sirve
para comprobar si el numero de entradas es par o impar.
Ejercicio 7.25 Implementa una funcion recursiva que devuelva el numero de operaciones
para el calculo de la FFT. Utilzala para obtener una tabla con el numero de operaciones para
algunos valores altos de N . Compara con el numero de operaciones requerido en la version
do
inicial del algoritmo dada antes.

Solucion. Esta es una forma simple de implementar la funcion


01 % OPERACIONESFFT(N)
02 %
03 % M=OPERACIONESFFT(N)
04 %
05 % M es el numero de operaciones de la FFT
06
07 function M=operacionesFFT(N)
r
08
09 if mod(N,2)==1
10 M=N^2;
11 else
12 M=operacionesFFT(N/2)*2+N;
13 end

146
LECCION III Captulo 7. Formulas de cuadratura. FFT


Hemos testado la funcion con 219 y 219 1 que es primo. Este es el resultado

>> format rat


>> operacionesfft(2^19) %(2^19 approx 500.000)
Bo
ans=

10485760

>> operacionesfft(2^19-1)

ans =

274876858369

Observa que el numero de operaciones efectuadas se reduce en un factor de 26000 si


rra
aumentamos en uno el numero de elementos.

Ejercicio 7.26 Implementa la Inversa de la Transformada Discreta de Fourier con nombre


InvTrRaFourier.

Ejercicio 7.27 En este ejercicio observaremos la dependencia de la FFT implementada en


Matlab respecto del numero de entradas del vector. Para ello, utilizaremos de nuevo los valores
219 1 y 219 propuesto anteriormente. Define dos vectores y1 y y2 con 219 1 y 219 com-
ponentes respectivamente, por ejemplo, mediante la orden rand. Aplica fft(y1) y fft(y2)
y comprueba el tiempo que tarda en cada caso. Sabras explicar por que se reduce el tiempo
de calculo?.
do
Nota final

Las implementaciones comerciales de la FFT son ciertamente mas complicadas que


lo que hemos visto. En realidad, los metodos recursivos son menos eficientes que las
implementaciones directas, que no hacen uso de la recursividad.
En lugar de ello se opta por una programacion directa, mas refinada. No solo se
descompone la transformada en dos de longitud mitad de la original, como se ha mostrado
en este algoritmo, sino que ademas se intenta dividir por los primeros numeros primos 2,
3, 5, 7,... reduciendola a dos, tres, cinco o siete transformadas y as sucesivamente. Incluso
r
el caso de numeros primos se realiza de forma mas optima que el algoritmo (ingenuo) del
ejercicio 7.22.
Los comandos en Matlab que devuelven la transformada de Fourier y su inversa son fft
e ifft. Puede consultarse la ayuda para ver algunos detalles sobre su funcionamiento e
implementacion. Existen otras transformadas ligadas a esta. Por ejemplo, la transformada
del coseno y la del seno, tambien implementadas en Matlab (dct, idct, dst y idst). .

147
7.2 Transformada rapida de Fourier LECCION III

La FFT y el producto de numeros enteros


Dados dos vectores
u = (u0 , u1 , . . . , ur )> , v = (v0 , v1 , . . . , vs )>
se define el vector convolucion u v al vector de r + s + 1 componentes cuya entrada k
Bo
viene dada por
mn{k,r}
X X
(u v)k := u` v j = u` vk` , (k = 0, . . . , r + s). (7.16)
`+j=k `=max{0,ks}

Es facil comprobar que la convolucion, tambien llamado producto de convolucion, es


conmutativo. Esta operacion es simplemente el producto de polinomios. En efecto, si
consideramos los polinomios
u0 + u 1 x + . . . + u r x r , v0 + v1 x + . . . + vs xs
entonces el coeficiente en xk del polinomios producto viene dado precisamente por (7.16).
Una propiedad interesante de la transformada de Fourier discreta es que convierte la
convolucion de dos vectores en producto de transformadas. Tomemos N = r + s. Si u y
rra
v se insertan en Rn+1 rellenando con ceros
u = (u0 , u1 , . . . , ur , 0, . . . , 0 )> , v = (v0 , v1 , . . . , vs , 0, . . . , 0 )
| {z } | {z }
N r = s ceros N s = r ceros
tenemos que
F (u v) = N (F (u). F (v)),
donde la operacion anterior es el producto elemento a elemento entre los vectores. As, una
forma rapida de calcular la convolucion de los dos vectores es seguir el siguiente algoritmo
Calcular U = F (u), V = F (v)
Multiplicar W = N U. V
do
Devolver F 1 (W)
Si N = r + s es una potencia de 2 entonces el numero de operaciones es del orden de
O(n log2 (N )), comparado con 2N 2 que tiene la implementacion mas directa.
Una de las aplicaciones mas simples del calculo de productos de convolucion esta en
el producto de numeros enteros. Por ejemplo,

6031 1 + 3 10 + 0 102 + 6 103
1234 4 + 3 10 + 2 102 + 1 103

6031 1234 = 4 + 15 101 + 11 102 + 31 103 + 21 104 + 12 105 + 6 106
= 7442254.
r
Es decir, se trata simplemente del producto de polinomios con 10 jugando el papel de
x, o equivalentemente, la convolucion entre dos vectores:

6031 (1, 3, 0, 6, 0, 0, 0, 0) =: u
u v = (4, 15, 11, 31, 21, 12, 6)>
1234 (4, 3, 2, 1, 0, 0, 0, 0) =: v
Por tanto, la FFT nos ofrece una forma muy rapida de multiplicar dos numeros enteros.

148
LECCION III Captulo 7. Formulas de cuadratura. FFT

Ejercicio 7.28 Implementa una funcion que calcule el producto de dos numeros enteros con
la transformada de Fourier de acuerdo al siguiente prototipo
% MULTIPLICACION
%
%
Bo
% P=MULTIPLICACION(A,B) Devuelve el producto de A por B
%
% A,B deben ser arrays de caracteres
% P es un array de caracteres con el
% producto A*B
%
Ayuda. Para que el metodo sea realmente eficiente necesitamos que los vectores sobre los
que se va a aplicar la transformada de Fourier tengan longitud una potencia de 2. Para
ello podemos insertar mas ceros de los inicialmente previstos de forma que N sea una
potencia20 de 2.
Para disponer de una precision en principio ilimitada, introduciremos los numeros
que deseamos multiplicar en una cadena de caracteres y haremos la salida en el mismo
rra
formato. Para su implementacion necesitaremos manejarnos con la conversion entre los
diversos formatos de datos.
Una cadena o string es simplemente un vector de caracteres y as lo maneja Matlab:
>> p=esto es una prueba

ans=

esto es una prueba

>> p(3)
do
ans=

>> p(6:9)

ans =

es u
Hara falta transformar un vector de caracteres a un vector de numeros y viceversa. Para
r
ello se puede utilizar los comandos str2num, num2str(STRing-to-NUMeric y NUMeric-
to-STRing).
Una vez que tengamos el vector de numeros hay que darle la vuelta al vector, de forma
que
1234 [4 3 2 1].
20
Que hace log2(ceil(r+s))?

149
7.2 Transformada rapida de Fourier LECCION III

Por ultimo una vez multiplicados hay un paso de acarreo, es decir, un resultado de forma
que

[4 15 11 31 21 12 6] 4 + 15 101 + 11 102 + 31 103 + 21 104 + 12 105 + 6 106

debe transformarse en su representacion decimal


Bo
4 + 5 101 + 2 102 + 2 103 + 4 104 + 4 105 + 7 106 = 744224.

Nota. Para que preocuparse en multiplicar numeros enteros? Es decir, no parece haber
una necesidad acuciente de disenar algorimos para multiplicar numeros de centenares o
miles de cifras. Una aplicacion sorprendente proviene del mundo de cifrado de mensajes.
El sistema de cifrado mas popular actualmente es el RSA, propuesto por los ma-
tematicos21 Ron Rivest, Adin Shamir y Len Adleman en 1977, esta basado en el conocido
Teorema Pequeno de Fermat22 . Este teorema, muy simple, tiene que ver con los restos
de la division por numeros primos. El mensaje que se desea enviar se convierte en un
numero entero, mas o menos largo. El cifrado y descifrado del mensaje se basa en calcular
restos de divisiones por el producto de dos numeros primos muy grandes. La seguridad
rra
del sistema depende directamente del tamano de estos primos: mayor tamano es mayor
seguridad. Ello hace que se requiera calcular productos y divisiones de numeros enteros
enormes de forma rapida y eficiente23 . 

Nota. La convolucion esta implementada en Matlab mediante el comando conv. La


forma de calcular es esencialmente la expuesta en esta seccion. 
do
r
21
El nombre del algoritmo son las iniciales de sus apellidos.
22
Nada que ver con el Ultimo Teorema de Fermat, cuya demostracion tuvo que esperar cuatro siglos.
23
Para una informacion mas detallada, mrese por ejemplo http://en.wikipedia.org/wiki/Rsa.

150

Вам также может понравиться