You are on page 1of 280

Matlab en cinco lecciones de Numerico

Vctor Domnguez Baguena M


a
Luisa Rap un Banzo
Febrero de 2006
Disponible en
http://www.unavarra.es/personal/victor dominguez/
B
o
r
r
a
d
o
r
Prefacio
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 P ublica de Navarra.
Nuestra intencion original era tratar temas algo avanzados de Calculo Cientco 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
objetivos. El resultado nal 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 supercial.
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 matematico
1
, 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 manip-
ulacion 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 eciente en Matlab pasa necesariamente por la vectorizacion.
Los apuntes estan organizados en torno a temas o lecciones, cada cual dividido en dos
partes, la primera de Matlab y la segunda con un tema especco 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 dicultad 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 especcos, matematicos e informaticos. Finalmente
se han introducido algunas notas historicas que describen brevemente la evolucion que han
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
Cientco 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 cientca, com un en muchos aspectos.
i
B
o
r
r
a
d
o
r
evolucionan con los a nos, con muchas de ellas desechadas nalmente e incluso algunas
rescatadas a nos despues de considerarse como vas muertas.
Hemos adjuntado al nal 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 inuencia considerable en estas notas.
El segundo libro es ya un clasico entre los que aprendimos Matlab hace algunos a nos.
Andabamos entonces en la b usqueda 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 Wikipedia
2
ha sido utilizada profusamente para obtener datos y fuentes utilizadas en la redaccion de
este texto. Debemos se nalar que estas informaciones han sido debidamente contrastadas.
A pesar de algunos problemas iniciales, es seguro que la inuencia de esta enciclopedia
libre crecera exponencialmente en el futuro.
Finalmente, queremos dejar patente nuestro agradecimiento al Profesor Javier Sayas
que se ofrecio muy generosamente a revisar este libro. Sus numerosas y acertadas indica-
ciones y sugerencias han contribuido, y mucho, en la redaccion nal de este texto.
Pamplona, Febrero de 2006 Vctor Domnguez Baguena
M
a
Luisa Rap un Banzo
2
http://www.wikipedia.org
ii
B
o
r
r
a
d
o
r
A Javier
Amigo y maestro.
B
o
r
r
a
d
o
r
B
o
r
r
a
d
o
r
Captulo 1
Introduccion
... and the rst lesson of all was the basic trust that he
could learn. It is shocking to nd how many people do
not believe they can learn, and how many more believe
learning to be dicult.
Dune
Frank Herbert
1.1. Que es?
Matlab es un entorno de trabajo para el calculo cientco. Programado originalmente
por Cleve Moler a nales de los a nos 70, su nalidad original era proporcionar una forma
sencilla de acceder a las libreras LINPACK y EISPACK donde estan implementadas de una
forma altamente eciente los algoritmos clave del analisis matricial
1
. De hecho, Matlab es
una abreviatura de Matrix Laboratory
Su primera implementacion se hizo en Fortran que era, y en buena medida a un sigue
siendolo, el lenguaje estandar en la implementacion de metodos numericos
2
. Posterior-
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 cientco
y de las ciencias aplicadas en general, dotandole de una gran popularidad en ambientes
cientcos (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;
procesamiento de se nales (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 signica 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
B
o
r
r
a
d
o
r
dise no de sistemas de control;
salidas gracas;
estadstica;
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 n umero de
comandos que se encuentra a disposicion del usuario
3
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?
El lenguaje de programacion de Matlab es bastante mas exible 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 especicar sus dimensiones e incluso cambiar sus tama nos 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 eciente.
Por otro lado, una gran cantidad de metodos numericos se encuentran implementados
de una forma muy eciente y son accesibles como simples comandos. De esta forma, Mat-
lab se puede utilizar como una caja negra: el usuario pregunta y el ordenador responde 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 caso el meto-
do adecuado, y especialmente el signicado 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,. . . )
algoritmos basicos del

Algebra Lineal (inv, det, lu, chol, qr,...)
salidas gracas (plot, surf,...)
3
A modo de ejemplo, estos comandos cubren salidas gracas: plot, line, ezplot, ezsurf, surf,
surfc, line, patch, plot3, contour, contourf, ezcontour, pcolor, trimesh, trisurf,...
2
B
o
r
r
a
d
o
r
Las funciones no compiladas estan escritas siguiendo el lenguaje de programacion
propio de Matlab. Estos comandos se guardan en cheros *.m que es la extension estandar
de los cheros de Matlab
4
.
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 eciente.
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
y=zeros(1,1000);
h=2*pi/999;
for i=0:999
y(i+1)=sin(h*i);
end
Vectorizada
y=sin(linspace(0,2*pi,1000));
En la primera parte del codigo, encontramos una estructura tpica en los lenguajes de
programacion: el comando for. Su signicado 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 nal
es el vector la 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
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 eciente. 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 difer-
encias con los lenguajes clasicos de alto nivel como Fortran, C o Pascal
5
. En cualquier caso,
la posibilidad de ejecutar instrucciones en bloque sobre vectores o matrices, en contraste
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 cheros de datos.
5
De hecho en la version 6.5 apenas hay diferencias en tiempo de ejecucion entre los dos codigos
expuestos.
3
B
o
r
r
a
d
o
r
1.3. Como aprenderemos?
Como ya hemos se nalado 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 dicultades que salvar: saber de la
existencia del comando adecuado y aprender a utilizarlo. En no pocas ocasiones, la primera
es la mayor dicultad. 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,...
seg un sea necesario.
En los apuntes se incluyen m ultiples 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,
que pueden servir para ese n.
4
B
o
r
r
a
d
o
r
Leccion I
Primeros pasos en Matlab.
Metodos directos para sistemas de ecuaciones
lineales
5
B
o
r
r
a
d
o
r
B
o
r
r
a
d
o
r
Introduccion
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
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 sis-
temas de ecuaciones lineales. En la implementacion de estos algoritmos repasaremos los
conocimientos de Matlab expuestos en la primera parte.
7
B
o
r
r
a
d
o
r
B
o
r
r
a
d
o
r
Captulo 2
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
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 cheros 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 graca, 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;
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 b usquedas, demostraciones, etc.

Estas son las caractersticas basicas que debemos considerar:


El prompt de Matlab es >>. El usuario escribe a continuacion.
Para ejecutar se pulsa la tecla Enter.
Se pueden recuperar comandos anteriores navegando con las echas y .
Cuando se trabaje en Matlab, debemos tener muy en cuenta que:
Se distinguen may usculas y min usculas.
9
B
o
r
r
a
d
o
r
2.1 Entorno de trabajo LECCI

ON I
Figura 2.1: Pantalla Principal.
Todos los comandos de Matlab se escriben en min usculas y los argumentos se envan
entre parentesis separados por comas.
El caracter % se utiliza para insertar comentarios. Todo lo que sigue (en la misma
lnea) es ignorado por Matlab.
Si se teclea al nal 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.
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
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 2. Matlab: Primeros pasos


y observa la salida.
Haremos algunos comentarios sobre el ejercicio anterior. El circunejo ^ es la poten-
ciacion:
>> 3^5
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
>> ans*2
ans =
20
>> ans*2
ans =
40
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
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 n umeros reales se pueden insertar tambien en notacion cientca, muy adecuada si
se trata de n umeros grandes o muy peque nos (en valor absoluto). As, se tiene la siguiente
regla de construccion:
m 10
r
mer
11
B
o
r
r
a
d
o
r
2.1 Entorno de trabajo LECCI

ON I
Por ejemplo
0.005 5e 3 115 10
12
115e12
1201200000 1.2012e009 0.00031415 3.1415e 004
Existen ademas dos n umeros especiales: inf y NaN. El primer signo representa la can-
tidad innita (). El segundo es una abreviatura de no es un n umero (Not a Number)
y es el resultado que se devuelve ante una operacion indenida como 0/0. Este smbolo
se puede utilizar en ambitos, en principio tan extra nos, como en el dibujo de supercies
(ver la Leccion V).
En general los resultados numericos se presentan con cuatro cifras decimales correctas,
aunque todas las operaciones se ejecutan en doble precision
1
. 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
signicativas. La instruccion
>> 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
ans =
3.14159265358979
>> format compact % compacto
>> pi
ans =
3.14159265358979
>> format bank %No fijo de cifras decimales
>> 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
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 2. Matlab: Primeros pasos


>> format rat %salidas en forma fraccionaria
>> pi
ans =
355/113
>> format loose % mas espaciada
>> pi
ans =
355/113
Observa la diferencia de espaciamiento que se obtiene con las opciones compact y loose.
N umeros 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
>> i^2
ans=
-1
>> j^2
ans=
-1
El signo i suele ser habitual en Matematicas mientras que en diversas ramas de la Fsica
y en Ingeniera de Telecomunicaciones o Electrica se preere 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 =
6.0000 - 5.0000i
>> (5+3i)*(5-3i), (1+2i)/(3-4i)
ans =
13
B
o
r
r
a
d
o
r
2.2 Comandos de ayuda LECCI

ON I
34.00
ans =
-0.20
+
>> conj(3e-3+2e-4i) % conjugado
ans =
0.0030 - 0.0002i
>> abs(3+4i), angle(2i) % modulo y argumento
ans =
5
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-
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 cheros de
ayuda.
Por ejemplo, si deseamos ayuda sobre la funcion sin, podemos ejecutar
>> help sin
SIN Sine.
SIN(X) is the sine of the elements of X.
Overloaded methods
help sym/sin.m
14
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 2. Matlab: Primeros pasos


Figura 2.2: Pantalla de ayuda.
o bien
>> helpwin sin
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.4
2
).
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
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
B
o
r
r
a
d
o
r
2.3 Variables LECCI

ON I
Figura 2.3: Ayuda con helpwin. Comprueba si aparece la opcion Go to online doc...
>> help +
se pueden ademas visualizar las operaciones elementales seg un Matlab.
2.3. Variables
Matlab no necesita la declaracion de variables como en un lenguaje tradicional. En prin-
cipio todas las variables son reales, y basta hacer uso de ellas para que queden declaradas:
>> a=1; b=2; c=3;
>> a-b
ans =
-1
>> a*b*c
ans =
16
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 2. Matlab: Primeros pasos


Figura 2.4: Ayuda on line.
6
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
>> whos a
Name Size Bytes Class
a 1x1 8 double array
Grand total is 1 element using 8 bytes
Para borrar una variable se utiliza la instruccion clear, por ejemplo,
17
B
o
r
r
a
d
o
r
2.3 Variables LECCI

ON I
>> a=4;
>> whos a
Name Size Bytes Class
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.
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

Almacenamiento de variables en cheros


Matlab ofrece la posibilidad de grabar las variables que deseemos en un chero. De esta
forma, podemos recuperarlas mas adelante, ya sea en la misma sesion o en otra diferente
3
.
Por ejemplo
>> a=4+i;% numero complejo
>> b1=cos(2);
>> b2=sin(2);
>> save datos a b1 b2
graba dentro del directorio de trabajo, en un chero 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
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 2. Matlab: Primeros pasos


2.4. Ficheros script y funciones
La forma mas eciente de empaquetar series de instrucciones simples y mecanicas es
utilizando cheros script. Tareas mas elaboradas, con, por ejemplo, variables de entrada
y salida, requieren del uso de funciones.
2.4.1. Ficheros script
Un chero script es un simple documento de texto que contiene una sucesion de co-
mandos de Matlab. Esencialmente es equivalente a teclear estas instrucciones directamente
en la ventana de comandos.
Describiremos el manejo de este tipo de cheros mediante un sencillo ejemplo. Comen-
zamos creando un chero tecleando en modo comando la orden
4
>> edit prueba
Se despliega as en una ventana aparte el editor de Matlab con el chero prueba.m (.mes
la extension estandar de Matlab). Es importante saber cual es el directorio de trabajo
5
,
pues es donde se guardara por defecto el chero.
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
teclear el nombre del chero en la ventana de comandos:
>> prueba
Se puede modicar las veces que se precise las variables a y b en el chero 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
forma, que es la evolucion natural de los cheros script, es mas exible 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 chero que contenga a una funcion se puede teclear:
4
Tambien es posible crear este chero a golpe de raton.
5
Por defecto es C:MATLAB6p5work.
19
B
o
r
r
a
d
o
r
2.4 Ficheros script y funciones LECCI

ON I
>> edit mifuncion
En el editor puedes insertar este simple ejemplo:
01 % MIFUNCION
02 %
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 nal de la funcion
6
.
Ahora, para calcular el valor de
2
cos() podemos ejecutar la orden:
>> mifuncion(pi)
ans =
10.8696
Nota. Los n umeros correlativos situados a la izquierda no forman parte del codigo
de la funcion. Han sido insertados con el n de numerar las lneas y as facilitar los
comentarios que podamos hacer sobre el programa.
Una funcion puede no tener salidas, por ejemplo,
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)
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 superuo.
20
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 2. Matlab: Primeros pasos


o bien devolver m ultiples salidas:
01 % MIFUNCION2
02 %
03 % [Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve
04 %
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);
>> z1
ans=
6
>> z2
ans=
2
>> z=mifuncion2(1,2,3); % Ahora solo devuelve el primero
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
MIFUNCION2
[Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve
Y1=X1+X2+X3;
Y2=X1-X2+X3;
21
B
o
r
r
a
d
o
r
2.5 Vectores y matrices LECCI

ON I
Aunque muy recomendables
7
, 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.
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 may usculas y min usculas en sus comandos, esto no es
extensible para funciones programadas en m-les, al menos en Windows. Es decir, para
ejecutar una funcion en un archivo, digamos, operaciones, se puede utilizar OPERACIONES,
Operaciones y cualquier combinacion con may usculas y min usculas. Esto es debido a que
el sistema de archivos de Windows tampoco hace esa distincion
8
. Versiones mas avanzadas
de Matlab, 7.0 en adelante, muestran sin embargo un aviso si no existe una concordancia
exacta min usculas-may usculas entre el nombre del chero y el comando utilizado para
llamarlo.
Todas las variables se envan por valor, no por referencia. Es decir, si una funcion
modica una variable de entrada, esta modicacion se pierde cuando nalice su ejecucion,
recuperando el valor original.
Por ultimo, en un chero 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 chero 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 chero que esta. Evitamos as llenar la carpeta
de trabajo, o de nuestro proyecto, con cheros y mas cheros.
2.5. Vectores y matrices
Dado que principalmente trabajaremos solo con arrays de una y dos dimensiones
hablaremos en lo que sigue de los objetos matematicos correspondientes: vectores y ma-
trices. Todo lo que sigue se puede adaptar a arrays con mas dimensiones, aunque por
simplicar, nos centraremos ahora en el manejo de vectores y matrices y dejaremos pen-
diente para la Leccion IV el uso de arrays multidimensionales (tensores).
2.5.1. Denicion de matrices y vectores
Un vector o una matriz se puede denir dando sus elementos entre corchetes y sepa-
rando las 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 chero llamado operaciones.m no es posible crear otro con nombre
Operaciones.m
22
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 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];
denen las matrices y vectores
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

.
Matlab distingue entre vectores la 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 tama no 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;
>> a(4,5)
ans=
9
En cualquier caso, si tratamos de introducir un valor en una posicion no denida de la
matriz, Matlab ira adaptando el tama no seg un juzgue apropiado
9
, y no dara ning un
error. El siguiente ejemplo ilustra esta caracterstica
>> clear c % c esta borrado
>> c(1,2)=4 % c es ahora 1 x 2
c =
0 4
>> c(3,3)=2 % c pasa a ser 3 x 3
c =
0 4 0
0 0 0
0 0 2
Esta habilidad, aunque permite una programacion muy exible y descuidada, debe uti-
lizarse 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 peque nos, 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
B
o
r
r
a
d
o
r
2.5 Vectores y matrices LECCI

ON 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
tama nos compatibles, las instrucciones
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 tama no) 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.
Ejercicio 2.4 Introduce en a y a2 dos matrices de igual tama no. Observa el resultado de
ejecutar
a+a2 a*a2 a.*a2
Dene un vector b la o columna y ejecuta
b.^3 b
Comprueba si estas operaciones estan bien denidas
a*2 a+1
Que hacen exactamente? Por que crees que no es necesario . en la primera instruccion?.
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 tama no.
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
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 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 = A
1
b.
As, si b es n 1 y a es n n,
>> 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 nal es equivalente a aplicar el comando elemento a elemento. Por ejemplo,
>> a=[0 pi/3; -pi/3 0];
>> cos(a)
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
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)
ans =
3 2
>> length(a3)
25
B
o
r
r
a
d
o
r
2.5 Vectores y matrices LECCI

ON I
ans =
3
>> a3=a3; % cambiamos la forma de a3
>> size(a3)
ans =
2 3
>> [m,n]=size(a3); % m son las filas y n las columnas
>> m
ans =
2
>> n
ans =
3
>> length(a3)
ans =
3
El comando size devuelve un vector de tama no 21 con el n umero de las y columnas
del vector/matriz. El resultado es diferente seg un se aplique a vectores la o columna. La
orden length devuelve la longitud de una matriz o vector. Su signicado en el caso de un
vector esta clara mientras que para matrices devuelve el maximo entre el n umero de las
y el n umero de columnas.
Matrices especiales
Matlab dispone de una serie de comandos que permiten construir matrices con una
estructura particular. Cabe se nalar las siguientes ordenes:
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
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 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 n umero 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.
Por ejemplo,
>> 0:10
ans=
0 1 2 3 4 5 6 7 8 9 10
>> 10:-1:0
ans=
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 =
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 especica el formato,
devuelve una la.
2.5.4. Acceso a partes de matrices
El manejo de partes de vectores y matrices, as como la eliminacion de las o columnas,
cambios de tama no, etc, se hace va instrucciones muy simples en Matlab. Aunque pueda
resultar algo extra no al principio, un poco de practica es suciente para que el usuario se
27
B
o
r
r
a
d
o
r
2.5 Vectores y matrices LECCI

ON 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
ans =
6
>>a(2,:) % fila 2 de a
ans =
4 5 6
>>a(:,1) % columna 1
ans =
1
4
7
10
>>a(:,2)=0 % columna 2 es ahora 0
a =
1 0 3
4 0 6
7 0 9
10 0 12
Podemos acceder a partes de una la o columna:
>> a(1,2:3) % vector [a(1,2) a(1,3)]
ans =
0 3
>> a(2:4,3) % vector columna [a(2,3); a(3,3); a(4,3)]
ans =
28
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 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)]
ans =
0 3
0 6
En general, si p es un vector de n umeros 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=
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];
>> p=[1 3 2]; q=[1 2 1];
>> a(p,q)
Que hacen exactamente?.
Igualmente es facil a nadir las y columnas a una matriz:
>> a=[1 2 3 4; 5 6 7 8]
a =
1 2 3 4
5 6 7 8
>> a=[a; [1 -1 2 4]] % adosamos una fila nueva
a =
29
B
o
r
r
a
d
o
r
2.6 Bucles y estructuras de decision LECCI

ON I
1 2 3 4
5 6 7 8
1 -1 2 4
>> a=[a [0; 2; 4] ] % una nueva columna
a =
1 2 3 4 0
5 6 7 8 2
1 -1 2 4 4
Si se desea eliminar una la o columna se puede utilizar el smbolo vaco []. Por
ejemplo,
>> a(:,2)=[] % suprime la segunda columna
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
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
.....
end
implementa un bucle donde las lneas de codigo entre for y end son ejecutadas repetida-
mente con j tomando los valores del vector inicio:paso:final (vease la Seccion 2.5.3)
Por ejemplo,
>> for j=1:3; disp(j); end
1
30
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 2. Matlab: Primeros pasos


2
3
>> for j=6:-2:2; disp(j-2); end
4
2
0
En general, si v es un vector,
for j=v
.....
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
5
3
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
A =
_

_
1
1
2

1
n
1
2
1
3

1
n+1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
n
1
2n2
1
2n1
_

_
Construye la matriz anterior mediante un chero script y el uso de dos for anidados.
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
31
B
o
r
r
a
d
o
r
2.6 Bucles y estructuras de decision LECCI

ON I
El resultado de una comparacion es 1 si es verdadero, 0 si es falso:
>> a=1; b=2; c=3;
>> a>0
ans =
1
>> a>0 & b<3
ans =
1
>> a<0 | b<1
ans =
0
>> test= (a~=0)
ans =
1
>> whos test
Name Size Bytes Class
test 1x1 1 logical array
Grand total is 1 element using 1 bytes
Estos 0 y 1 no son valores numericos sino logicos como se comprueba con la ultima
instruccion
10
. 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
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
aislar los elementos mayores o iguales que 1 simplemente con
10
Ocupan un unico byte mientras que un n umero real utiliza ocho bytes.
32
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 2. Matlab: Primeros pasos


>> 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).
Nota. El comando logical puede utilizarse para construir vectores y estructuras logicas
a partir de vectores de n umeros 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 =
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)
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:
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
33
B
o
r
r
a
d
o
r
2.6 Bucles y estructuras de decision LECCI

ON I
if de decision m ultiple:
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)))
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 sigu-
iente forma
if (x<0)
f=x.^2;
disp(x menor que cero)
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);
disp(x en [2*pi,infinito))
end
end
end
Obviamente, la primera forma es mas clara y concisa.
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 exible
que un for.
En general todos los bucles y estructuras que requieran cerrarse, lo hacen con end. El
uso de break y continue es exactamente el mismo.
34
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 2. Matlab: Primeros pasos


Por ultimo, y volviendo a end, este comando tiene una curiosa funcionalidad extra:
sirve para referenciar el ultimo elemento de una la 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
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 n umero de elementos no nulos y un vector que
contenga dichos elementos.
Solucion. Una implementacion posible es la siguiente
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=[]; % p es vacio
11 for i=1:length(x)
12 if (x(i)~=0) % si x(i) no es cero
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,
>> a=[0.1 0. 0.3 0.1 0.6 0 0.1 0.2 0.4]; % vector!!
>> [n,p]=findnonzeros(a)
n =
7
35
B
o
r
r
a
d
o
r
2.6 Bucles y estructuras de decision LECCI

ON I
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 sigu-
iente
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);
12 return
Haz un esfuerzo en entender bien los comandos anteriores. Tras la suciente 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).

36
B
o
r
r
a
d
o
r
Captulo 3
Metodos directos para sistemas de
ecuaciones lineales
3.1. Metodo de Gauss
El metodo de Gauss, tambien conocido como eliminacion gaussiana, es el algoritmo
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 n umero.
(b) Intercambiar dos ecuaciones.
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 las 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 la otra la e intercambiar
las
2
). En lo que sigue expresaremos el sistema en la forma
Ax = b, A R
nn
, x, b R
n
,
donde A es la matriz de coecientes, b el termino independiente y x el vector de soluciones.
Los elementos de A se denotaran por a
ij
, y con b
i
los de b.
1
Existe una tercera operacion (c), que consiste simplemente en multiplicar las por constantes no
nulas. Esta operacion recibe el nombre de reescalado (de las) y en problemas practicos se suele utilizar
con el n 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
B
o
r
r
a
d
o
r
3.1 Metodo de Gauss LECCI

ON I
3.1.1. Metodo de Gauss sin pivotaje
El pseudocodigo se expone a continuacion
Metodo de Gauss
01 for i = 1 : n 1
02 for k = i + 1 : n
03
ki
= a
ki
/a
ii
04 for j = i + 1 : n
05 a
kj
= a
kj

ki
a
ij
06 end
07 b
k
= b
k

ki
b
i
08 end
09 end
10
11 x
n
= b
n
/a
nn
12 for i = n 1 : 1 : 1
13 x
i
=
_
b
i

j=i+1
a
ij
x
j
_
/a
ii
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 a
ii
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 denida.
El algoritmo efect ua O(n
3
/3) productos
3
y otras tantas sumas para la reduccion a la
forma triangular y O(n
2
/2) sumas y productos para la resolucion del sistema triangular.
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 coecientes 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
02 %
03 %
04 % X=GAUSS(A,B) Solucion del sistema Ax=b con el metodo
05 % de Gauss sin pivotaje
3
es decir, el n umero de multiplicaciones es n
3
/3 + n
2
+ n + , donde , y son constantes
adecuadas. Con n creciente, el primer termino es el dominante.
38
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 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
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);
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


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 las 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
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 n umero de operaciones
en la ejecucion del metodo
4
.
4
Por que?.
39
B
o
r
r
a
d
o
r
3.1 Metodo de Gauss LECCI

ON 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 la 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);

Ejercicio 3.3 (Avanzado) Podemos avanzar a un mas hacia la consecucion de algoritmos


matriciales. Consideremos la particion de A
A =
_
a
11
c

1
d
1
A
11
_
, b =
_
b
1
b
1
_
donde c
1
, d
1
son vectores (n 1) 1 y A
11
una matriz (n 1) (n 1). Entonces, el primer
paso del metodo de Gauss se puede escribir
_
a
11
c

1
0 A
11
(a
11
)
1
c

1
d
1
_
, b =
_
b
1
b
1
a
1
11
b
1
d
1
.
_
. .
A
(1)
. .
b
(1)
El segundo paso del metodo de Gauss se aplica ahora sobre la matriz A
(1)
(de tama no (n1)
(n1)) y el vector b
(1)
(de tama no (n1) 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 ele-
mento, 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 matematicas
sencillas, como productos escalares, productos matriciales, b usqueda de maximos y mni-
mos en un vector/matriz, suma de vectores y matrices... cuya implementacion se opti-
miza 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 operaciones 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(n
2
) operaciones y el nivel tres son
operaciones entre matrices, O(n
3
) operaciones. En maquinas con m ultiples 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 trabajo
5
.
5
Se deben buscar en primer lugar algoritmos que permitan dividir la tarea principal en subtareas
equiparables, y de forma que nalicen 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
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 3. Metodos directos para sistemas de ecuaciones lineales


Uno de los detalles mas sencillos que hay que plantear es la estrategia de almace-
namiento de las matrices en memoria. Se puede optar por un almacenamiento por las,
como hace C,
A =
_
a
11
a
12
a
13
a
21
a
22
a
23
_
a
11
a
12
a
13
a
21
a
22
a
23
donde con la notacion anterior queremos decir que a
ij
y a
ij+1
ocupan posiciones consec-
utivas en memoria.
Sin embargo Fortran o Matlab proceden por columnas
A =
_
a
11
a
12
a
13
a
21
a
22
a
23
_
a
11
a
21
a
12
a
22
a
13
a
23
.
Seg un sea el caso se trata de primar algoritmos que accedan a la matriz por las o por
columnas para que el procesador trabaje con posiciones consecutivas de memoria
6
. En esta
dinamica, la resolucion del sistema triangular seg un 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 a
ii
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 la i por una la k tal que a
ki
,= 0 para cierto k > i. Si esto no es posible,
el sistema no es compatible determinado, es decir, o no tiene solucion o tiene innitas
soluciones.
Desde un punto de vista practico, el metodo de Gauss con pivotaje procede a inter-
cambiar siempre las de forma que en cada paso
[a
ki
[ = max
=i,...,n
[a
i
[,
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
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
B
o
r
r
a
d
o
r
3.1 Metodo de Gauss LECCI

ON I
Metodo de Gauss con pivotaje parcial
01 for i = 1 : n 1
02
03 Encontrar k i, . . . , n tal que [a
ki
[ = max
j=,...,n
[a
i
[
04 for j = i : n
05 a
ij
a
kj
%intercambio las y termino independiente
08 end
07 b
i
b
k
08
09 for k = i + 1 : n
10
ki
= a
ki
/a
ii
11 for j = i + 1 : n
12 a
kj
= a
kj

ki
a
ij
13 end
14 b
k
= b
k

ki
b
i
15 end
16 end
Ejercicio 3.4 Implementa una funcion con el metodo de Gauss con pivotaje a partir de la
funcion denida en el Ejercicio 3.2.
Para este n la instruccion max te puede resultar util. Especcamente,
>> [m,i]=max(v)
devuelve en m el mayor valor del vector v y en i su posicion, esto es, m = v(i). A nade tambien
un control sobre el tama no de a(i, i) de forma que si este es proximo a cero
7
se termine la
ejecucion y se devuelva un mensaje de error.
(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 la en la matriz a con el mayor valor en la
columna i es i+r-1.)
El intercambio de las de las lneas 04--08 se puede implementar de varias formas.
La primera es simplemente con un bucle que recorra las las 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 extra na pero vuelve a ser natural
en Matlab. Basta hacer
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 n umero es cero? En la practica depende de los tama nos del resto de
elementos de la matriz.
42
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 3. Metodos directos para sistemas de ecuaciones lineales


3.1.3. Metodo de Gauss con pivotaje parcial cticio
Desde un punto de vista practico no hace falta intercambiar fsicamente las las 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 la i.
Inicialmente, las las estan sin reordenar, es decir, se empieza declarando
p=1:n;
Intercambiar las las i y k es equivalente a intercambiar los valores de p en las posiciones
i y k
p([i k])=p([k i])
y se procede a hacer ceros en las las p(i+1),. . . , p(n). El acceso la la i se consigue con
a(p(i),:)
y la b usqueda del maximo valor para el intercambio de las con
[m,r]=max(abs(a(p(i:n),i)));r=r+i-1;
La la 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 las la transforma
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 triangular
8
.
Ejercicio 3.5 Implementa el metodo de Gauss con pivotaje parcial cticio.
Ejercicio 3.6 Las lneas 2225 proceden a resolver el sistema triangular accediendo a los
elementos por las. Adapta el algoritmo para la resolucion de este sistema por columnas, tal
como se hizo en el Ejercicio 3.3.
Ejercicio 3.7 Sea A una matriz inversible de tama no n n y A
1
su inversa. Si a
i
es la
columna iesima de A
1
, esto es,
A
1
= [a
1
[a
2
[ [a
n
],
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
B
o
r
r
a
d
o
r
3.2 Descomposiciones matriciales LECCI

ON I
entonces
Aa
i
= e
i
=
_

_
0
.
.
.
1
.
.
.
0
_

_
i.
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 coecientes.
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
original escrita como el producto de una ortogonal por una triangular, o el caso que nos
ocupa, el metodo de Gauss, visto como la b usqueda 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
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, Ux = y.
el primero triangular superior y el segundo triangular inferior. Puesto que el costo de
resolucion de cada sistema es O(n
2
) operaciones (total de sumas y productos) obtenemos
una ventaja decisiva en la resolucion del sistema.
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 n
2
+ n incognitas (las entradas de L y U) y n
2
ecuaciones
(una por cada elemento de a). Por tanto, el sistema resultante no debera admitir solucion
44
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 3. Metodos directos para sistemas de ecuaciones lineales


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

_
1

21
1
.
.
.
.
.
.
.
.
.

n1

n2
1
_

_
, U =
_

_
u
11
u
12
u
1n
u
22
u
2n
.
.
.
.
.
.
u
nn
_

_
,
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 la de U (que es
igual que la de A por ser
11
= 1). Una vez conocida esa la, 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 las y L por columnas.
Descomposicion LU (Metodo de Doolittle)
01 for k = 1 : n
02 for j = k : n
03 u
kj
= a
kj

k1

p=1

kp
u
pj
04 end
05
kk
= 1
06 for i = k + 1:n
07
ik
=
_
a
ik

k1

p=1

ip
u
pk
_
/u
kk
08 end
09 end
El n umero de operaciones del algoritmo resulta ser igual al del metodo de Gauss,
con lo cual no hemos conseguido una ventaja signicativa. 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
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
B
o
r
r
a
d
o
r
3.2 Descomposiciones matriciales LECCI

ON 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, denamos
_
a
(1)
ij
= a
ij
i, j = 1, . . . , n
a
(k+1)
ij
= a
(k)
ij

ik
a
(k)
kj
, 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 la de U y de la primera columna de L vienen dados por
u
1j
= a
(1)
1j
,
i1
=
a
(1)
i1
a
(1)
11
.
En el siguiente paso, se observa que
u
2j
= a
2j

21
u
1j
= a
(1)
2j

21
a
(1)
1j
= a
(2)
2j

i2
=
a
i2

i1
u
12
u
22
=
a
(1)
i2

i1
a
(1)
12
a
(2)
22
=
a
(2)
i2
a
(2)
22
.
Reiterando el mismo razonamiento concluimos que
u
ij
= a
(i)
ij
, i j,
ij
=
a
(j)
ij
a
(j)
jj
, i > j.
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.
En particular, la propiedad anterior propone una forma alternativa de calcular la de-
scomposici on LU de una matriz es la siguiente modicacion 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
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 modicacion.
46
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 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 denidas
positivas. Este tipo de matrices puede descomponerse en la forma
A = LL

donde
L =
_

11

21

22
.
.
.
.
.
.
.
.
.

n1

n2

nn
_

_
.
Gracias a la simetra de la matriz, tanto el n umero 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
01 for k = 1:n
02
kk
=

_
a
kk

k1

r=1

2
kr
03 for j = k + 1:n
04
jk
=
_
a
jk

k1

r=1

jr

kr
_
/
kk
05 end
06 end
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
Ly = b, L

x = y.
LU con permutacion
El metodo de Gauss con pivotaje parcial es equivalente a la decomposicion
PA = LU
47
B
o
r
r
a
d
o
r
3.2 Descomposiciones matriciales LECCI

ON I
donde P es el resultado de permutar las las (o columnas) de la identidad. Alternativa-
mente, equivale a una descomposicion de la forma
A =

LU
donde

L = P
1
L, de forma que

L es una permutacion de la matriz triangular inferior
9
.
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
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
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
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 las de L.
48
B
o
r
r
a
d
o
r
LECCI

ON I Cap

tulo 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
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 habitual
10
es la denominada QR que devuelve Q ortogonal (es decir,
Q

Q = I
n
) 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);
La colocacion de los parentesis es esencial. Con ulb se calcula (u
1
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 historica
11
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
asteroide Palas. Parece ser que Joseph Louis Lagrange haba utilizado ideas similares 50
a nos antes para dilucidar si una forma cuadratica (hoy diramos matriz) era denida pos-
itiva. El matematico aleman Carl Gustav Jacob Jacobi extendio la idea de la eliminacion
gaussiana a matrices arbitrarias.
Es rese nable 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 a nos despues denio el producto matricial
identicandolo con el calculo de la composicion de aplicaciones lineales y denio la in-
versa de una matriz). Importantes fueron tambien las contribuciones del fsico Hermann
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. S uli y
D. Mayers. Estas referencias estan completamente detalladas en la bibliografa.
49
B
o
r
r
a
d
o
r
3.2 Descomposiciones matriciales LECCI

ON I
Grassmann (introdujo la primera algebra vectorial no conmutativa, basada en el producto
vectorial de dos vectores; considero tambien el producto de un vector la 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
(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 nales de los a nos 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 Turing
12
, 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 4
n
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 denidas positivas
13
. James H. Wilkinson,
reconocido universalmente como el padre del analisis moderno de estabilidad (frente a los
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 nal, Cleve Moler, programador original de Matlab, cita
14
a Wilkinson
y Todd entre las personas que tuvieron una gran inuencia en su formacion y por ende
en los orgenes de Matlab.
12
La vida de Alan Turing es una de las mas tragicas en historia de las matematicas. Dotado de una in-
teligencia 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
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 a nos se sugirio incluso resolucion de un sistema Ax = b mediante las ecuaciones
normales A

Ax = A

b (A

A es simetrica y denida positiva).


14
http://www.mathworks.com/company/newsletters/news notes/clevescorner/dec04.html
50
B
o
r
r
a
d
o
r
Leccion II
Programacion avanzada en Matlab.
Metodos iterativos para sistemas de
ecuaciones lineales
51
B
o
r
r
a
d
o
r
B
o
r
r
a
d
o
r
Introduccion
Homer: Marge? Since Im not talking to Lisa, would you
please 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.
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 o 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 n umero de
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.
53
B
o
r
r
a
d
o
r
B
o
r
r
a
d
o
r
Captulo 4
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 reere al manejo de enormes cantidades de memoria. En esta seccion expon-
dremos algunos comandos adicionales y entraremos con cierto detalle en la manipulacion
de matrices sparse
1
.
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 las, columnas o simplemente submatrices (estas acciones ya se trataron
en la primera leccion). Para este n 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 parte triangular superior (upper) e inferior (lower) respectivamente. Ademas estos co-
mandos son algo mas exibles de lo que pueda parecer a simple vista como veremos a
continuaci on.
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 =
11
22
33
1
Aceptaremos este anglicismo en lo que sigue. En ocasiones este vocablo se traduce por matrices huecas
o matrices dispersas.
55
B
o
r
r
a
d
o
r
4.1 Retorno a las matrices LECCI

ON II
>> triu(a)
ans =
11 12 13
0 22 23
0 0 33
>> tril(a)
ans =
11 0 0
21 22 0
31 32 33
El usuario puede especicar 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 n umeros enteros negativos
(respectivamente positivos). El siguiente ejemplo ilustra estas caractersticas.
>> diag(a,-1)
ans =
21
32
>> tril(a,-1)
ans =
0 0 0
21 0 0
31 32 0
>> triu(a,0)
ans =
11 12 13
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
56
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 4. Matlab: programacion avanzada


encima de la diagonal superior y l una matriz triangular inferior con todas las entradas de
debajo de la diagonal principal.
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 =
1 0
0 2
>> diag([1 2],1)
ans =
0 1 0
0 0 2
0 0 0
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
0 0 0 5

Trasposicion de matrices
Dada una matriz A, la matriz traspuesta A

es la matriz resultante de intercambiar


las las con las columnas de A. Esto es, las las de A pasan a ser las columnas de A

.
Esta operacion se denota en Matlab con :
>> a=[1 2 3; 0 2 4];
>> a
ans =
57
B
o
r
r
a
d
o
r
4.1 Retorno a las matrices LECCI

ON II
1 0
2 2
3 4
Obviamente, tambien se aplica sobre vectores:
>> b=[1;2;3]; % vector COLUMNA con tres elementos
>> b % vemos ahora un vector FILA
ans =
1 2 3
De nuevo nos encontramos con esta propiedad sobre la que ya hemos incidido: Matlab
distingue entre vectores las y columnas, y esta diferencia se hace especialmente palpable
(y en ocasiones molesta) a la hora de realizar operaciones como productos matriz-vector.
Nota. En Matlab existe tambien el operador .. Sobre matrices reales funciona exac-
tamente igual que el comando anterior, pero no as sobre n umeros complejos. 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


intercambiar las 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
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 con-
struye concatenando las columnas de a. Tecnicamente hablando, nos esta mostrando la
matriz tal como se guarda en memoria. Por ejemplo,
58
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 4. Matlab: programacion avanzada


>> a=[1 2 3; 0 2 4];
>> a(:)
ans =
1
0
2
2
3
4
>> a=a; %trasponemos a
>> a(:)
ans =
1
2
3
0
2
4
Esto puede utilizarse para hacer un par de trucos:
En ocasiones la entrada de una funcion es un vector, sin importar si este es la o
columna.
La instruccion
>> b=b(:);
hara de b un vector columna, sea cual sea su formato inicial. Si lo que se desea es
un vector la, basta con trasponer
>> 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 =
59
B
o
r
r
a
d
o
r
4.1 Retorno a las matrices LECCI

ON II
1 5 9
2 6 10
3 7 11
4 8 12
>> a2=zeros(2,6);
>> a2(:)=a(:)
a2=
1 3 5 7 9 11
2 4 6 8 10 12
Nota. El comando reshape permite modicar las dimensiones de una matriz (o array
en general). Es mas exible que el comando :.
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
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
las 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 estandar
2
,
o por las.
>> a=[1 2 3; 4 5 6]; a2=[1 1 1; 1 1 1];
>> dot(a,a2) % producto por columnas
ans =
5 7 9
2
Recuerda la predileccion de Matlab por las columnas.
60
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 4. Matlab: programacion avanzada


>> dot(a,a2,2) % producto por filas
ans =
6
15
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)
ans =
6
>> sum(a) % suma por columnas
ans =
5 7 9
>> sum(a,2) % suma por filas
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 la si as se le indica
>> v=[-2 -5 -3]; a=[2 3 8; -4 2 9];
>> max(v)
ans=
-2
>> [p,m]=max(abs(v)); [p,m]
61
B
o
r
r
a
d
o
r
4.1 Retorno a las matrices LECCI

ON II
ans =
5 2
>> max(a)
ans =
2 3 9
>> max(a,[],2) % busqueda por filas
ans =
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 tama no
>> 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
las.
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 =
62
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 4. Matlab: programacion avanzada


3.7417 6.0000 3.0000
>> [norm(a) norm(a,1) norm(a,inf)] % normas matriciales
ans =
5.4650 6.0000 7.0000
En la Seccion 5.2.3 comentaremos brevemente la denicion de estas normas.
rank: rango numerico de una matriz. Esto es, el n umero maximo de las o columnas
linealmente independientes
3
.
cond: Calcula norm(a)*norm(inv(a)), el condicionamiento de una matriz
4
. El condi-
cionamiento da una medida de la sensibilidad del sistema a perturbaciones en el
termino independiente.
rcond: estimador del inverso del condicionamiento de una matriz. Es sensiblemente mas
econ omico 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
dot(u, v)
n

i=1
u
i
v
i
.
As,
>> u=[1+i 2+2i]; v=[2 1];
>> dot(u,v)
ans =
4.0000 - 4.0000i
>> dot(v,u)
ans =
4.0000 + 4.0000i

Ejercicio 4.4 Como sumaras los elementos de una matriz?. Como encontraras el mnimo
y el maximo?. Y su posicion?
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
B
o
r
r
a
d
o
r
4.1 Retorno a las matrices LECCI

ON II
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
nitos, teora de grafos,...).
En la Figura 4.1 se puede ver un ejemplo de una matriz sparse simetrica donde los
puntos indican las entradas diferentes de cero. Desde una optica puramente computacional
hace falta desarrollar sistemas de almacenamiento especiales dado que la inmensa mayora
de las entradas no deben ser almacenadas porque son nulas.
Figura 4.1: Diagrama de un matriz sparse 400 400 con 2690 elementos no nulos.
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 =
All zero sparse: 100-by-100
>> a(4,4)=1; a(8,9)=-4; a(80,45)=-1; a(99,100)=4;
>> a
a =
64
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 4. Matlab: programacion avanzada


(4,4) 1
(8,9) -4
(80,45) -1
(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)
a =
(1,1) 1
(2,2) 2
(3,3) 3
(4,4) 4
(5,5) 5
Con full realizamos la operacion inversa: transforma una matriz sparse en una matriz
llena,
>> a=full(a)
a =
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5
La instruccion spalloc tiene un funcionamiento muy similar a sparse. Es util si se sabe
el n umero 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 eciente de la memoria.
El comando nnz (Non zeros) nos informa del n umero 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:
>> a=sparse(10,10);
>> a(1,4)=1; a(2,8)=-4; a(3,9)=1; a(7,8)=5;
>> nnz(a)
ans=
65
B
o
r
r
a
d
o
r
4.2 Argumentos de funciones LECCI

ON II
4
>> spy(a)
La graca 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
* + .* dot
estan asimismo optimizadas. El problema de generar codigo eciente no es tan simple
como pudiera parecer. Por ejemplo, si se aplica la funcion dot a dos vectores sparse es
preciso saber antes que entradas hay que multiplicar. De otra forma podramos estar
dedicando un alto porcentaje de nuestro esfuerzo en simplemente calcular productos por
cero. Afortunadamente, Matlab hace ese trabajo por nosotros.
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-
riores y comprueba con alg un ejemplo como funcionan.
4.2. Argumentos de funciones
Veremos a continuacion como se pueden programar funciones en las que tanto el
n umero de argumentos de entrada como de salida sean variables. Esta caracterstica dota
de una mayor exibilidad a la programacion en Matlab.
Los comandos esenciales que precisamos son
varargin nargin varargout nargout
La instrucciones nargin y nargout informan respectivamente sobre el n umero de variables
de entrada y el n umero de variables de salida (number of input arguments y number of
output arguments).
Una funcion puede aceptar una serie de argumentos jos, al estilo de las funciones que
programamos en la leccion anterior, y un conjunto de argumentos opcionales, que pueden
66
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 4. Matlab: programacion avanzada


ser o no especicados 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.
01 % DESCOMPOSICIONLU
02 %
03 % [L,U] = DESCOMPOSICIONLU(A)
04 % Devuelve U triang superior, L permutacion de una
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
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
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 seg un 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
u =
5
Las variables varargin y varargout son de un tipo especial denominado cell array. En la Leccion
IV estudiaremos su funcionamiento con mas detalle.
67
B
o
r
r
a
d
o
r
4.2 Argumentos de funciones LECCI

ON II
2 4
0 1
>> [l,u,x]=DescomposicionLU(a,[1 2].)
l =
0.5000 1.0000
1.0000 0
u =
2 4
0 1
x =
1
0
>> [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 seg un la
siguiente cabecera
% 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
% 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
68
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 4. Matlab: programacion avanzada


% 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 denida positiva?.
69
B
o
r
r
a
d
o
r
4.2 Argumentos de funciones LECCI

ON II
70
B
o
r
r
a
d
o
r
Captulo 5
Matrices sparse en Matematicas.
Metodos iterativos para sistemas de
ecuaciones lineales
5.1. Metodo de Gauss para matrices sparse
Esta seccion se centra en el estudio del metodo de Gauss para matrices sparse. Mostraremos
los problemas que presenta la aplicacion de este algoritmo a este tipo de matrices, espe-
cialmente 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
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 Hessenberg
1
(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 n umero de operaciones despreciable respecto a las del metodo de
Gauss.
Hemos visto al nal 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
71
B
o
r
r
a
d
o
r
5.1 Metodo de Gauss para matrices sparse LECCI

ON 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, Ux = y,
o en codigo de Matlab
2
[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 ll 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
_

_
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 reeja en un incremento en el n umero de entradas no nulas de la matriz con
los problemas que ello lleva consigo (mayores requerimientos de memoria, mayor costo
computacional,...).
Vamos a ver como podemos reducir este molesto comportamiento con un reorde-
namiento adecuado de las (ecuaciones) y columnas (incognitas). Dado que en aplica-
ciones practicas las matrices simetricas son muy comunes
3
nos restringiremos en lo que
sigue a esta familia de matrices. Con el n de preservar la simetra, cualquier intercambio
de las debe ser seguido por el intercambio de columnas correspondientes:
_

_
x 0 0 x x
0 x x 0 0
0 x x 0 x
x 0 0 x 0
x 0 x 0 x
_

_
1 3

_
x x 0 0 x
x x 0 0 0
0 0 x x x
0 0 x x 0
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.
El algoritmo de mnimo grado por su parte tiende a mover los elementos no nulos hacia el
nal 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) ,= 0 a(j, i) ,= 0. Todo lo que sigue es
igualmente valido para este tipo de matrices.
72
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 5. Matrices sparse en Matematicas. Metodos iterativos


Figura 5.1: Resultado de reordenar las las 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 nitos. Observa como se reduce el n umero de entradas
en las matrices L y U cuando se aplica alguno de los algoritmos anteriores (referido en la
gura 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
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, ja un umbral
para la realizacion del pivotaje parcial. El valor 1 es el de defecto. De esta forma, valores
proximos a cero obligan a que el pivotaje se produzca solo cuando el desequilibrio entre
73
B
o
r
r
a
d
o
r
5.1 Metodo de Gauss para matrices sparse LECCI

ON 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 denidas
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...
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 n umero de las 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 recuper-
arlas en su orden original. Observa que la lnea 03 podra sustituirse simplemente por
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 nales
Si la matriz es ademas simetrica denida positiva podemos utilizar la descomposicion
de Cholesky,
A = LL

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


tivos. El sistema se reduce ahora a dos sistemas triangulares
Ly = b, L

x = y.
La instruccion correspondiente en Matlab es chol, que devuelve R triangular supe-
rior 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...
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
74
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 5. Matrices sparse en Matematicas. Metodos iterativos


x x 0 x 0
x x x 0 x
0 x x 0 0
x 0 0 x 0
0 x 0 0 x
1
2
3
4
5
x x 0 x 0
0 x x x x
0 x x 0 0
0 x 0 x 0
0 x 0 0 x
x x 0 x 0
0 x x x x
0 0 x x x
0 0 x x x
0 0 x x x
x x 0 x 0
0 x x x x
0 0 x x x
0 0 0 x x
0 0 0 x x
x x 0 x 0
0 x x x x
0 0 x x x
0 0 0 x x
0 0 0 0 x
2
5
1
3
4
x 0 0 0 x
0 x x 0 x
0 0 x 0 x
0 0 0 x x
0 0 x x x
x 0 0 0 x
0 x x 0 x
0 x x 0 0
0 0 0 x x
x x 0 x x
x 0 0 0 x
0 x x 0 x
0 x x 0 0
0 0 0 x x
0 x 0 x x
x 0 0 0 x
0 x x 0 x
0 0 x 0 x
0 0 0 x x
0 0 0 x x
x 0 0 0 x
0 x x 0 x
0 0 x 0 x
0 0 0 x x
0 0 0 0 x
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
2
5
1
3
4
2
5
1
3
4
2
5
1
3
4
2
5
1
3
4
Figura 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 reiteradamente
sistemas de ecuaciones con la misma matriz de coecientes al disponer de la de-
scomposicion 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 se nalar no obstante que ambos
se basan en identicar la estructura de una matriz con la de un grafo no dirigido,
donde dos nodos i y j estan conectados si y solo si a(i,j),=0. El proceso de elim-
inaci on 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
la i en la la 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 n umero de nuevos ejes
creados (Figura 5.2).
Los gracos de la Figura 5.1 han sido creados a traves del siguiente chero script.
% Calculamos la matriz de elementos finitos para
% un problema sobre un dominio en forma de L
[p,e,t]=initmesh(lshapeg,Hmax,0.2); % malla inicial
75
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON 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
figure(1)
subplot(331); spy(a); title(matriz original)
subplot(332); spy(l); title(matriz L)
subplot(333); spy(u); title(matriz U)
% Segunda fila de dibujos
p=symrcm(a); % reordenamiento filas y columnas
[l,u]=lu(a(p,p),0);
figure(1)
subplot(334); spy(a(p,p)); title(matriz permutada con symrcm)
subplot(335); spy(l); title(matriz L)
subplot(336); spy(u); title(matriz U)
% Tercera fila de dibujos
p=symmmd(a); % reordenamiento filas y columnas
[l,u]=lu(a(p,p),0);
figure(1)
subplot(337); spy(a(p,p)); title(matriz permutada con symmmd)
subplot(338); spy(l); title(matriz L)
subplot(339); spy(u); title(matriz U)
5.2. Metodos iterativos para sistemas lineales
Cuando un sistema de ecuaciones lineales es de tama no moderado
4
, casi nadie duda
en utilizar el metodo de Gauss en alguna de sus m ultiples variantes (incluidas las de-
scomposiciones 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 dicultades:
Es caro: O(4n
3
/3) operaciones
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 denir que se entiende por tama no moderado. Ciertamente, tama nos enormes en la decada
de los a nos 70 son ahora perfectamente manejables en un peque no PC.
76
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 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 dicultades.
5.2.1. Denicion
Esencialmente, un metodo iterativo toma un sistema lineal
Ax = b
y construye una sucesion de vectores de forma que
x
m
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
desventajas:
No siempre convergen en un n umero 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
encontrar las hipotesis que aseguran la convergencia de un metodo iterativo. Por ejemplo,
se puede saber que una matriz es denida 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 modican 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 redondeo
5
.
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 a un 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.
77
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON 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 prejada. Por tanto debemos jar un criterio de
parada que de por terminado el metodo cuando la solucion se considere sucientemente
buena. Esto no es grave. Los sistemas de ecuaciones lineales suelen provenir de metodos
que calculan soluciones aproximadas de problemas fsicos e ingenieriles. No tiene pues
sentido obcecarse en calcular la solucion exacta de un problema aproximado.
As hemos de elegir un criterio de parada que termine la ejecucion cuando la solucion
es sucientemente buena. Una posibilidad es medir la diferencia entre dos iteraciones
consecutivas
|x
m+1
x
m
|
en alguna norma que queda a eleccion del programador o del usuario. Si la diferencia es
peque na, se considera que estamos cerca de la solucion y se naliza el metodo.
De nuevo nos encontramos con el problema de denir peque no. Por ejemplo, una
diferencia de 1.4 entre dos iteraciones puede ser grande si la solucion tiene un tama no
|x| 10
1
o peque na si |x| 10
10
.
Por ello se puede hacer un promedio entre el error absoluto y el relativo. Concreta-
mente, si x e y son dos iteraciones consecutivas, se puede jar 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 jan el criterio de parada y pueden ser dados
por el usuario.
Otros criterios se basan en calcular r = bAx y calcular el tama no. Es decir, medimos
cuanto le falta a x para ser solucion del sistema. El vector r recibe el nombre de residuo.
Nos encontramos de nuevo con dos componentes del residuo, el primero relacionado
con su tama no 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
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 innito. Es decir, jar un n umero maximo de iteraciones de forma que
si se supera, se termine el metodo con un mensaje de error
6
. Que un residuo sea peque no
6
Existe otro problema: que la solucion crezca de forma que supere la cantidad maxima representable
en coma otante (overow). Matlab devolvera inf o -inf.
78
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 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 se nal.
5.2.3. Metodos iterativos clasicos
El estudio y desarrollo de los metodos iterativos clasicos, tambien denominados anes
por su forma de construccion, surgio con fuerza en los a nos 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
anes 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 pop-
ular. De hecho, los metodos clasicos se utilizan en la actualidad como precondicionadores
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 dise no y funcionamiento de un metodo iterativo fundamentan su exposicion en estos
apuntes.
Conocimientos previos
Comenzaremos introduciendo algunas normas vectoriales que nos serviran para medir
el tama no de los vectores y matrices. Dado un vector
x := (x
1
, x
2
, . . . , x
n
)

R
n
consideramos las normas
|x|
1
:= [x
1
[ +[x
2
[ +. . . +[x
n
[, |x|
2
:=
_
x
2
1
+x
2
2
+. . . +x
2
n
,
|x|

:= max
i=1,...,n
[x
i
[.
Es facil ver que efectivamente las tres expresiones denen una norma en R
n
. Las relaciones
entre ellas vienen dadas por las cotas
|x|
2
|x|
1

n|x|
2
, |x|

|x|
1
n|x|

, |x|

|x|
2

n|x|

.
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 dene a su vez una norma sobre las matrices
|A| = sup
x=1
|Ax|
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
|A|
1
= max
j=1,...,n
n

i=1
[a
ij
[, |A|

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

j=1
[a
ij
[.
79
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON II
La norma | |
2
tiene una expresion mas complicada que diculta su calculo practico. En
concreto
|A|
2
=
_
(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
|A|
2
= (A).
En cualquier caso, el comando norm de Matlab aplicado a matrices devuelve las corre-
spondientes 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
|Ax|
. .
norma vectorial
|A|
..
norma matricial
|x|
..
norma vectorial
.
Es decir, |A| mide el maximo alargamiento que multiplicar por A puede producir en un
vector medido en la norma | |.
Denicion y condiciones de convergencia
Los metodos iterativos lineales (o basados en iteraciones anes) comienzan consideran-
do una particion de A tal que
A = M N
con M invertible. As, si x es solucion de Ax = b,
Mx = Nx +b.
El metodo iterativo consiste en
Tomar x
0
una aproximacion de la solucion. Si no se conoce se puede tomar por
ejemplo el vector nulo.
Resolver en cada paso m
Mx
m+1
= Nx
m
+b. (5.1)
Es facil ver que si la sucesion construida en (5.1) converge a alg un x, entonces el vector
es la solucion del sistema. A un es mas, se comprueba facilmente que
x
m+k+1
x = (M
1
N)(x
m+k
x) = . . . = (M
1
N)
k
(x
m+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 |B
k
| < 1.
80
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 5. Matrices sparse en Matematicas. Metodos iterativos


Observa que en el resultado anterior no se especica la norma utilizada. Otro detalle al
que a veces se presta poca atencion es que la convergencia del metodo ocurre sea cual sea
x
0
, es decir, independientemente de como se arranque el metodo y 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 convergencia
7
.
No es difcil ver que
(B) |B|
para cualquier norma inducida, y por tanto
8
(B) = ((B
k
))
1/k
(|B
k
|)
1/k
k N.
Es mas, se puede probar que, de nuevo para toda norma inducida,
lm
k
|B
k
|
1/k
= (B)
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.
Teorema 5.2 El metodo iterativo converge si y solo si (B) < 1.
Los resultados anteriores pueden utilizarse para probar que
|x
m+1
x| C(m)(B)
m
|x
1
x
0
|
para todo m m
0
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 justica esta denominacion dado que mide la reduccion media del error esperada
en cada iteracion.
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 tama no peque no comparado con M. Por
otro lado, se debe tener en cuenta la denicion del metodo (5.1) y que por tanto en cada
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 sucientemente cerca de la solucion.
8
Si es valor propio de B,
2
lo es de A
2
.
81
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON II
Metodos de Jacobi, de GaussSeidel y de relajacion de Young
Sea el sistema Ax = b donde
A =
_

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

_
La familia de metodos que vamos a exponer se basa en considerar la siguiente descom-
posicion de A
A = D L U
donde
D =
_

_
a
11
a
22
.
.
.
a
nn
_

_
, L =
_

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

_
, U =
_

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

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

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

j=i
a
ij
x
(m)
j
_
, i = 1, . . . , n.
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 las si
[a
ii
[ >

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

i=j
[a
ij
[, j.
Teorema 5.3 Si la matriz es estrictamente diagonal dominante por las 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 = D
1
(L+U). Probar que |B|

< 1 si es dominante por las


o |B|
1
< 1 si es dominante por columnas. Aplicando el Teorema 5.2, se deduce el resultado.)
82
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 5. Matrices sparse en Matematicas. Metodos iterativos


Para dar una descripcion del metodo de Jacobi en pseudocodigo jamos
x = aproximacion inicial, mmax = n umero 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
(podamos tomar por ejemplo la norma 2 o la norma innito).
Una primera version de nuestro algoritmo es la siguiente
Jacobi
01 for m=1:mmax
02 error=0; y=x
03 for i=1:n
04 x
i
=
_
b
i

j=1
j=i
a
ij
y
j
_
/a
ii
05 end
06 if |x y|
2
<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.
Solucion. Empezaremos jando 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
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
83
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON 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
19 % valores por defecto
20 n=length(a); mmax=100;
21 eps1=1e-4; % tolerancia absoluta
22 eps2=1e-4; % tolerancia relativa
23 x=zeros(n,1);
24 if nargin>2
25 mmax=varargin{1};
26 end
27 if nargin>3
28 eps1=varargin{2};
29 end
30 if nargin>4
31 eps2=varargin{3};
32 end
33 if nargin>5
34 x(:)=varargin{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
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)
53 end
54
55 %salida
56
57 if (nargout>1)
58 varargout{1}=m;
84
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 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 nalizado la ejecucion del metodo y pasando a la parte del codigo
encargada de devolver los resultados obtenidos.

Ejercicio 5.3 Programa una nueva opcion de salida que devuelva un vector error de lon-
gitud m1 de forma que error(m) sea la diferencia entre x
m
y x
m+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
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 metodo
9
?
El metodo de GaussSeidel
10
consiste en tomar M = D L y N = U, es decir
(D L)x
m+1
= Ux
m
+b. (5.2)
Para calcular x
m+1
hay que resolver un sistema, en este caso triangular. Repasando con
cuidado las operaciones, observamos que
x
(m+1)
i
=
1
a
ii
_
b
i

i1

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

n

j=i+1
a
ij
x
(m)
j
_
, i = 1, . . . , n.
9
Deberas probar con matrices grandes. La orden rand te puede servir para ese n. 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. Seg un diversos autores (ej. George E. Forsythe o Gerard
Meurant), Carl Friedrich Gauss no dise no exactamente este metodo y Philipp Ludwig von Seidel, que lo
estudio a nales 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.
85
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON II
Escrito en forma algortmica,
GaussSeidel
01 for m=1:mmax
02 error=0; y=x
03 for i=1:n
04 x
i
=
_
b
i

i1

j=1
a
ij
x
j

j=i+1
a
ij
y
j
_
/a
ii
05 end
06 if |x y|<eps1+eps2*norm(x)
07 return
08 end
09 end
10 disp(numero maximo de iteraciones alcanzado)
11 return
As pues, la unica diferencia con el metodo de Jacobi es que GaussSeidel procede a
utilizar la nueva componente calculada x
i
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 armacion.
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
la matriz es estrictamente diagonal dominante por las o columnas;
o
la matriz es simetrica denida positiva.
Ejercicio 5.5 Programa el metodo de GaussSeidel modicando 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
x=l\(b-u*y)
o bien con el doble n umero de operaciones con
x=y+l\(b-a*y)
donde
86
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 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)
Ejercicio 5.7 El metodo de GaussSeidel tiene una curiosa asimetra: la primera componente
de cada x
m+1
se calcula utilizando los valores de la anterior iteracion x
m
, mientras que la ultima
componente utiliza todas las componentes de la nueva iteracion x
m+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
se nalada en el ejercicio anterior. Consiste en encajar dos iteraciones, una con GaussSeidel y
otra con el metodo de GaussSeidel inverso. Es decir, dado x
m
, se aplica un paso del metodo
de GaussSeidel para obtener un nuevo vector x
m+1/2
. Seguidamente se calcula un paso del
metodo GaussSeidel inverso y asse obtiene la nueva aproximacion x
m+1
.
Implementa este metodo. Se reduce el n umero 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
modicaci on del metodo de GaussSeidel que trataba, como buena parte de los metodos
propuestos en estos a nos, de acelerar la convergencia de los metodos de GaussSeidel y
Jacobi.
La modicacion propuesta consiste en realizar un promedio sobre la aproximacion que
proporcionara GaussSeidel y la iteracion anterior.
Concretamente, la expresion es
x
(m+1)
i
= (1 )x
(m)
i
+

a
ii
_
b
i

i1

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

n

j=i+1
a
ij
x
(m)
j
_
, i = 1, . . . , n.
Si = 1 recuperamos el metodo de 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 denida positiva o tridiagonal el metodo de relajacion converge
para cualquier (0, 2). Tambien converge si es estrictamente diagonal dominante (por
las o columnas). Sin embargo, salvo para matrices tridiagonales, poco se puede decir
acerca de la eleccion optima del parametro , y a un 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).
87
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON II
Por ultimo, aunque no sea inmediato, se puede comprobar que este metodo encaja en
el marco anterior, sin mas que tomar
M =
1

D L, N =
1

D +U
Ejercicio 5.9 Implementa el metodo de relajacion de Young a partir del metodo de Gauss
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
facilitaran la exposicion de los metodos de tipo gradiente.
Recordemos que todos los vectores se consideran como vectores columna. Dada A una
matriz simetrica denida positiva, la operacion que a cada par de vectores x, y le
asigna el n umero real
x

Ay
es un producto escalar, esto es, cumple las propiedades que denen un producto escalar
11
:
1. (x +y)

Az = x

Az +y

Az, , R, x, y, z R
n
;
2. x

Ay = y

Ax, x, y R
n
(por ser A simetrica);
3. x

Ax > 0, si x ,= 0 (por ser A denida positiva).


En particular, si I
n
es la identidad n n,
x

I
n
y = x

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

y = 0
y diremos en este caso que x e y son ortogonales. La misma notacion se puede extender
al producto denido por A, de forma que
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 R
n
) depen-
den unicamente de que se cumplan estas tres propiedades y por tanto son extensibles a estos casos mas
generales.
88
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 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
|x|
A
:=

Ax.
Todas las normas son equivalentes en R
n
, pero para esta norma se tiene ademas la esti-
macion

n
|x|
2
|x|
A

1
|x|
2
donde
1

2
....
n
> 0 son los valores propios, todos reales por ser A simetrica y
positivos por ser denida positiva. La cantidad
(A) =

1

n
,
que sera relevante en lo que sigue, es el condicionamiento de la matriz
12
. Obviamente,
(A) 1.
Construimos la funcion
F(x) =
1
2
x

Ax x

b
conocida como funcional de energa. Tras unos simples calculos, se comprueba que
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 denida 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
denida positiva para que estos argumentos sean validos.
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 aprox-
imacion, jamos una direccion de desplazamiento, calculamos cuanto nos movemos, de-
scender en el lenguaje habitual, y nos desplazamos a un nuevo punto.
De esta forma construimos una sucesion x
m
que debera converger a x, siguiendo estos
pasos.
Calcular una direccion de descenso d
m
.
Descender una cantidad
m
, tomando como nueva aproximacion
x
m+1
= x
m
+
m
d
m
.
12
El condicionamiento se dene tambien para matrices arbitrarias reemplazando los valores propios por
los denominados valores singulares, o mas en general, deniendolo como el producto de la norma de A
por la norma de su inversa. En general el condicionamiento de la matriz mide la sensibilidad del sistema
de ecuaciones lineales asociado a variaciones del termino independiente.
89
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON 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
continuaci on, se toma
m
de forma que
F(x
m+1
) = mn
R
F(x
m
+d
m
)
es decir, se trata de minimizar, una vez escogida la direccion de descenso d
m
, el funcional
de energa. Deniendo
g() = F(x
m
+d
m
)
podemos comprobar que
g

() = d

m
Ad
m
d

m
(b Ax
m
)
. .
r
m
y por tanto la cantidad de descenso viene dada por

m
:=
r

m
d
m
d

m
Ad
m
, (5.3)
(obtenido al imponer g

() = 0). El vector r
m
= b Ax
m
es el residuo de x
m
, que ya
ha surgido en estas notas. Se puede probar facilmente que
r
m+1
= b Ax
m+1
= b Ax
m

m
Ad
m
= r
m

m
Ad
m
.
En consecuencia, el residuo en pasos sucesivos satisface una relacion similar a la que
cumple x
m
. Sin embargo, este tipo de recurrencia puede verse afectada por errores de
redondeo, por lo que en ocasiones el residuo se recalcula cada cierto n umero de iteraciones
de acuerdo a su denicion para cancelar cualquier error de redondeo.
El algoritmo resultante es el siguiente:
Metodo de descenso
01 x
0
inicial, r
0
= b
0
Ax
0
02 for m=0:mmax
03 Escoger d
m
04
m
:=
r

m
d
m
d

m
Ad
m
05 x
m+1
= x
m
+
m
d
m
06 r
m+1
= r
m

m
Ad
m
07 end
Claramente, la lnea 03 queda pendiente y en ultima medida dene el metodo.
90
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 5. Matrices sparse en Matematicas. Metodos iterativos


Metodo del Gradiente
Dado que F(x
m
) = b Ax
m
= r
m
, la direccion de maximo descenso es la del
residuo. Por tanto, esta parece una buena eleccion para d
m
. El metodo as denido es el
metodo del gradiente.
Metodo del Gradiente
01 x
0
inicial; r
0
= b Ax
0
;
02 for m=0:mmax
03 p
m
= Ar
m
04
m
=
r

m
r
m
r

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

m
p
m
07 if |r
m+1
| eps|b|
08 break
09 end
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 tama no
relativo del residuo (eps|b|). 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
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)
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
91
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON 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
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
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
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
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 denida positiva (nota:
para toda matriz B, B

B es simetrica (semi) denida positiva.)


92
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 5. Matrices sparse en Matematicas. Metodos iterativos

La graca 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);
>> semilogy(r)
Hemos utilizado una escala logartmica para medir la norma del residuo. Observa su fuerte
comportamiento oscilatorio.
0 10 20 30 40 50 60 70
10
2
10
1
10
0
10
1
10
2
10
3
10
4
Residuo
Iteraciones
Figura 5.3: Historial del residuo para el metodo del Gradiente.
Ejercicio 5.12 En este ejercicio tratamos de nuevo aspectos de la implementacion en Mat-
lab. Concretamente, que pasa si el usuario desea especicar el vector de arranque (x
0
en
la notacion del metodo) pero desea dejar el n umero 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)
especicara la tolerancia pero no el n umero maximo de iteraciones. Implementa las modi-
caciones necesarias en el programa anterior para que la funcion soporte este estandar.
(Ayuda: La funcion isempty puede resultarte util.)
Breves notas sobre el estudio del Metodo del Gradiente
La clave del analisis es la relacion
F(x
m+1
) F(x) =
1
2
(x
m+1
x)

A(x
m+1
x) =
1
2
| x
m+1
x
. .
e
m+1
|
2
A
93
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON II
donde claramente e
m+1
es el error entre la solucion exacta y la numerica medido en la
norma de energa de A. Por tanto, como F(x
m+1
) F(x
m
),
|e
m+1
|
A
|e
m
|
A
luego en cada iteracion hay una reduccion del error en la norma de energa. Sin embargo,
en ning un caso implica que el residuo se reduzca en cada iteracion, como bien podemos
comprobar en la Figura 5.3. A un es mas, de la eleccion hecha de
m
se sigue que
F(x
m+1
) := mn
R
F(x
m
+r
m
)
y por tanto
|e
m+1
|
A
mn
R
|x x
m
r
m
|
A
= mn
R
|e
m
Ae
m
|
A

_
mn
R
|I A|
A
_
|e
m
|
A
.
Observa que hemos utilizado la cota |Mx|
A
|M|
A
|x|
A
, caracterstica de toda norma
vectorial y su norma matricial inducida.
Proposicion 5.5 Sean
1
y
n
el mayor y menor valor propio de A. Entonces
mn
R
|I A|
A
= mn
R
|I A|
2
=

1

1
+
n
< 1.
La convergencia se escribe de forma muy comoda en terminos del condicionamiento
de la matriz (A) =

1

n
, deduciendo la expresion
|e
m+1
|
A

(A) 1
(A) + 1
|e
m
|
A
.
Es inmediato observar que
El factor de reduccion del error es siempre menor que uno, luego hay convergencia
para toda A simetrica denida positiva.
Si (A) >> 1, la convergencia puede ser muy lenta.
Ejercicio 5.13 (puramente matematico) Se puede probar que dada A simetrica denida
positiva existe B simetrica denida positiva tal que BB

= B
2
= A, conocida como raz
cuadrada de A. Utilizando este resultado prueba la identidad
|I A|
A
= |I A|
2
utilizada en la Proposicion 5.5.
(Ayuda: Observa que |x|
A
= |Bx|
2
. Utiliza ahora que
|I A|
A
= sup
x
A
=1
|(I A)x|
A
= sup
Bx=1
|B(I A)B
1
(Bx)|
2
y completa la demostracion).
94
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 5. Matrices sparse en Matematicas. Metodos iterativos


Ejercicio 5.14 (demostracion de la Proposicion 5.5) Para toda matriz simetrica C
se cumple que
|C|
2
= max
j
[
j
[
con
j
el valor propio jesimo. Por tanto
|I A|
A
= |I A|
2
= max
j
[1
j
[.
Dene g
c
() = [1 c [ y traza la graca de estas funciones para varios valores de c. Deduce
que = 2/(
1
+
n
) es el valor que hace mnimo |I A|
2
y que para este valor,
|I A|
2
=

1

1
+
n
.
(Ayuda: al dibujar g
c
() para diferentes valores de c obtendras obtendras algo similar a esto
0 1 2 3 4 5
0
0.5
1

Cuales son las gracas de los valores extremos?)
El Gradiente Conjugado
El metodo del Gradiente Conjugado trata de resolver alguna de las dicultades obser-
vadas con el metodo del Gradiente, como por ejemplo el comportamiento oscilatorio del
residuo.
Observemos que en un metodo de descenso, y por la eleccion de
m
hecha en (5.3),
r

m+1
d
m
= r

m
d
m

m
d

m
Ad
m
= 0,
por lo que r
m+1
d
m
. Esto es, en un metodo de descenso el residuo del paso m + 1 es
ortogonal a la direccion de descenso anterior.
Sin embargo, en general ya no es cierto que
r
m+1
d
m1
(5.4)
y por tanto se pierde esta propiedad de ortogonalidad.
95
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON II
Una forma de evitar, o de mitigar, el aspecto oscilante del metodo del Gradiente, es
exigir que la direccion de descenso d
m
satisfaga (5.4). Es decir, tomamos
r
m+1
= r
m

m
Ad
m
,
y concluimos que
d

m1
r
m+1
= 0 d
m1
Ad
m
d
m1

A
d
m
.
En vista de lo anterior optamos por tomar como direccion de descenso una perturbacion
de la direccion natural r
m
(el residuo) en la direccion del descenso anterior (d
m1
) que
satisfaga la propiedad de ortogonalidad anterior. Es decir, tomamos
d
m
= r
m
+
m
d
m1
con
m
adecuado. Exigiendo que se satisfaga (5.4) deducimos que
d
m

A
d
m1
r

m
Ad
m1
+
m
d

m1
Ad
m1
= 0
m
=
r

m
Ad
m1
d

m1
Ad
m1
.
Como eleccion inicial de la direccion de descenso tomamos simplemente r
0
, 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 x
0
inicial; r
0
= b Ax
0
; d
0
= r
0
;
02 for m=0:mmax
03 p
m
= Ad
m
04
m
=
r

m
d
m
d

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

m
p
m
07 if |r
m+1
| eps|b|
08 break
09 end
10
m+1
=
r

m+1
p
m
d

m
p
m
11 d
m+1
= r
m+1
+
m+1
d
m
12 end
13 disp(Numero maximo de iteraciones alcanzado)
Como puede verse, las modicaciones sobre el metodo del Gradiente son mnimas
y estan concentradas en las lneas 04, 10 y 11. En cuanto al n umero de operaciones,
96
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 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.
Lema 5.6 Para todo m 0
r

m
d
m
= r

m
r
m
.
Por tanto

m
=
r

m
r
m
d

m
Ad
m
.
Demostracion. Como r
m
d
m1
,
r

m
d
m
= r

m
r
m
+
m
r

m
d
m1
. .
=0
. (5.5)
El segundo resultado es inmediato de la denicion de
m
.
Lema 5.7 Para todo m 0 se satisfacen las siguientes relaciones
i) d
m+1

A
d
m
.
ii) r
m+1
d
m
, r
m+1
d
m1
.
iii) r
m+1
r
m
.
Demostracion. Los puntos i) y ii) ya se han probado. Para probar iii) basta comprobar
que
r

m+1
r
m
= r

m
r
m

m
d

m
Ar
m
= r

m
r
m

m
d

m
Ad
m
+
m

m
d

m
Ad
m1
. .
=0
= r

m
r
m

m
d

m
Ad
m
.
El resultado es ahora una consecuencia del Lema 5.6.
Lema 5.8 Para todo m 0

m+1
:=
r

m+1
r
m+1
r

m
r
m
.
Demostracion. Como
Ad
m
=
1

m
(r
m+1
r
m
),
se tiene

m+1
=
r

m+1
Ad
m
d

m
Ad
m
=
1

m
r

m+1
(r
m+1
r
m
)
d

m
Ad
m
=
1

m
r

m+1
r
m+1
d

m
Ad
m
=
r

m+1
r
m+1
r

m
r
m
donde hemos utilizado que r
m+1
r
m
, 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
r
m
es conocido del paso anterior y por tanto no es preciso
calcularlo de nuevo. En total dos productos escalares por iteracion.
97
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON II
Ejercicio 5.15 Modica 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 Gradi-
ente Conjugado, es que estas propiedades de ortogonalidad se extienden a todo el conjunto
de residuos y direcciones generados en los pasos anteriores.
Lema 5.9 Para todo m n
i) d
m

A
d

, m1;
ii) r
m+1
d

, m;
iii) r
m+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 R
n
y por tanto r
n+1
= 0. Sin embargo, en aplicaciones practicas puede requerir mas
de n iteraciones por los errores introducidos por la precision de la maquina.
Ejercicio 5.16 Modica 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
0 2 4 6 8 10 12 14
10
2
10
1
10
0
10
1
10
2
10
3
10
4
Residuo
Iteraciones
Figura 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.
98
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 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
numerico mas elaborado, generalmente obtenido mediante modicaciones intuitivas de
algoritmos mas simples, puede requerir un analisis nada trivial. Tampoco es extra na la
situacion contraria: un metodo puede fallar por razones no inmediatamente comprensibles.
En la demostracion juega un papel muy importante el subespacio
/
m
(A, r
0
) := Rr
0
, Ar
0
, . . . , A
m
r
0
)
esto es, el subespacio formado por todas las combinaciones lineales

0
r
0
+
1
Ar
1
+. . . +
m
A
m
r
0
,
i
R.
Estos subespacios reciben el nombre de subespacios de Krylov y son clave en multitud
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 /
m
(A, r
0
), entonces Aq /
m+1
(A, r
0
). Es decir, A/
m
(A, r
0
) /
m+1
(A, r
0
).
3. Si /
m
(A, r
0
) = /
m+1
(A, r
0
), entonces /
m
(A, r
0
) = /
m+1
(A, r
0
) = /
m+2
(A, r
0
) = ...
4. Es facil comprobar que r
m
, d
m
/
m
(A, r
0
).
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 r
0
= d
0
y por tanto ii) y iii) coinciden).
Supongamos pues que el resultado esta probado para m. Concretamente, supongamos que
para m
i) d
m

A
d

, m1 y d
0
, d
1
, . . . , d
m
es una base de /
m
(A, r
0
).
ii) r
m+1
d

, m.
iii) r
m+1
r

, m y r
0
, r
1
, . . . , r
m+1
es una base ortogonal de /
m+1
(A, r
0
).
Veamos que los puntos i)iii) se satisfacen entonces para m + 1.
i) d
m+1

A
d

, m:
99
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON II
Este resultado esta probado ya para = m. Para m1, utilizamos que
d
m+1
= r
m+1
+
m+1
d
m
.
Por tanto, basta probar que
r
m+1

A
r

, d
m

A
d

.
El segundo es ya conocido (hipotesis de induccion). Por otro lado
r
m+1

A
r

r
m+1
Ar

.
Como Ar

/
+1
(A, r
0
) y una base de este subespacio es r
0
, r
1
, . . . , r
+1
,
concluimos que
Ar

=
0
r
0
+
1
r
1
+. . . +
+1
r
+1
con
j
R adecuados. El resultado se sigue ahora de iii) puesto que r
m+1
r
k
,
para todo k m.
Por ultimo si d
m+1
,= 0 entonces d
0
, . . . , d
m+1
es una base de /
m+1
(A, r
0
) por
ser Aortogonales y por tanto linealmente independientes.
ii) r
m+2
d

, m + 1
Para = m, m + 1 es cierto por construccion (vease Lema 5.7). Para el resto de
valores m1, utilizamos
r
m+2
= r
m+1

m+1
Ad
m+1
.
Por induccion, r
m+1
d

, mientras que para el otro termino observamos que


(Ad
m+1
) d

d
m+1

A
d

,
y esto es lo que acabamos de probar en el apartado anterior.
iii) r
m+2
r

, m + 1.
Tomemos m. Entonces
r
m+2
r

(r
m+1

m+1
Ad
m+1
) r

(Ad
m+1
) r

(d
m+1
)
A
r

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

(A, r
0
), por el punto i) podemos escribir
r

=
0
d
0
+
1
d
1
+. . . +

. (5.6)
El resultado se sigue de la propiedad i) ya que d
m+1

A
d
k
para k m. Final-
mente, si r
m+1
,= 0 entonces r
0
, . . . , r
m+1
es una base de /
m+1
(A, r
0
) por ser
ortogonales.
100
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 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 r
m+1
o d
m+1
sean nulos. En cualquiera de estos casos
/
m
(A, r
0
) = /
m+1
(A, r
0
).
Ahora bien esto sucede si y solo si ha habido convergencia en el paso m (si d
m+1
= 0 y
por tanto r
m
= 0) o en el paso m + 1 (si r
m+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 nales
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. Seg un cuenta Marvin Stein
13
, un estudiante postdoctoral en aquellos a nos 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
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 trabajando
14
.
Hemos visto que el metodo del Gradiente Conjugado es un metodo directo, en tanto
en cuanto da la solucion en un n umero nito de pasos, concretamente n, el n umero de las
de la matriz. Sin embargo, se programa como un metodo iterativo, de forma que se busca
la convergencia en muchas menos iteraciones. En cada iteracion se tiene la estimacion
|e
m+1
|
A
2
_
_
(A) 1
_
(A) + 1
_
m
|e
0
|
A
donde de nuevo e
m
:= x
m
x es el error en el paso mesimo y e
0
el error inicial.
El resultado anterior es algo incompleto pero sirve para hacer patente la sensibilidad
del metodo ante el condicionamiento de una matriz que, aunque menor que en el caso del
metodo del Gradiente (por la raz cuadrada), sigue siendo importante. Si la matriz 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 vol umenes nitos, suelen ser, ademas de matrices sparse, mal condicionadas,
por lo que el metodo del Gradiente Conjugado requiere de bastantes iteraciones
15
.
Estas razones hicieron que el Gradiente Conjugado se tomara como un metodo mas,
sin concederle especial relevancia y confundiendose con la multitud de metodos para la
resolucion de sistemas de ecuaciones lineales que 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 a no 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 otando en el ambiente a la espera de que
alguien diera el paso nal de plasmarlas.
15
O(n
1/3
) en problemas en 3D, O(n
1/2
) en 2D es un comportamiento tpico.
101
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON II
situacion se prolongo durante casi 20 a nos hasta que las ideas del precondicionamien-
to cambiaron radicalmente esta situacion y encumbraron al Gradiente Conjugado a su
posicion actual
16
.
El precondicionamiento consiste, a grandes rasgos, en cambiar el sistema por uno
equivalente
17
Ax = b, L
1
AL

. .
B
y = L
1
b
. .
c
, x = L

y
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 L
1
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 coecientes. 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.
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 alg un sentido. Por tanto, L


1
AL

I
n
y su condicionamiento
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 denida positiva proveniente de resolver la ecuacion
de Poisson (una ecuacion en derivadas parciales) por el metodo de elementos nitos en un
16
La American Mathematic Society lo sit uo entre los diez algoritmos mas relevantes del siglo XX, junto
con, por ejemplo, la Transformada Rapida de Fourier (FFT) o el algoritmo QR para el calculo de valores
y vectores propios.
17
Utilizamos la notacion L

= (L
1
)

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


invertir).
102
B
o
r
r
a
d
o
r
LECCI

ON II Cap

tulo 5. Matrices sparse en Matematicas. Metodos iterativos


0 50 100 150 200 250
10
8
10
7
10
6
10
5
10
4
10
3
10
2
10
1
10
0
Metodo del gradiente
sin precondicionar
precondicionado
Residuo
Iteraciones
Figura 5.5: Efecto del en el Gradiente Conjugado.
dominio en forma de L. La matriz tiene aproximadamente 2100 las con 14500 elementos no
nulos
18
.
Con el comando spy se puede ver la forma de a, su tama no y el n umero de entradas
no nulas. Aplica el comando pcg que contiene implementado el Gradiente Conjugado. Por
ejemplo, con
>>[x,flag, relres,iter,resvec] = pcg(a,b,1e-7,100);
aplicas el metodo con una tolerancia relativa de 10
7
y un n umero maximo de 100 iteraciones.
En relres se recoge el residuo relativo de la solucion calculada (|bAx|/|b|), en resvec
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 n umero 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 n umero de iteraciones maximas o disminuir la tolerancia
para obtener convergencia.
A continuacion vamos a utilizar un precondicionador muy sencillo basado en la descom-
posicion de Cholesky incompleta. Teclea
>> R=cholinc(a,0);
De nuevo, con los comandos habituales puedes ver tanto la forma como el n umero de entradas
no nulas de R.
Modicando las instrucciones anteriores con
18
Por cierto, el logo de Matlab es la solucion de un problema de este tipo.
103
B
o
r
r
a
d
o
r
5.2 Metodos iterativos para sistemas lineales LECCI

ON 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
n umero de iteraciones? (ver iter2). Y el tiempo de calculo?. Puedes ser ahora mas exigente
con la tolerancia?.
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.
104
B
o
r
r
a
d
o
r
Leccion III
Funciones como argumento. Recursividad
Formulas de cuadratura. FFT
105
B
o
r
r
a
d
o
r
B
o
r
r
a
d
o
r
Introduccion
Hobbes clearly proves that every creature
Lives in a state of war by nature;
So naturalists observe a ea
Has smaller eas that on him prey,
And these have smaller still to biteem,
And so proceed ad innitum.
Swift, Poetry: a Rhapsody
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 denir
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 medi-
ante la transformada rapida de Fourier (FFT). La implementacion de estos algoritmos
servira de ilustracion de las estrategias de recursividad, que sirven para obtener un codigo
simple y legible.
107
B
o
r
r
a
d
o
r
108
B
o
r
r
a
d
o
r
Captulo 6
Matlab: Funciones como argumentos.
Recursividad
6.1. Funciones inline
En la seccion 3.2 de la Leccion I mostramos la denicion de funciones mediante cheros
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);
dene la funcion f(x) = e
x
sen(x). Para evaluar se procede igual
>> f(2)
ans =
0.1231
A efectos practicos, inline es equivalente a editar una funcion con nombre f y a escribir
el correspondiente codigo. La denicion 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-files
1
. Sin embargo puede resultar util para
tareas sencillas tanto en el modo comando como en el codigo de una subrutina.
Nada impide denir funciones con mas argumentos,
>> g=inline(x*cos(y)-y*cos(x),x,y);
Los ultimos argumentos del comando inline denen las variables de la funcion. Si no se
especican, Matlab trata de reconocer cuales son las variables y las ordena alfabeticamente:
1
En el men u, 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.
109
B
o
r
r
a
d
o
r
6.1 Funciones inline LECCI

ON III
>> g=inline(x^2*cos(y)-y*cos(x)*z);
>> g
g =
Inline function:
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 especicar el orden de las variables en la denicion de la funcion:
>> f=inline(x*cos(k*x))
f =
Inline function:
f(k,x) = x*cos(k*x)
>> 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 act uan 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
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 =
Inline function:
g(x,y,z) = x^2*cos(y)-y*cos(x)*z
>> g= vectorize(g)
110
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 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 redene la funcion a nadiendo .
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
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
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
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:
111
B
o
r
r
a
d
o
r
6.2 Funciones como argumentos LECCI

ON 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 chero m-le en la
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 n umero suciente de puntos esto basta
para obtener una buena graca. Este comando es una de las salidas gracas mas simples de
Matlab y admite una amplia variedad de argumentos opcionales que controlan el aspecto
nal del dibujo. En una leccion posterior (Leccion V) veremos este comando y otros
relacionados con las salidas gracas.
Ejercicio 6.1 Modicar 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 graca (lnea continua, lnea a trozos,
raya-punto, solo puntos,...), el color,...
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 denir de forma recursiva
n! =
_
n (n 1)!, si n > 0,
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.
112
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 6. Matlab: Funciones como argumentos. Recursividad


01 % FACT
02 %
03 % FACT(N) devuelve n!
04 %
05
06 function f=fact(n)
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
que en Matlab se encuentra implementada en una funcion con el mismo nombre
3
. Es
mas, abusar de este tipo de programacion suele generar codigo poco eciente. 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.
3
Tienes de hecho acceso al codigo, basta con ejecutar edit factorial.
113
B
o
r
r
a
d
o
r
6.2 Funciones como argumentos LECCI

ON III
114
B
o
r
r
a
d
o
r
Captulo 7
Formulas de cuadratura.
Transformada rapida de Fourier
7.1. Formulas de cuadratura
Un problema ya clasico es la aproximacion de una integral
_
b
a
f(s) ds
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 antig uedad, con algunas
referencias que se remontan a las Matematicas clasicas en el calculo de areas y vol umenes
de guras curvas. Quizas este sea el origen de la denominacion de formula de cuadratura
a cualquier expresion que aproxime una integral denida.
La propia denicion de integral
1
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,
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 dicultades 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
Desde una optica completamente ingenua, y a la vista de la graca de la funcion por
integrar, podemos plantear su aproximacion por una suma de areas de rectangulos que
aproximen el area total que dene 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 denicion de la integral de Rienmann.
115
B
o
r
r
a
d
o
r
7.1 Formulas de cuadratura LECCI

ON III
conoce como reglas del rectangulo. Queda por elegir el punto que al evaluar dene 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.
0 0.5 1 1.5 2 2.5
-0.2
-0.1
0
0.1
0.2
0.3
0.4
0.5
0.6
particin
Regla del punto medio
0 0.5 1 1.5 2 2.5
-0.2
-0.1
0
0.1
0.2
0.3
0.4
0.5
0.6
0 0.5 1 1.5 2 2.5
-0.2
-0.1
0
0.1
0.2
0.3
0.4
0.5
0.6
Particion
Regla del trapecio
Figura 7.1: Reglas de cuadratura: punto medio y trapecio
Si, por simplicidad, nos limitamos a trabajar con particiones uniformes, es decir, a
construir rectangulos con igual base, las formulas anteriores se pueden exponer de forma
simple: en primer lugar introducimos la malla
n N, h =
b a
n
, x
j
= a +hj, x
j+1/2
= a +h(j + 1/2)
o particion asociada. Las reglas quedan ahora de la siguiente forma
Q
1
(f, h) := h
n1

j=0
f(x
j
) (Punto inferior),
Q
2
(f, h) := h
n

j=1
f(x
j
), (Punto superior)
Q
pm
(f, h) := h
n1

j=0
f(x
j+1/2
), (Punto medio)
Es difcil escapar a la sensacion de que la regla del punto medio goza de mejores
116
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 7. Formulas de cuadratura. FFT


propiedades que las que denen el resto de elecciones
3
. 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
Q
tr
(f, h) := h
_
1
2
f(x
0
) +
n1

j=1
f(x
j
) +
1
2
f(x
n
)
_
, (Regla del trapecio).
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 [x
i
, x
i+1
] para luego construir con ellas, simplemente
sumandolas, una formula en todo el intervalo [a, b]. Es por ello que a las reglas del rectangu-
lo y trapecio se les llama reglas compuestas, mientras reglas que no implican subdividir
el intervalo de integracion en intervalos mas peque nos se las conoce como 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 nal del intervalo a,b.
N umero de divisiones del intervalo n.
Una vez ledos estos datos podemos calcular h, la distancia entre dos puntos consecu-
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
07
08 function s=puntomedio(f,a,b,n)
09
10 h=(b-a)/n;
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 desde nar, sino manejarla con algo de cuidado.
117
B
o
r
r
a
d
o
r
7.1 Formulas de cuadratura LECCI

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

Ejercicio 7.2 Implementa en Matlab la regla del trapecio.


Ejercicio 7.3 Tomando un n umero de puntos sucientemente alto y siempre que la funcion
sea regular (sea derivable un n umero suciente 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 eval uan para construir
la regla de cuadratura. Esta eleccion hace que en la regla del punto medio la funcion se
eval ue en n puntos mientras que en la regla del trapecio, se haga en n + 1 puntos. En
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:
_
b
a
f(s)ds
_
b
a
f(c)ds = f(c)(b a).
Analogamente, la regla del trapecio se basa en aproximar la funcion por una recta p
1
(s),
polinomio de grado 1, que pase por (a, f(a)) y (b, f(b)) y luego dar como resultado aprox-
imado de la integral la de p
1
(s):
_
b
a
f(s)ds
_
b
a
_
b s
b a
f(a) +
s a
b a
f(b)
_
. .
p
1
(s)
ds =
b a
2
[f(a) +f(b)] .
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.
Proposicion 7.1 Existen
1
,
2
[a, b] tales que
_
b
a
f(s) ds (b a)f(c) =
1
24
f

(
1
)(b a)
3
,
_
b
a
f(s) ds
b a
2
_
f(a) +f(b)
_
=
1
12
f

(
2
)(b a)
3
.
118
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 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 arbi-
traria. Es remarcable que ambas formulas son exactas para polinomios de grado 1 (porque
en tal caso f

= 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 opuesto
4
.
Siguiendo con estas ideas, podemos avanzar un paso mas trabajando con polinomios
de grado dos. Denotando por P
n
(x) los polinomios de grado n, procedemos como sigue
Construir p P
2
(x) tal que (c = (a +b)/2)
p
2
(a) = f(a), p
2
(c) = f(c), p
2
(b) = f(b).
Dar como aproximacion
_
b
a
f(s) ds
_
b
a
p
2
(s) ds.
a c b
Figura 7.2: Regla de Simpson
En la terminologa habitual se habla de una regla de precision 2. La formula que
as obtenemos viene dada por
_
b
a
f(s) ds
b a
6
_
f(a) + 4f(c) +f(b)
_
. (7.1)
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 denicion.
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
,=
2
. Un analisis mas elaborado permite probar que esta
conclusion es esencialmente cierta.
119
B
o
r
r
a
d
o
r
7.1 Formulas de cuadratura LECCI

ON III
Proposicion 7.2 Existe
3
[a, b] tal que
_
b
a
f(s) ds
b a
6
_
f(a) + 4f(c) +f(b)
_
=
1
2880
f
(4)
(
3
)(b a)
5
.
En general, tenemos la siguiente estrategia para construir reglas de mayor precision:
Tomar n N, h = (b a)/n, x
j
= a +jh con j = 0, . . . , n (n + 1 puntos).
Construir un polinomio p
n
P
n
(x) tal que
p
j
(x
j
) = f(x
j
).
Aproximar
_
b
a
f(s) ds
_
b
a
p
n
(s) ds.
Las formulas as obtenidas reciben el nombre de formulas de Newton-Cotes cerradas
5
. Las
formulas de Newton-Cotes abiertas se denen de forma similar pero tomando
x
j+1/2
= a + (j + 1/2)h, j = 0, . . . , n, h =
b a
n
.
Se denominan reglas abiertas porque ni a ni b se eval uan para aproximar la integral.
Sin embargo no es conveniente recurrir a estas formulas de cuadratura porque conforme
aumenta el n umero de puntos, las formulas tienden a ser mas inestables numericamente.
En lugar de ello, se utilizan formulas compuestas, como las del rectangulo o trapecio,
denidas a partir de formulas simples de pocos puntos. Volveremos a ello en proximos
apartados.
Ejercicio 7.4 (Matematico) Deducir los coecientes de la regla de Simpson expuestos en
(7.1).
(Ayuda: Todo polinomio de grado 2 se puede escribir en la forma p
2
(s) =
1
(s b)(s c) +

2
(s a)(s c) +
3
(s a)(s b). Cuanto valen
1
,
2
,
3
si exigimos que p
2
(a) = f(a),
p
2
(b) = f(b), p
2
(c) = f(c)?. Integra p
2
(x) y deduce la regla. Ten en cuenta que c = (a + b)/2.)
Ejercicio 7.5 Otra forma equivalente de denir 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
x
j
= a +jh, j = 0, 1, 2, con h =
b a
2
,
denir
_
b
a
f(s) ds
0
f(x
0
) +
1
f(x
1
) +
2
f(x
2
).
y exigir que la formula sea exacta para f = 1, s, s
2
. 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.
120
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 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
_
b
a
f(s) ds =
b a
n
_
n
0
f(a +ht) dt
Se introduce a continuacion la regla de cuadratura en [0, n]
_
n
0
g(t) dt n
_

0
g(0) +
1
g(1) + . . . +
n
g(n)
_
.
Los pesos se determinan sin mas que exigir que sea exacta para polinomios
6
, de grado n en t.
Llegamos por tanto a las condiciones
_
n
0
g(t) dt = n(
0
g(0) +
1
g(1) + . . . +
n
g(n)), g 1, t, . . . , t
n
.
Esta forma directa de abordar el problema nos conduce al sistema
_

_
1 1 1 1
0 1 2 n
0 1 4 n
2
. . . . . . . . . . . . . . . . .
0 1 2
n
n
n
_

_
_

2
.
.
.

n
_

_
=
_

_
1
n/2
n
2
/3
.
.
.
n
n
/(n + 1)
_

_
.
Implementa una funcion que reciba como argumento n y devuelva los pesos de la formula de
Newton-Cotes cerrada de n + 1 puntos
7
.
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
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)))
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.
121
B
o
r
r
a
d
o
r
7.1 Formulas de cuadratura LECCI

ON 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
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
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
la resolucion del sistema lineal de Vandermonde de resultados muy poco ables dado el
mal condicionamiento de la matriz
8
. 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.
7.1.3. Retorno a las reglas compuestas
En la seccion precedente indicamos que el uso de formulas de cuadratura simple con
un n umero 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
122
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 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 dividir
el intervalo de integracion en n subintervalos y aplicar en cada uno de ellos la formula de
Newton-Cotes cerrada de dos puntos:
_
b
a
f(s) ds
b a
2
(f(a) +f(b)).
Deduciremos a continuacion la regla compuesta de Simpson. Tomemos en primer lugar
n subintervalos, con lo que habremos de evaluar en 2n + 1 puntos. Deniendo h = (b
a)/(2n), x
i
= a+ih (i = 0, . . . , 2n) aplicaremos la regla de Simpson simple sobre [x
2i
, x
2i+2
]
(longitud 2h). Aparecen as tres terminos diferentes:
Los puntos x
0
(= a) y x
2n
(= b) son extremos de un unico subintervalo.
Los puntos x
2j
, j = 1, . . . , n 1, que son extremo superior de un subintervalo e
inferior del siguiente ([x
2j2
, x
2j
] y [x
2j
, x
2j+2
]).
Los puntos x
2j1
que son puntos interiores de los subintervalos ([x
2j2
, x
2j
]).
La formula que obtenemos es
Q
sp
(f, h) := h
_
1
3
f(x
0
) +
4
3
n

j=1
f(x
2j1
) +
2
3
n1

j=1
f(x
2j
) +
1
3
f(x
2n
)
_
. (7.2)
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
Q
pm
(f, h)
_
b
a
f(s) ds =
h
2
24
f

(
1
)(b a),
Q
tr
(f, h)
_
b
a
f(s) ds =
h
2
12
f

(
2
)(b a),
Q
sp
(f, h)
_
b
a
f(s) ds =
h
4
180
f
(4)
(
3
)(b a).
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.
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.
123
B
o
r
r
a
d
o
r
7.1 Formulas de cuadratura LECCI

ON 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
una batera de experimentos.
Para ello, denimos una funcion mediante inline:
>> f=inline(x*cos(x)); f=vectorize(f);
La integral exacta se puede calcular tomando un n umero muy elevado de puntos (por ejem-
plo n = 10000) con la regla de Simpson, que es la de mayor precision. Mide el error para
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 n umero de puntos. Deberas observar que
para funciones suaves el error se divide por 4 o por 16, seg un la regla que se aplique.
Testa los programas con los siguientes ejemplos
i) f
1
(x) = x cos(x) en [0, ]
ii) f
2
(x) = xe
x
en [0, 3]
iii) f
3
(x) = x log(x) en [1, 2] y en [0, 2]
9
iv) f
4
(x) = cos
2
(x) en [0, /2], en [0, ] y en [0, 2].
Un chero script te puede venir bien para este ejercicio. Que observas con las reglas del
trapecio y del punto medio en el ultimo caso?.
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 es la superconvergencia (convergencia mejor de lo esperado)
que se observa para
_
2
0
cos
2
(x) (punto iv)).Esto es consecuencia de que el integrando,
ademas de regular, es periodico y se esta integrando en un m ultiplo de su intervalo
de periodicidad. En una seccion posterior daremos una explicacion a este fenomeno tan
sorprendente.
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, = 10
16
. Esta breve discrepancia en el extremo de integracion no afecta
al resultado.
124
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 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 eval ua la funcion, estaba jada a priori.
Podemos plantearnos ahora hacer de la posicion de los nodos una variable mas del
problema. Para ello, y con objeto de simplicar el analisis, nos situamos en el intervalo
[1, 1] y buscamos la formula de mayor precision de dos puntos:

1
,
2
,
1
,
2
R

1
p(
1
) +
2
p(
2
) =
_
1
1
p(s) ds, p 1, s, s
2
, s
3

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 planteado
10
.
Es un ejercicio ilustrativo resolver el sistema no lineal
_

1
+
2
= 2,

1
+
2

2
= 0,

2
1
+
2

2
2
=
2
3
,

3
1
+
2

3
2
= 0.
La solucion a dicho sistema es

1
=
2
= 1,
1
=

3
3
,
2
=

3
3
.
En resumen, una eleccion de los nodos nada obvia dene una regla de dos puntos
con mejores propiedades de convergencia que, por ejemplo, la regla del trapecio
11
.
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 dicultad
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
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, innitas
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 dena una formula de cuadratura de mayor grado de precision.
125
B
o
r
r
a
d
o
r
7.1 Formulas de cuadratura LECCI

ON III
La teora va mas alla puesto que es constructiva: da una forma de calcular la formula
(nodos y pesos) mucho mas eciente. 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 cientcos. Los pesos
i
se pueden calcular a continuacion
resolviendo un simple sistema lineal. En la Tabla 7.1 se pueden ver los coecientes de
las primeras reglas gaussianas. Observa que la disposicion simetrica de los nodos en el
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
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
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
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.
126
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 7. Formulas de cuadratura. FFT


Proposicion 7.4 Existe una sucesion de n umeros (b
2j
)
j
tales que para f sucientemente
regular
_
b
a
f(s) ds Q
tr
(f, h) =
m

j=1
b
2j
h
2j
_
f
(2j1)
(b) f
(2j1)
(a)
_
+O(h
2m+2
).
El smbolo de Landau O(h
M
) indica una cantidad que es menor que una constante
multiplicada por h
M
y con dicha constante independiente de h. En otras palabras, es
equivalente a escribir

_
b
a
f(s) ds Q
tr
(f, h)
m

j=1
b
2j
h
2j
_
f
(2j1)
(b) f
(2j1)
(a)
_

C
m
h
2m+2
donde C
m
depende de m y de la derivada m + 1 de f pero no de h.
Denotando por
I =
_
b
a
f(s) ds,
0
(h) = Q
tr
(f, h) c
2j
:= b
2j
_
f
(2j1)
(b) f
(2j1)
(a)
_
se observa que para h y h/2 se dispone de los desarrollos
I =
0
(h) +
m

j=1
c
2j
h
2j
+O(h
2m+2
),
I =
0
(h/2) +
m

j=1
1
4
j
c
2j
h
2j
+O(h
2m+2
).
Multiplicando la segunda ecuacion por 4, restando la primera y despejando I obtenemos
I =
4
0
(h/2)
0
(h)
3
. .

1
(h)
+
m

j=1
1
3
_
1
4
j1
1
_
c
2j
. .
c
(1)
2j
h
2j
+O(h
2m+2
).
En particular observamos que c
(1)
2
= 0, esto es hemos cancelado el primer termino del
desarrollo, por lo que
I =
1
(h) +
m

j=2
c
(1)
2j
h
2j
+O(h
2m+2
). (7.3)
Como consecuencia
I
1
(h) = O(h
4
)
_
[I
1
(h)[ C
4
h
4
_
.
Por tanto
1
(h) es una aproximacion de la integral con orden 4. Es mas,
1
(h) cumple de
nuevo un resultado similar al de la proposicion anterior (ver (7.3)), por lo que podemos
repetir el mismo argumento y denir
12

2
(h) =
16
1
(h/2)
1
(h)
15
.
12

1
(h/2) se ha obtenido igual partiendo de
0
(h/2) y
0
(h/4)
127
B
o
r
r
a
d
o
r
7.1 Formulas de cuadratura LECCI

ON III
Paso 0 Paso 1 Paso 2 Paso 3
c
o
n
v
e
r
g
e
n
c
i
a

0
(h)
//

1
(h)
//

2
(h)
//

3
(h)

0
(h/2)
//
66
n
n
n
n
n
n
n
n
n
n
n
n
n

1
(h/2)
66
n
n
n
n
n
n
n
n
n
n
n
n
n
//

2
(h/2)
66
n
n
n
n
n
n
n
n
n
n
n
n
n

0
(h/4)
//
66
n
n
n
n
n
n
n
n
n
n
n
n

1
(h/4)
66
n
n
n
n
n
n
n
n
n
n
n
n

0
(h/8)
66
n
n
n
n
n
n
n
n
n
n
n
n
Figura 7.3: Diagrama del metodo de Romberg
Es facil ver que nuevamente I
2
(h) tiene un desarrollo del error que comienza con
h
6
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 denir

j+1
(h) =
2
2j

j
(h/2)
j
(h)
2
2j
1
.
Cada una ellas satisfaciendo
[I
j
(h)[ C
j
h
2j+2
,
donde C
j
es independiente de h pero de j o de f. Observa que la convergencia solo se
asegura para j jo 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
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 h
m
para ning un m. Esto es, el
orden de convergencia es m para cualquier m, o lo que es lo mismo

_
b
a
f(s)ds Q
tr
(f, h)

C
m
h
m
, m N
donde C
m
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
128
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 7. Formulas de cuadratura. FFT


para calcular la integral con una precision muy na.
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 derivadas
13

_
b
a
f(s)ds Q
tr
(f, h)

Cr
n
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, seg un el siguiente prototipo de
funcion
01 % RICHARDSON
02 %
03 % V= RICHARDSON(F,A,B,N,M) Aplica la formula del trapecio con
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 denir la extrapolacion. Para ello precisamos
que las sucesivas h decrezcan de una forma proporcional

0
(h),
0
(rh),
0
(r
2
h), . . . ,
0
(r
n
h).
En el caso expuesto, r = 1/2. Como se adapta la extrapolacion para otras elecciones de
r (0, 1)?.
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 situaci on 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 dise nar metodos adaptativos. Estos esquemas reconocen aquellas zonas
que requieren mayor trabajo (renar, en la terminologa habitual) y aquellas donde basta
unas pocas evaluaciones para obtener una aproximacion sucientemente 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
129
B
o
r
r
a
d
o
r
7.1 Formulas de cuadratura LECCI

ON III
Zona regular Zona regular Zona Irregular
Figura 7.4: Integracion adaptativa
A continuacion expondremos una implementacion muy sencilla de una integracion
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)
_
b
a
f(s) ds
h
6
_
f(a) + 4f(c) +f(b)
_
. .
Q
1
(f)
= c
(1)
2
h
4
+O(h
6
) (7.4)
_
b
a
f(s) ds
h
12
_
f(a) + 4f(d) + 2f(c) + 4f(e) +f(b)
_
. .
Q
2
(f)
=
c
(1)
2
16
h
4
+O(h
6
) (7.5)
donde h = (b a), c es el punto medio de (a, b), d y e, los puntos medios de (a, c) y (c, b).
El termino dominante del error, para h sucientemente peque no, es c
(1)
2
h
4
de forma que
_
b
a
f(s) ds Q
1
(f) c
(1)
2j
h
4
.
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
Q
2
(f) Q
1
(f)
_
1
1
16
_
c
(1)
2j
h
4
y por tanto
16
15
(Q
2
(f) Q
1
(f)) c
(1)
2j
h
4

_
b
a
f(s) ds Q
1
(f)
. .
error
.
130
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 7. Formulas de cuadratura. FFT


La idea de nuestro esquema adaptativo es la que sigue: dado un intervalo [a, b] y una
tolerancia
Calculamos Q
2
(f) y Q
1
(f) como antes, y
est =

16
15
(Q
1
(f) Q
2
(f))

Si est < el resultado se considera bueno y se devuelve Q


2
(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 prejada. 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
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
integ21 = h/12*(fa + 4fd + fc) integ22 = h/12*(fc + 4fe + fb)
integ2 = integ21 + integ22
3. Se calcula el estimador
est =

16
15
(integ integ2)

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


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.
131
B
o
r
r
a
d
o
r
7.1 Formulas de cuadratura LECCI

ON 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 Q
2
(f), en
lugar de Q
1
(f)
14
. Otra variante es devolver
16Q
2
(f) Q
1
(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
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);
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 innito si no
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 n umero 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 Q
2
(f) sea mejor que Q
1
(f), as que por
que no devolver lo mejor que se tiene?. Matematicamente, sin embargo, el estimador del error controla
el error de Q
1
(f) y no de Q
2
(f).
132
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 7. Formulas de cuadratura. FFT


0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
0
0.5
1
1.5
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 modicarse si el usuario
especica 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.
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 nal 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 nal
De un estimador se suele hablar de dos conceptos bien importantes: conabilidad y
eciencia. Un estimador es conable si efectivamente el error esta por debajo de lo que el
estimador calcula. Por contra, es eciente si el estimador aproxima bien el error cometido.
Nuestro estimador, en general, es poco eciente: el error real suele estar muy por debajo de
la cantidad que nos devuelve el estimador, especialmente si el intervalo de integracion es
grande. Por ejemplo, para f =

x e integrando en [0, 2], se observa que con una tolerancia


133
B
o
r
r
a
d
o
r
7.2 Transformada rapida de Fourier LECCI

ON III
Adaptativa Pto. medio Trapecio Simpson
tol Error neval Error Error Error
10
1
8.91e03 7 8.01e3 3.67e2 1.01e2
10
2
1.41e04 15 2.70e3 1.06e2 3.59e3
10
3
1.57e06 29 1.03e3 3.81e3 1.40e3
10
4
2.12e07 47 5.01e4 1.82e3 6.90e4
10
5
8.48e09 77 2.45e4 8.67e4 3.33e4
10
6
2.64e10 133 1.09e4 3.81e4 1.36e4
10
7
8.27e12 233 4.73e5 1.64e4 6.41e5
10
8
2.25e13 421 1.96e5 6.76e5 2.65e5
Cuadro 7.2: Resultados numericos para
_
2
0

x dx. Tolerancia exigida (tol), n umero de


evaluaciones (neval) y error cometido (Error). Comparativa con las reglas del punto medio,
del trapecio y de Simpson con h jo y el mismo n umero de evaluaciones
de 10
5
el error real cometido por el metodo adaptativo es 8.48 10
9
, 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
hemos visto en esta seccion. Por otro lado, quadl utiliza una regla de orden mayor que
da mejores resultados si el integrando es mas regular.
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, seg un sus siglas en ingles
15
, es una her-
ramienta muy potente en el analisis de se nales 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
relaciona la transformada de Fourier discreta con los coecientes 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)
134
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 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
exp(i) = e
i
= cos + i sen , R,
donde i es la unidad imaginaria.
Dada una funcion 1periodica, esta se puede expresar en forma de serie de Fourier
f() =

mZ

f(m) exp(2im), R (7.6)


donde

f(m) es el coeciente m-esimo de Fourier

f(m) =
_
1
0
f() exp(2im)d, m Z.
La convergencia de la serie es un asunto algo delicado
16
, pero si la funcion tiene, por
ejemplo, derivada continua, la convergencia de la serie es uniforme:
max
[0,1]

f()
s

m=r

f(m) exp(2im)[ 0, cuando r, s ,


lo que en particular justica 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
innita de unas frecuencias fundamentales. Observa que para cada m,
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
_
1
0
[f()[
2
d =

m=
[

f(m)[
2
(7.7)
que se interpreta como que la energa de funcion original f es igual a la energa del vector
innito (. . . ,

f(2),

f(1),

f(0),

f(1),

f(2), . . .)

.
16
Mucho se ha escrito sobre esto. En cualquier caso hay que especicar 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 L
2
(0, 1). Fsicamente se interpreta como el espacio de las se nales cuya
energa es nita.
135
B
o
r
r
a
d
o
r
7.2 Transformada rapida de Fourier LECCI

ON III
-0.2 0 0.2 0.4 0.6 0.8 1 1.2
-1
-0.5
0
0.5
1
1.5
Parte Real e Imaginaria de exp(2 i m) para m=1,2,3
Freq.1 periodo 1
Freq 2 periodo 1/2
Freq 3 periodo 1/3
Figura 7.6: Primeras exponenciales trigonometricas.
Nota. Utilizando la denicion de la exponencial trigonometrica, podemos expresar
f =

f(0) +

m=1
(

f(m) +

f(m))
. .
=:
m
cos(2m ) +

m=1
i(

f(m)

f(m))
. .
=:
m
sen(2m ) (7.8)
donde
m
y
m
se pueden calcular de forma alternativa mediante

m
= 2
_
1
0
f() cos(2m) d,
m
= 2
_
1
0
f() sen(2m) d.
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. A un 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)
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 denimos
x
j
=
j
N
, j = 0, . . . , N 1,
se eval ua
y
j
:= f (x
j
) , j = 0, . . . , N 1
136
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 7. Formulas de cuadratura. FFT


y se construye el vector
y =
_

_
y
0
y
1
.
.
.
y
N1
_

_
.
La primera cuestion es
Es posible recuperar los coecientes de Fourier de f a partir de y?
La respuesta obvia es no: si tomamos una cantidad nita de informacion es imposible
recuperar (salvo en casos triviales) los coecientes de Fourier, que en ultima media son la
funcion y, por tanto, conllevan una cantidad innita 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

f(k) 0, [k[
y de hecho de una forma muy rapida (ver Ejercicio 7.18), por lo que unos pocos coecientes
pueden ser sucientes para reconstruir la funcion de forma muy aproximada.
Para calcular estos coecientes 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

f(k) :=
_
1
0
f()exp(2ik) d

1
N
_
1
2
f(0) +
N1

j=1
f(
j
N
) exp(
2ijk
N
) +
1
2
f(1)
_
f(1) = f(0) = y
0

=
=
1
N
N1

j=0
y
j

jk
donde
:= exp
_

2i
N
_
.
Lo anterior sugiere construir
Y
k
:=
1
N
N1

j=0
y
j

jk
como una aproximacion de

f(k). El vector
Y =
_

_
y
0
y
1
.
.
.
y
N1
_

_
recibe el nombre de transformada discreta de Fourier de y que denotaremos por
Fy = Y. Por tanto F : C
N
C
N
, es decir, transforma vectores de n umeros (en principio)
complejos en vectores complejos.
137
B
o
r
r
a
d
o
r
7.2 Transformada rapida de Fourier LECCI

ON III
Ejercicio 7.18 Sea f es periodica con derivada primera continua,

f(k) :=
_
1
0
f() exp(2ik) d =
1
2ki
f() exp(2ik)

=1
=0
. .
= 0
+
1
2ki
_
1
0
f

() exp(2ik) d.
Demostrar entonces que
[

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

f(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
1
N
N1

j=0
exp
_

2ijk
N
_
=
_
1, k = N para alg un Z,
0, en caso contrario.
Demostracion. Tomemos como antes
:= exp
_

2i
N
_
.
Entonces, la suma anterior es simplemente
1
N
N1

j=0

jk
=
1
N
N1

j=0
(
k
)
j
.
Si k = N, es decir, si k es un m ultiplo de N,
k
= exp(2i) = 1 y la suma anterior es
1. En caso contrario, teniendo en cuenta que
1 +r +r
2
+. . . +r
m1
=
1 r
m
1 r
obtenemos que
1
N
N1

j=0
(
k
)
j
=
1
N
1 (
k
)
N
1
k
=
1
N
1 (
N
)
k
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 sumatorios
17
podemos escribir
Y
k
:=
1
N
N1

j=0
y
j

jk
=
1
N
N1

j=0
f(x
j
) exp
_

2ijk
N
_
=
1
N

mZ

f(m)
_
N1

j=0
exp
_
2i(mk)j
N
__
.
17
Manipulaciones que deben siempre justicarse y que son validas si, por ejemplo, la funcion tiene
derivada primera continua.
138
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 7. Formulas de cuadratura. FFT


Por el lema anterior,
N1

j=0
exp
_
2i(mk)j
N
_
=
_
1, si m = k +N,
0, en caso contrario,
por lo que
Y
k
=
1
N

mZ

f(k +mN).
De esta forma, Y
k
recoge no solo el coeciente kesimo de Fourier, sino contribuciones en
frecuencias mas altas, cuya distancia al coeciente k dista un m ultiplo de N.
Llegado a este punto, conviene recordar que el decreciemiento rapido a cero de los
coecientes de Fourier cuando [k[ sugiere que Y
k
aproxima bien al coeciente
de Fourier mas proximo a cero y la aproximacion mejora muy rapidamente cuando
N . Es decir,
Y
k
=
_

f(k)+

m=0

f(k +mN)
. .
peque no
, si 0 k
N
2

f(k N)+

m=0

f(k +mN)
. .
peque no
, si
N
2
< k < N.
(7.9)
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
y
k
:=
N1

j=0
Y
j
exp
_
2ijk
N
_
,
obteniendose as una expresion muy similar a la transformada de Fourier. En particular,
concluimos que F
1
existe y esta bien denida.
Nota. En el marco continuo, tenamos que

f(m) =
_
1
0
f() exp(2im) d, f() =

mZ

f(m) exp(2im).
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.
139
B
o
r
r
a
d
o
r
7.2 Transformada rapida de Fourier LECCI

ON III
Ejercicio 7.20 Dado que vamos a calcular aproximaciones de los coecientes centrales de
Fourier, podramos plantearnos denir

Y
k
=
N1

j=0
y
j

jk
, N/2 < k N/2
Sabras ver que relacion hay entre

Y
k
e Y
k
?.
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
W :=
_

_
1 1 1 1
1
2

N1
1
2

4

2(N1)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
N1

2(N1)

(N1)
2
_

_
, = exp
_

2i
N
_
Con esta matriz, la relacion entre y y su transformada Y se escribe simplemente
Y = Fy =
1
N
Wy.
Analogamente,
y = F
1
Y = W

Y
donde W

es la matriz adjunta
W

=
_

_
1 1 1 1
1
2

N1
1
2

4

2(N1)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
N1

2(N1)

(N1)
2
_

_
, =
1
= exp
_
2i
N
_
La matriz W es una matriz de tipo Vandermonde, que ya surgido anteriormente.
Ademas es casi ortogonal:
W

W = N I
N
donde I
N
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
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.
140
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 7. Formulas de cuadratura. FFT


Solucion. Esta es una implementacion que evita construir la matriz W. En su lugar
calcula sucesivamente las las, la multiplica por y para hallar el correspondiente coeciente
y calcula la siguiente la. De esta forma se reduce la memoria utilizada pero no el n umero
de operaciones
01 % FT
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
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 nales
Si f es real,
Re

f(k) = Re

f(k), Im

f(k) = Im

f(k).
Esta simetra se extiende a la transformada discreta: si y es real
Imy
0
= 0, Re y
k
= Re y
Nk
, Imy
k
= Imy
Nk
, 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 | |
2
del vector original, esto es, su energa.
Concretamente (comparar con (7.7))
|Y|
2
2
= Y

Y =
1
N
2
(Wy)

(Wy) =
1
N
2
y

Wy =
1
N
y

y =
1
N
|y|
2
2
. (7.10)
Hay una falta de consenso en la denicion de Transformada de Fourier discreta.
Nosotros hemos tomado como denicion de la transformada y de su inversa las dadas
por
Y
k
:=
1
N
N1

j=0
y
j

jk
, y
k
:=
N1

j=0
Y
j

jk
, = exp(
2i
N
).
141
B
o
r
r
a
d
o
r
7.2 Transformada rapida de Fourier LECCI

ON III
En Matlab, la transformada de Fourier y su inversa estan implementadas en fft e ifft.
La denicion que se toma es ligeramente diferente
Y
k
:=
N1

j=0
y
j

jk
, y
k
:=
1
N
N1

j=0
Y
j

jk
, = exp(
2i
N
).
En otros textos se multiplica por 1/

N en ambos sumatorios con el n 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 se nales y fenomenos periodicos.
Vamos a mostrar un (muy) simple ejemplo en la eliminacion de ruido de una se nal periodi-
ca. Suponemos que la se nal, 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 se nal original es regular, sus coecientes 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 se nal dada por la funcion
f(x) := cos(cos(12x)) sen(2x)
En la Figura 7.7 se muestra la funcion y sus coecientes de Fourier, que decrecen rapida-
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 coecientes de Fourier mostrada en (7.7).
En el campo discreto, tenemos un ruido r y el vector transformada de Fourier discreta
R = Fr. Visto en el campo transformado, esta perturbacion tiene un tama no, relacionado
con la amplitud del ruido y con el n umero 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
|R|
2
2
=
1
N
|r|
2
2
max
j=0,...,N1
[r
j
[.
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,
R
j

1

N
142
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 7. Formulas de cuadratura. FFT


0 0.2 0.4 0.6 0.8 1
-1
-0.5
0
0.5
1
-40 -20 0 20 40
0
0.1
0.2
0.3
0.4
Coef. Fourier (en valor absoluto)
0 0.2 0.4 0.6 0.8 1
-1
-0.5
0
0.5
1
0 10 20 30 40 50 60
0
0.1
0.2
0.3
0.4
FT de la seal discreta (valor abs.)
Seal continua con un muestreo de 64 puntos
Figura 7.7: Coecientes de Fourier y transformada discreta de Fourier
Ahora, si consideramos la inuencia de este ruido sobre una se nal y, tenemos la se nal
perturbada y = y + r. Se trata ahora de eliminar ese ruido observando la transformada

Y.
La estrategia que planteamos es la siguiente. En el caso de que

Y
j
sea grande, pode-
mos aceptar este coeciente dado que el error relativo es peque no. Por contra, si

Y
j
es
peque no, 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 se nala, partiendo de un nuevo vector Z
Z
k
=
_
0 si [

Y
k
[ es peque no,

Y
k
en otro caso.
(7.11)
Con la informacion que nos queda, reconstruimos la se nal discreta original y mediante
F
1
Z. As tenemos el siguiente diagrama
y
+ ruido
y
F


Y
(7.11)
Z
F
1
z.
Al nal de proceso, z es (debera ser) mejor aproximacion de y que la se nal perturbada
y.
En la Figuras 7.9 se muestran los resultados obtenidos con n = 64 y n = 256. Se puede
observar como la se nal es ltrada eliminando gran parte del ruido introducido.
143
B
o
r
r
a
d
o
r
7.2 Transformada rapida de Fourier LECCI

ON III
10 20 30 40
0
0.02
0.04
0.06
0.08
10 20 30 40
0
0.005
0.01
0.015
50 100 150
0
0.02
0.04
0.06
0.08
50 100 150
0
2
4
6
8
x 10
-3
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
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 mil-
lones de elementos, lo que colocaba el problema mas alla de la potencia de los ordenadores
de la epoca y los de un futuro previsible
18
. En cualquier caso duplicar N, el n umero de
elementos de y, requerira multiplicar por cuatro la potencia del ordenador. Siguiendo el
progreso de la informatica, esto signicara una espera de 36 meses
19
.
18
Hemos mostrado algunas aplicaciones simples de la transformada de Fourier que son esencialmente
unidimensionales (una se nal periodica). Existen aplicaciones que exigen trabajar ya con se nales bidimen-
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 n umeros muy elevados de variables no son extra nos.
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 a nos. 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.
144
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 7. Formulas de cuadratura. FFT


0 0.2 0.4 0.6 0.8 1
-1
-0.5
0
0.5
1
Seal con ruido
0 10 20 30 40 50 60
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
FT (en valor absoluto)
0 10 20 30 40 50 60
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
Truncacion de la FT
0 0.2 0.4 0.6 0.8 1
-1
-0.5
0
0.5
1
Seal filtrada
64 puntos
0 0.2 0.4 0.6 0.8 1
-1
-0.5
0
0.5
1
Seal con ruido
0 50 100 150 200 250
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
FT (en valor absoluto)
0 50 100 150 200 250
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
Truncacion de la FT
0 0.2 0.4 0.6 0.8 1
-1
-0.5
0
0.5
1
Seal filtrada
256 puntos
Figura 7.9: Filtrado del ruido
145
B
o
r
r
a
d
o
r
7.2 Transformada rapida de Fourier LECCI

ON 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 n umero de operaciones.
La idea de partida del algoritmo es considerar el caso N = 2m. Entonces denotando

1
:=
2
se tiene que

2jk
= (
2
)
kj
=
jk
1
.
De esta forma, si 0 k M 1 = N/2 1
Y
k
=
1
N
N1

j=0
y
j

jk
=
1
N
M1

j=0
y
2j

2jk
. .
Pares
+
1
N
M1

j=0
y
2j+1

(2j+1)k
. .
Impares
N = 2M

=
1
2
_
1
M
M1

j=0
y
2j

jk
1
+
k
1
M
M1

j=0
y
2j+1

jk
1
_
=:
1
2
_
Y
(0)
k
+
k
Y
(1)
k
_
. (7.12)
Notemos que Y
(0)
k
e Y
(1)
k
son el resultado de aplicar la transformada de Fourier disc-
reta a los vectores (y
0
, y
2
, . . . , y
2M2
)

y a (y
1
, y
3
, . . . , y
2M1
)

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
Y
k
=
1
N
N1

j=0
y
j

jk
=
1
N
M1

j=0
y
2j

2jk
+
1
N
M1

j=0
y
2j+1

(2j+1)k
=
1
2
_
1
M
M1

j=0
y
2j

jM
1

j
1
+
M

1
M
M1

j=0
y
2j+1

j
1
_
.
Dado que

M
= exp(i) = 1,
M
1
= 1;
se deduce que
Y
k
=
1
2
_
Y
(0)

Y
(1)

. (7.13)
Denotando por
_
v
w

el vector resultado de enlazar los vectores v y w, las identidades


(7.12) y (7.13) se puede escribir en notacion vectorial
Y =
1
2
_
Y
(0)
+. Y
(1)
Y
(0)
. Y
(1)
_
(7.14)
donde Y
(0)
e Y
(1)
son las transformadas de Fourier de los vectores (y
0
, y
2
, . . . , y
2M2
)

y
(y
1
, y
3
, . . . , y
2M1
)

,
= (
0
,
1
, . . . ,
M1
)

, := exp(
2i
N
), (7.15)
146
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 7. Formulas de cuadratura. FFT


y .* denota el producto elemento a elemento entre las componentes de los vectores.
En cuando al n umero de operaciones, si f(N) es el n umero 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.
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 = 2
p
. El algoritmo
queda de la siguiente forma
FFT
N =length(y)
if N==1
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 n umero de productos es
f(N) = 2
p
(p + 1) = N(log
2
(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
primer lugar podemos plantearnos como se va a devolver el resultado, si como un vector
la 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
147
B
o
r
r
a
d
o
r
7.2 Transformada rapida de Fourier LECCI

ON III
y=y(:).; Y=y;
si se desea implementar para las. 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)
para que los vectores implicados, e Y
(1)
tengan igual dimension.
Si el vector tiene un n umero par de elementos, la transformada se calcula a partir de
la transformada de los vectores
y(1 : 2 : n) (y
0
, y
2
, . . . , y
n2
)

, (Y
(0)
)
y(2 : 2 : n) (y
1
, y
3
, . . . , y
n1
)

, (Y
(1)
)
de acuerdo con el algoritmo (vease tambien (7.14) y (7.15)).
Cuando el n umero 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);
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 n umero de entradas es par o impar.
Ejercicio 7.25 Implementa una funcion recursiva que devuelva el n umero de operaciones
para el calculo de la FFT. Utilzala para obtener una tabla con el n umero de operaciones para
algunos valores altos de N. Compara con el n umero de operaciones requerido en la version
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)
08
09 if mod(N,2)==1
10 M=N^2;
11 else
12 M=operacionesFFT(N/2)*2+N;
13 end
148
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 7. Formulas de cuadratura. FFT

Hemos testado la funcion con 2


19
y 2
19
1 que es primo.

Este es el resultado
>> format rat
>> operacionesfft(2^19) %(2^19 approx 500.000)
ans=
10485760
>> operacionesfft(2^19-1)
ans =
274876858369
Observa que el n umero de operaciones efectuadas se reduce en un factor de 26000 si
aumentamos en uno el n umero 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 n umero de entradas del vector. Para ello, utilizaremos de nuevo los valores
2
19
1 y 2
19
propuesto anteriormente. Dene dos vectores y1 y y2 con 2
19
1 y 2
19
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?.
Nota nal
Las implementaciones comerciales de la FFT son ciertamente mas complicadas que
lo que hemos visto. En realidad, los metodos recursivos son menos ecientes que las
implementaciones directas, que no hacen uso de la recursividad.
En lugar de ello se opta por una programacion directa, mas renada. 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 n umeros primos 2,
3, 5, 7,... reduciendola a dos, tres, cinco o siete transformadas y as sucesivamente. Incluso
el caso de n umeros 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). .
149
B
o
r
r
a
d
o
r
7.2 Transformada rapida de Fourier LECCI

ON III
La FFT y el producto de n umeros enteros
Dados dos vectores
u = (u
0
, u
1
, . . . , u
r
)

, v = (v
0
, v
1
, . . . , v
s
)

se dene el vector convolucion u v al vector de r + s + 1 componentes cuya entrada k


viene dada por
(u v)
k
:=

+j=k
u

v
j
=
mn{k,r}

=max{0,ks}
u

v
k
, (k = 0, . . . , r +s). (7.16)
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
u
0
+u
1
x +. . . +u
r
x
r
, v
0
+v
1
x +. . . +v
s
x
s
entonces el coeciente en x
k
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
v se insertan en R
n+1
rellenando con ceros
u = (u
0
, u
1
, . . . , u
r
, 0, . . . , 0
. .
N r = s ceros
)

, v = (v
0
, v
1
, . . . , v
s
, 0, . . . , 0
. .
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
Devolver F
1
(W)
Si N = r + s es una potencia de 2 entonces el n umero de operaciones es del orden de
O(nlog
2
(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 n umeros enteros. Por ejemplo,
6031 1 +3 10 +0 10
2
+6 10
3
1234 4 +3 10 +2 10
2
+1 10
3
_

6031 1234 = 4 + 15 10
1
+ 11 10
2
+ 31 10
3
+ 21 10
4
+ 12 10
5
+ 6 10
6
= 7442254.
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
1234 (4, 3, 2, 1, 0, 0, 0, 0) =: v
_
u v = (4, 15, 11, 31, 21, 12, 6)

Por tanto, la FFT nos ofrece una forma muy rapida de multiplicar dos n umeros enteros.
150
B
o
r
r
a
d
o
r
LECCI

ON III Cap

tulo 7. Formulas de cuadratura. FFT


Ejercicio 7.28 Implementa una funcion que calcule el producto de dos n umeros enteros con
la transformada de Fourier de acuerdo al siguiente prototipo
% MULTIPLICACION
%
%
% 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 eciente 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
potencia
20
de 2.
Para disponer de una precision en principio ilimitada, introduciremos los n umeros
que deseamos multiplicar en una cadena de caracteres y haremos la salida en el mismo
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)
ans=
t
>> p(6:9)
ans =
es u
Hara falta transformar un vector de caracteres a un vector de n umeros y viceversa. Para
ello se puede utilizar los comandos str2num, num2str(STRing-to-NUMeric y NUMeric-
to-STRing).
Una vez que tengamos el vector de n umeros hay que darle la vuelta al vector, de forma
que
1234 [4 3 2 1].
20
Que hace log2(ceil(r+s))?
151
B
o
r
r
a
d
o
r
7.2 Transformada rapida de Fourier LECCI

ON 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 10
1
+ 11 10
2
+ 31 10
3
+ 21 10
4
+ 12 10
5
+ 6 10
6
debe transformarse en su representacion decimal
4 + 5 10
1
+ 2 10
2
+ 2 10
3
+ 4 10
4
+ 4 10
5
+ 7 10
6
= 744224.
Nota. Para que preocuparse en multiplicar n umeros enteros? Es decir, no parece haber
una necesidad acuciente de dise nar algorimos para multiplicar n umeros 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 matematicos
21
Ron Rivest, Adin Shamir y Len Adleman en 1977, esta basado en el conocido Teorema
Peque no de Fermat
22
. Este teorema, muy simple, tiene que ver con los restos de la division
por n umeros primos. El mensaje que se desea enviar se convierte en un n umero entero,
mas o menos largo. El cifrado y descifrado del mensaje se basa en calcular restos de di-
visiones por el producto de dos n umeros primos muy grandes. La seguridad del sistema
depende directamente del tama no de estos primos: mayor tama no es mayor seguridad.
Ello hace que se requiera calcular productos y divisiones de n umeros enteros enormes de
forma rapida y eciente
23
.
Nota. La convolucion esta implementada en Matlab mediante el comando conv. La
forma de calcular es esencialmente la expuesta en esta seccion.
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.
152
B
o
r
r
a
d
o
r
Leccion IV
Calculo simbolico, arrays y celdas en Matlab.
Valores y vectores propios. Google.
153
B
o
r
r
a
d
o
r
B
o
r
r
a
d
o
r
Introduccion
La physique ne nous donne pas seulement
loccasion de resoudre des probl`emes... elle
nous fait pressentir la solution
Henri Poincare
En la primera parte de esta leccion trataremos diversos aspectos instrumentales de
Matlab, como el manejo de polinomios, arrays multidimensionales (tensores) y vectores de
celdas. Daremos ademas algunos esbozos sobre la manipulacion de expresiones simbolicas.
Aunque en este campo Matlab no es comparable a otros manipuladores simbolicos como
Maple o Mathematica, puede resultar en muchos casos suciente.
En la segunda parte trataremos el calculo de valores y vectores propios de Matlab.
Volvemos por tanto a incidir en el manejo de vectores y matrices, y en ese sentido es un
recordatorio de lo que vimos en las Lecciones 1 y 2. Con el n de aliviar el peso teorico de
la parte matematica, terminaremos con un captulo fundamentalmente divulgativo sobre
Google y su algoritmo de evaluacion de paginas web Pagerank
tm
.
155
B
o
r
r
a
d
o
r
B
o
r
r
a
d
o
r
Captulo 8
Matlab: Calculo simbolico y
estructuras de datos.
8.1. Polinomios y calculo simbolico
Los polinomios constituyen las funciones mas simples en Matematicas y computa-
cionalmente son importantes habida cuenta que contienen en su estructura las operaciones
basicas en un ordenador. En esta seccion veremos como maneja Matlab un polinomio y
nos servira de preparacion para la seccion siguiente donde veremos someramente la toolbox
de calculo simbolico.
8.1.1. Polinomios
Matlab maneja un polinomio identicandolo simplemente con un vector de n umeros
(en principio) reales. Concretamente, el vector la (a
n
, . . . , a
0
)

corresponde al polinomio
a
n
x
n
+ a
n1
x
n1
+ . . . + a
0
. Si alg un coeciente es nulo, debe incluirse. Por ejemplo, el
vector (1, 0, 2)

representa el polinomio x
2
+ 2. Sumar y restar dos polinomios se reduce
as a sumar y restar dos vectores, salvando el problema de que ambos deben tener el
mismo grado:
>> p=[2 0 1]; % 2*x^2+1
>> q=[-1 1 -1 0 1]; % -x^4+x^3-x^2+1
>> p+q % ERROR!!
??? Error using ==> plus
Matrix dimensions must agree.
>> p=[0 0 2 0 1]; % dos coeficientes mas
>> p+q % ahora OK!
ans=
-1 1 1 0 2
El producto y division de polinomios estan implementados respectivamente en los coman-
dos conv y deconv
157
B
o
r
r
a
d
o
r
8.1 Polinomios y calculo simbolico LECCI

ON IV
>> p=[2 0 1]; q=[-1 1 -1 0 1];
>> conv(p,q)
ans =
-2 2 -3 1 1 0 1
>> deconv(q,p)
ans=
-0.5000 0.5000 -0.2500
Ejercicio 8.1 Implementa una funcion que calcule la suma de dos polinomios, su producto,
cociente y resto seg un el siguiente prototipo
01 OPERACIONESPOL(P1,P2)
02
03 [S,R,C,P]= OPERACIONESPOL(P1,P2) S, R, C y P son la suma, resta
04 cociente y producto de P1 y P2
(Ayuda: P1 y P2 deben ser de la misma longitud. Que hace la instruccion
p1=[zeros(1,length(p2)-length(p1)) p2]
cuando length(p2)>length(p1)? Comprueba que tambien es valida cuando length(p2)<length(p1).
Que hace entonces?.)
El comando polyval se encarga de la evaluacion de un polinomio:
>> p=[1 0 0 1 0 3]; %definimos el polinomio x^5+x^2+3
>> polyval(p,2) %evaluamos en x=2
ans =
39
>> polyval(p,[1 2 3]) %vectorizado
ans =
5 39 255
Races de polinomios
Las races de un polinomio p son las soluciones de la ecuacion p(x) = 0. El Teorema
Fundamental del

Algebra
1
arma que un polinomio de grado n tiene exactamente n races
en C (alguna puede estar repetida).
1
Demostrado por primera vez por Carl Friedrich Gauss en 1799 (a los 22 a nos) en su tesis doctoral.
Gauss ha salido repetidamente en estas lecciones y en campos muy distintos, desde las Matematicas mas
aplicadas a las mas puras. Quizas ahora se comprenda mejor por que recibio el sobrenombre deprncipe
de las Matematicas.
158
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 8. Matlab: Calculo simbolico y estructuras de datos.


En Matlab podemos utilizar roots para calcular de forma aproximada las races de un
polinomio:
>> pol=[2 -3 -17 30]; % 2*x^2-3*x^2-17*x+30
>> roots(pol)
ans =
-3.0000
2.5000
2.0000
>> pol2=[1 -2 2 -1];
>> roots(pol2). % un par complejas!!
ans =
1.0000 0.5000 + 0.8660i 0.5000 - 0.8660i
Recprocamente, dado un vector que contenga las races, podemos crear un polinomio
monico (el coeciente que acompa na a la mayor potencia de x es 1) cuyas races sean las
dadas:
>> poly([-3 5/2 2])
ans =
1 -3/2 -17/2 15
El comando poly puede emplearse tambien para construir el polinomio caracterstico de
una matriz cuadrada A, es decir, el polinomio
det(A xI)
donde I es la matriz identidad de orden n. Por ejemplo,
>> A=[3 -2 2;-1 2 2;-1 1 3];
>> p=poly(A) %pol caract. (monico)
p =
1 -8 19 -12
>> roots(p).
ans =
4 3 1
159
B
o
r
r
a
d
o
r
8.1 Polinomios y calculo simbolico LECCI

ON IV
En la segunda parte de esta leccion nos centraremos en los metodos numericos para el
calculo de las races de estos polinomios
2
.
Nota. Un problema clasico
3
es la determinacion de las races de un polinomio. La
ecuacion de segundo grado aparece mas o menos resuelta en las Matematicas antiguas:
babilonicas, griegas, hind ues y arabes. Es un hecho muy resaltable que no exista una
formula para la solucion como la como la que conocemos hoy en da, sino que los autores
describan diversas ecuaciones, habitualmente con ejemplos concretos, para luego explicar
como se proceda a resolverlas
4
a menudo con razonamientos geometricos que excluan
cualquier resultado negativo. Fue en las matematicas hind ues donde las races negativas
fueron consideradas como validas.
Las matematicas italianas primero y europeas despues retoman a partir del siglo XV
las ecuaciones polinomicas. Nicolo Fontana Tartaglia, Girolamo Cardano, Francois Vi`ete,
Rene Descartes, Gottfried Wilhelm von Leibniz, Joseph-Louis Lagrange y Leonhard Euler
entre otros matematicos de menor renombre, estudiaron la resolucion por radicales de
ecuaciones polinomicas de tercer y cuarto grado con un resultado nal satisfactorio: se
consiguio dar con formulas que proporcionaban las races de un polinomio de grado 4. Sin
embargo fueron incapaces de encontrar una formula para la ecuacion general de quinto
grado. La cuestion quedo zanjada de forma sorprendente: Niels Henrik Abel probo en 1824
(a los 22 a nos) que no exista un formula que diera las races de cualquier polinomio de
grado 5 mediante la aplicacion de radicales
5
tomando races enesimas. En ultima medida,
se haba llegado a la conclusion de que era imposible la resolucion exacta de ecuaciones
polinomicas de grado mayor o igual que cinco. El estudio de cuando una ecuacion se poda
resolver mediante radicales fue iniciado por Evariste Galois
6
.
Otro asunto muy diferente es la resolucion numerica del problema. Se dispone de una
familia de metodos para la resolucion de problemas no lineales generales (es decir, para
ecuaciones de la forma f(x) = 0 donde f es una funcion cualquiera, no necesariamente
polinomica) como los metodos de Newton-Raphson, secante, regulafalsi, etc. Sin em-
bargo, dadas las particulares propiedades de los polinomios, hay metodos especialmente
dise nados para tal n. Algunos metodos clasicos son los de Bairstow y el de Bernoulli. En
los ultimos a nos el calculo de las races de un polinomio ha quedado reducido al calculo
2
Las races son los valores propios de la matriz A.
3
La informacion de estas lneas se ha extrado de la web MacTutor History of Mathematics
Archive de la Universidad de St. Andrews (Escocia). La direccion electronica es http://turnbull.mcs.st-
and.ac.uk/history/
4
al-Khwarizm clasico y explico como resolver ecuaciones de segundo grado en 6 tomos. El desarrollo
del

Algebra y la manipulacion simbolica de expresiones ha conseguido que este problema pueda ser
planteado en nuestros das a un alumno de primaria.
5
Paolo Runi haba dado una demostracion no del todo correcta en 1799.
6
Galois y Abel comparten algunas caractersticas en com un, ambos murieron jovenes (Abel a los 29
a nos y Galois a los 21) con buena parte de su trabajo ignorado por la comunidad matematica. La muerte
de Galois es todava mas sorprendente. Frances y republicano convencido, llego a estar en prision por ello,
murio en un duelo en 1832 en los a nos convulsos posteriores a la revolucion francesa, aunque no esta claro
si este fue por motivos polticos o de otra ndole. En la noche anterior al duelo escribira en el margen de
unas notas sobre las que trabaja: Falta algo para completar la demostracion. No tengo tiempo.. Esta
frase ha cimentado la, probablemente exagerada, leyenda de que paso la noche escribiendo Matematicas.
Su trabajo fue rescatado del olvido por Joseph Liouville 11 a nos despues.
160
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 8. Matlab: Calculo simbolico y estructuras de datos.


de los valores propios de una matriz, simplemente construyendo la matriz compa nera
7
x
n
+a
n1
x
n1
+. . . a
0

_

_
a
n1
a
n2
a
1
a
0
1 0 0 0
0 1
.
.
.
0 0
.
.
.
.
.
.
.
.
.
.
.
.
0 0 1 0
_

_
Al calculo de los valores propios de una matriz volveremos en la segunda parte de esta
leccion.
8.2. Procesador simbolico
Retomando el hilo de la seccion anterior, otra forma de operar con polinomios es de
manera simbolica. Para ello podemos proceder del siguiente modo:
>> syms x %define x como variable simbolica
>> (x^4+x^2-1)+(2*x^3+4*x^2+3) %suma de polinomios
ans =
x^4+5*x^2+2+2*x^3
>> expand((x^4+x^2-1)*(2*x^3+4*x^2+3)) %expande el producto
ans =
2*x^7+4*x^6+2*x^5+7*x^4-2*x^3-x^2-3
Observa con atencion la primera instruccion. Con syms, declaramos x con una variable
simbolica y por tanto susceptible de entrar en expresiones y manipulaciones algebraicas.
Las ordenes anteriores pueden aplicarse sobre funciones cualesquiera, no necesaria-
mente polinomicas:
>> syms x y
>> expand(cos(x+y))
ans=
cos(x)*cos(y)-sin(x)*sin(y)
Podemos llevar a cabo operaciones de calculo basico tales como la integracion o la
derivacion:
7
De hecho, as procede roots.
161
B
o
r
r
a
d
o
r
8.2 Procesador simbolico LECCI

ON IV
>> diff(x*cos(x^2)) %derivada
ans =
cos(x^2)-2*x^2*sin(x^2)
>> diff(x^4+x^2-1,3) %tercera derivada
ans =
-24*x^2*cos(x^2)-6*sin(x^2)+8*x^4*sin(x^2)
>> int(exp(x)*cos(4*x),x) %integral indefinida
ans =
1/17*exp(x)*cos(4*x)+4/17*exp(x)*sin(4*x)
>> int(exp(x)*cos(4*x),x,0,pi) %integral definida
ans =
1/17*exp(pi)-1/17
De forma similar se pueden calcular lmites (limit), sumar series (symsum),
>> sym k;
>> symsum(1/k^2,k,1,inf)
ans=
1/6*pi^2
hacer desarrollos de Taylor (taylor) o transformadas integrales como las de Fourier o
Laplace (fourier, ifourier, laplace e ilaplace)
Observa como los resultados son smbolos y no n umeros. En cualquier caso, el comando
vpa procede a evaluar con la precision solicitada (si es posible)
>> vpa( 1/17*exp(pi)-1/17) % 32 cifras por defecto
ans=
1.3023936842811332237346277906909
>> vpa( 1/17*exp(pi)-1/17,64) % ahora con 64 cifras
ans=
1.3023936842811332237346277906908653676509857177734375000
162
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 8. Matlab: Calculo simbolico y estructuras de datos.


Nota. La derivacion e integracion de un polinomio se puede hacer tambien con polyder
y polyint que trabaja directamente sobre el vector que almacena el polinomio, es decir,
no es simb olico:
>> polyder([1 4 2]) % derivada de x^2+4*x-2
ans=
2 4

Ejercicio 8.2 Los siguientes comandos inciden en la simplicacion y manipulacion de expre-


siones
simplify factor expand collect simple
Consulta la ayuda de Matlab y aplcalos sobre diferentes expresiones algebraicas susceptibles
de ser simplicadas.
Para la resolucion de ecuaciones y sistemas de ecuaciones mediante metodos simbolicos,
con las limitaciones que esto implica, podemos utilizar el comando solve:
>> solve(x*log(x^2+4*x-4)=0)
ans =
0
1
-5
Cuando el termino independiente es cero puede omitirse:
>> solve(x*log(x^2+4*x-4))
De forma analoga, dsolve busca las soluciones de ecuaciones y sistemas diferenciales:
>> dsolve(D3y-D2y-2*Dy-cos(s),s) % y-y-2y-cos(s)=0
ans =
-3/10*sin(s)+1/10*cos(s)+C1+C2*exp(2*s)+C3*exp(-s)
>> dsolve(D3y-D2y-2*Dy-cos(s),y(0)=1,Dy(0)=2, D2y(0)=3,s)
ans =
-3/10*sin(s)+1/10*cos(s)+1/2+9/10*exp(2*s)-1/2*exp(-s)
Ejercicio 8.3 Utiliza solve para hallar las cuatro races de la ecuacion de cuarto grado
x
4
+ax
3
+bx
2
+cx +d.
163
B
o
r
r
a
d
o
r
8.3 Tensores LECCI

ON IV
Nota. Matlab es un programa mas enfocado al calculo numerico que al simbolico. Cier-
tamente los resultados son presentados de una forma que esteticamente no es comparable
a Mathematica o Maple. Sin embargo se puede acceder a cualquier instruccion de Maple
luego a priori todo lo que se puede hacer con este procesador se puede hacer con Matlab.
Para llamar a un comando de Maple se utiliza el comando maple, mientras que a la ayuda
correspondiente se accede con mhelp.
8.3. Tensores
Ya hemos hablado en m ultiples ocasiones de la gran potencia que posee Matlab para
realizar calculos matriciales
8
y su habilidad en el manejo de grandes cantidades de memo-
ria. Estas habilidades se extienden a la manipulacion de arrays multidimensionales, que
matematicamente se puede identicar con tensores. Un tensor es simplemente una matriz
multidimensional, esto es, si una matriz se puede interpretar como una tabla de n umeros,
un tensor (o array) tridimensional es simplemente un conjunto de n umeros desplegados
en 3D en forma de paralelogramo. As
>> a=zeros(1,3,2)
a(:,:,1) =
0 0 0
a(:,:,2) =
0 0 0
dene un array de una la, tres columnas y dos alturas. Abandonaremos en lo que sigue
este smil geometrico pues aporta poco. Se puede declarar un tensor simplemente dando
sus valores
>> a2(:,:,1)=[1 2 3;4 5 6]
a2 =
1 2 3
4 5 6
>> a2(:,:,2)=[7 8 9;10 11 12]
a2(:,:,1) =
1 2 3
4 5 6
8
Recuerda Matlab = Matrix laboratory
164
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 8. Matlab: Calculo simbolico y estructuras de datos.


a2(:,:,2) =
7 8 9
10 11 12
>> size(a)
ans =
2 3 2
>> length(a) %maximo de las dimensiones
ans =
3
Observa la diferencia
>> a1=a(1,:,:)
a1(:,:,1) =
1 2 3
a1(:,:,2) =
7 8 9
>> a2=a(:,1,:)
a2(:,:,1) =
1
4
a2(:,:,2) =
7
10
>> a3=a(:,:,1)
a3 =
165
B
o
r
r
a
d
o
r
8.3 Tensores LECCI

ON IV
1 2 3
4 5 6
Por tanto, de las variables que acabamos de denir unicamente a3 es una matriz propia-
mente dicha.
La forma de operar con tensores es basicamente la misma que con vectores y matrices.
Por ejemplo:
>> b=a+ones(2,3,2)
b(:,:,1) =
2 3 4
5 6 7
b(:,:,2) =
8 9 10
11 12 13
>> b(:,2:3,2)=[-1 -2;-3 -4]
b(:,:,1) =
2 3 4
3 3 3
b(:,:,2) =
8 -1 -2
3 -3 -4
>> b(:) % como se guarda en memoria...
ans =
2 3 3 3 4 3 8 3 -1 -3 -2 -4
Ejemplo. Mediante las siguientes ordenes calculamos las cinco primeras potencias de
la matriz a y las almacenamos en una variable tridimensional b:
a=[1 2;3 4];
b(:,:,1)=a;
for i=2:5
b(:,:,i)=b(:,:,i-1)*a; %b(:,:,i) guarda a^i
end

166
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 8. Matlab: Calculo simbolico y estructuras de datos.


Las funciones que operan sobre escalares, tales como sin, cos, etc., funcionan con
tensores exactamente del mismo modo que con vectores o matrices, realizando las opera-
ciones elemento a elemento. Si se aplica una funcion de las que operan sobre los elementos
de un tensor como por ejemplo b usqueda de maximos o mnimos (max, min) o la suma y
producto (sum, prod), devuelve un tensor de una dimension menos, resultado de realizar
la operacion sobre la primera dimension:
>> a=zeros(2,3,2);
>> a(:,:,1)=[1 2 8; 4 5 6]; a(:,:,2)=[6 2 14; 3 5 1]
a(:,:,1) =
1 2 8
4 5 6
a(:,:,2) =
6 2 14
3 5 1
>> max(a) % 1x3x2
ans(:,:,1) =
4 5 8
ans(:,:,2) =
6 5 14
>> max(max(a)) % 1x1x2
ans(:,:,1) =
8
ans(:,:,2) =
14
>> max(max(max(a))) % 1x1x1, un numero
ans =
6
167
B
o
r
r
a
d
o
r
8.4 Vectores de celdas LECCI

ON IV
8.4. Vectores de celdas
Aunque los tensores a naden mayor exibilidad a las matrices y vectores, siguen siendo
estructuras rgidas (todas las entradas deben ser n umeros reales, a(1,:,:,:) debe tener
la misma dimension que a(2,:,:,:),...).
Matlab cuenta con una estructura que probablemente sea el paradigma de la exibilidad
en tanto en cuanto permite guardar casi cualquier tipo de dato. Es, por as decirlo, un
cajon de sastre. Este tipo de estructura se denomina vector (matriz o tensor) de celdas
o cell array. Ya nos hemos encontrado con esta estructura cuando vimos el dise no de
funciones cuyo n umero de parametros de entrada y/o salida era variable. Las variables
varargin y varargout son realmente vectores de celdas que contenan distintos tipos de
datos a los que se acceda mediante llaves. Un vector de celdas se maneja del mismo. A
modo de ejemplo podemos crear un vector de celdas simplemente asignando valores
>> celda={7,[1 2 3;4 5 6],una cadena de caracteres,inline(x+y)};
>> whos celda
Name Size Bytes Class
celda 1x4 1214 cell array
Grand total is 95 elements using 1214 bytes
que es equivalente a dar cada una de sus componentes
>> celda{1}=7;
>> celda{2}=[1 2 3;4 5 6];
>> celda{3}=una cadena de caracteres;
>> celda{4}=inline(x+y);
Tambien se puede proceder, con peque nas diferencias de sintaxis, de la siguiente forma
>> celda(1)={7};
>> celda(2)={[1 2 3;4 5 6]};
Fjate en la disposicion de las llaves en los dos ejemplos anteriores. En cualquier caso, una
vez denido el vector podemos acceder a cada una de sus componentes indicando entre
llaves su posicion
>> celda{1}
ans =
7
>> celda{4}([1 2 4], [2 1 1/2]) % funcion!!
ans =
3.0000 3.0000 4.5000
168
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 8. Matlab: Calculo simbolico y estructuras de datos.


o visualizar todas ellas mediante
>> celldisp(celda)
celda{1} =
7
celda{2} =
1 2 3
4 5 6
celda{3} =
una cadena de caracteres
celda{4} =
Inline function:
(x,y) = x+y
Este tipo de estructura, aunque muy exible a la hora de almacenar informacion, es
sin embargo manejada con menor eciencia por Matlab, por lo que debe hacerse un uso
mesurado de ella. Los comandos varargin y varargout proporcionan un buen ejemplo
de una utilizacion apropiada de esta estructura.
Ejercicio 8.4 Otra manera de agrupar distintos tipos de datos es utilizar estructuras (struct).
Una estructura es un tipo de dato del que luego se pueden asignar campos distintos. Por ejem-
plo, la estructura Libro podra contener los campos Titulo y Autor que seran cadenas de
caracteres y A~noPublicacion y NumeroPaginas que seran n umeros.
Utiliza la ayuda de Matlab para averiguar como pueden denirse estos tipos de datos
mediante la orden struct.
169
B
o
r
r
a
d
o
r
8.4 Vectores de celdas LECCI

ON IV
170
B
o
r
r
a
d
o
r
Captulo 9
Calculo numerico de valores y
vectores propios.
9.1. Introduccion
El estudio de los valores y vectores propios de una matriz surge ligado a una gran
cantidad de problemas que se plantean en ambitos de muy diversa ndole, tales como la
Ingeniera, Fsica, Economa, Estadstica o Biologa. Algunos ejemplos los encontramos
en el calculo de los modos de vibracion de algunas estructuras, el estudio de la evolucion
de sistemas dinamicos, compresion de datos, el analisis de redes (grafos),...
El problema que abordamos es el siguiente: dada una matriz A de tama no n n
queremos encontrar los escalares y vectores v ,= 0 que cumplan
Av = v.
Se dice entonces que es un valor propio de A y que v es un vector propio asociado
a . Se trata por tanto de buscar las direcciones invariantes bajo los productos por la
matriz.
Equivalentemente, los valores propios de A son aquellos valores para los que el
sistema lineal homogeneo
(A I)v = 0,
tiene soluciones no nulas, y estas soluciones son los vectores propios asociados a . Esta
expresion nos da una manera de calcular : los valores propios son los valores, reales o
complejos, para los que AI no es invertible, o equivalente, para los que det(AI)=0.
Concluimos de esta manera que los valores propios son las races del polinomio
p() := det(A I) = 0.
conocido como polinomio caracterstico. Dado que p() tiene grado n, habra exactamente
n valores propios (aunque alguno de ellos puede estar repetido o ser complejo).
Historicamente los metodos numericos comenzaron trabajando sobre el polinomio car-
acterstico para hallar los valores propios, pero pronto se comprobo que este camino no
era el mas indicado. Uno de los hechos que motivaron este abandono radicaba en la in-
estabilidad numerica:
171
B
o
r
r
a
d
o
r
9.1 Introduccion LECCI

ON IV
Las races de un polinomio son muy sensibles a variaciones en sus coecientes;
El polinomio a su vez puede ser muy sensible a las entradas de la matriz.
En vista de lo anterior se planteo el problema original: son los valores y vectores propios
sensibles a peque nas modicaciones de las entradas de la matriz?. Afortunadamente para
matrices simetricas se tiene la ansiada estabilidad: peque nas variaciones en A, producto
por ejemplo de errores de medida o errores de redondeo, dan lugar a peque nas modica-
ciones en los valores propios
1
. Para matrices arbitrarias este resultado dista mucho de ser
cierto, las condiciones para asegurar la estabilidad son mas complicadas, y podemos en-
contrarnos con lo que en la terminologa habitual se denomina, matrices mal condicionadas
para el calculo de valores propios.
Ejemplo Estas lneas muestran la sensibilidad de una matriz muy simple ante una
peque na variacion en una entrada.
>> a=[149 50 154;-537 -180 -546;27 9 25];
>> p= poly(a)
p =
1.0000 6.0000 11.0000 6.0000
>> roots(p).
ans =
-3.0000 -2.0000 -1.0000
>> b=[149 50 154;-537 -180.01 -546;27 9 25];
>> q=poly(b)
ans =
1.0000 6.0100 9.2600 1.6700
>> roots(q).
ans=
-3.5019 -2.3008 -0.2073

Ejercicio 9.1 Repite el ejemplo anterior con diferentes matrices simetricas y observa como
el resultado es mas estable.
1
Probado por primera vez por Hermann Weyl en 1911 en un area totalmente distinta.
172
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


Nota.

Este y otros detalles no eran conocidos en los inicios del calculo cientco. James
Hardy Wilkinson relata la siguiente anecdota
2
. Cuando estaba programando en uno de los
primeros ordenadores electronicos el metodo de Newton para la resolucion de ecuaciones
no lineales, decidio testarlo con el siguiente polinomio
(x 20)(x 19) (x 1).
El metodo fallaba de forma reiterada, a pesar de las sucesivas revisiones del codigo, hasta
que Wilkinson cayo en la cuenta de que el error no radicaba en su programa sino que
las races eran tan sensibles numericamente que se vean afectadas por los errores de
redondeo. Wilkinson demostro que al cambiar el coeciente de x
19
en p, que es 210,
por 210 2
23
, las races 16 y 17 se transforman
3
en el par complejo 16.73 2.81i.
El polinomio en cuestion paso a la historia del Numerico con el nombre de el perdo
polinomio de Wilkinson.
9.2. Matrices semejantes
Dos matrices A y B son semejantes si existe una matriz P invertible tal que
B = PAP
1
.
En este caso,
det(B I) = det(PAP
1
I) = det(P(A I)P
1
) =
= det(P) det(A I) det(P
1
) = det(A I),
es decir, A y B tienen el mismo polinomio caracterstico y por tanto los mismos valores
propios.
Este resultado sugiere una estrategia para encontrar los valores propios de A: buscar
matrices semejantes para las que el calculo de los valores propios sea sencillo. En particular,
cuando B es triangular sus valores propios son simplemente los elementos diagonales.
Si podemos tomar los n vectores propios linealmente independientes, la matriz P :=
[v
1
[v
2
[ . . . [v
n
] (su iesima columna es el vector v
i
) es invertible. Entonces
AP = PD P
1
AP = D,
donde D es una matriz diagonal con los valores propios sobre la diagonal. Si una matriz
es semejante a una matriz diagonal se dice que es diagonalizable.
Particularmente interesante es el caso en que P se puede tomar ademas ortogonal.
Esto es, P
1
= P

, y por tanto
P

AP = D.
Las matrices ortogonales son muy estables numericamente y posibilitan el dise no de meto-
dos mas robustos frente a errores de redondeo.
2
Recogida por D. Kincaid y W. Cheney en su excelente libro Analisis Numerico: Las Matematicas
del Calculo Cientco. Addison-Wesley, 1994.
3
Como asumir que las races de un polinomio tan sencillo fueran imposibles de aproximar por un
ordenador? Wilkinson dira despues Speaking for myself I regard it as the most traumatic experience in
my career as a numerical analyst
173
B
o
r
r
a
d
o
r
9.3 Metodo de potencias LECCI

ON IV
Teorema 9.1 Si A es simetrica, existe Q ortogonal tal que Q

AQ = D con D diagonal con


los valores propios de A. En particular, los valores propios de una matriz simetrica son todos
reales.
En las Secciones 9.4 y 9.5 de esta leccion se estudiaran dos metodos basados en trans-
formaciones de semejanza (producto por matrices ortogonales) que tratan de llevar una
matriz simetrica a una forma diagonal como forma de calcular los valores propios. Estos
metodos se pueden adaptar, con mas o menos exito, a matrices arbitrarias llevando en
este caso la matriz a una forma triangular o cuasitriangular.
9.3. Metodo de potencias
En esta seccion presentaremos el metodo de potencias y algunas variantes del mismo
que proporcionan un valor propio de la matriz. Estos metodos combinados con tecnicas
de deacion, que consisten en construir una nueva matriz con los mismos valores propios
que la original salvo el ya el calculado, permiten calcular unos pocos valores propios.
9.3.1. Descripcion del metodo
Asumiremos para empezar que la matriz A tiene un valor propio dominante, es decir,
sus valores propios pueden ordenarse en la forma
[
1
[ > [
2
[ [
3
[ . . . [
n
[.
Supongamos ademas que tenemos una base formada por vectores propios, esto es pode-
mos tomar v
i

n
i=1
vectores propios linealmente independientes (la matriz A es por tanto
diagonalizable). Entonces, cualquier vector x
0
puede escribirse en la forma
x
0
=
n

i=1

i
v
i
con
i
adecuados. Multiplicando reiteradamente por A obtenemos
A
m
x
0
=
n

i=1

m
i
v
i
=
m
1
_

1
v
1
+
2
_

1
_
m
v
2
+. . . +
n
_

1
_
m
v
n
_
. (9.1)
Entonces, si
1
,= 0 y m es grande
x
m
:= A
m
x
0

m
1

1
v
1
,
es decir, x
m
tiende a apuntar en la direccion del vector propio asociado al valor propio
de mayor modulo (en el lenguaje habitual se habla del valor propio dominante). El valor
propio
1
se puede calcular, entre otras posibilidades, mediante el conocido cociente de
Rayleigh:

(m)
1
:=
x

m
Ax
m
|x
m
|
2
=
x

m
x
m+1
|x
m
|
2

1
.
174
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


Proposicion 9.2 Bajo las hipotesis anteriores

(m)
1
=
1
+O
__

2
_
m
_
.
Si ademas A es simetrica

(m)
1
=
1
+O
__

2
_
2m
_
.
Basado en estas ideas surge el metodo de potencias, que simplemente consiste en
multiplicar un vector inicial por las potencias sucesivas de la matriz A. Para evitar que
los vectores x
m
tengan componentes muy grandes o muy peque nas se genera una sucesion
de vectores normalizados, es decir, una vez multiplicado por A se procede a dividir por
su norma.
El algoritmo es el siguiente:
Metodo de potencias
01 x
0
,= 0 vector inicial
02 y
0
=
x
0
|x
0
|
2
03 for m=1:mmax
04 x
m
= Ay
m1
05
(m)
= y

m1
x
m
06 y
m
=
x
m
|x
m
|
2
07 if |y
m
y
m1
|
2
< eps
08 return
09 end
10 end
La lnea 06 es simplemente el cociente de Rayleigh que, como la norma escogida para
normalizar es la eucldea, adopta esta expresion mas sencilla.
Hemos elegido como criterio de parada la diferencia entre dos vectores consecutivos.
Otra posible eleccion es
[
(m)

(m1)
[ < eps [
(m)
[.
Ejercicio 9.2 Programa el metodo de potencias
Solucion. He aqu una implementacion del metodo.
01 %POTENCIAS
02 %
03 %LB=POTENCIAS(A) Devuelve en LB una aproximacion del
175
B
o
r
r
a
d
o
r
9.3 Metodo de potencias LECCI

ON IV
04 % mayor valor propio de A calculado
05 % por el metodo de potencias
06 %
07 %[LB,V]=POTENCIAS(A) V es el vector propio
08 %
09 %[LB,V,NITER]=POTENCIAS(A) NITER son las iteraciones calculadas
10 %
11 % LB=POTENCIAS(A,MMAX) MMAX No. maximo de iteraciones n
12 %
13 % LB=POTENCIAS(A,MMAX,EPS) EPS es el criterio de parada
14 %
15 % LB=POTENCIAS(A,MMAX,EPS,V0) V0 vector inicial para la iteracion
16
17 function [lb,x,m]=potencias(a,varargin);
18
19 n=length(a);
20 if nargin>1 & ~isempty(varargin{1})
21 mmax=varargin{1};
22 else
23 mmax=n*2;
24 end
25 if nargin>2 & ~isempty(varargin{2})
26 eps=varargin{2};
27 else
28 eps=1e-6;
29 end
30 if nargin>3 & ~isempty(varargin{3})
31 y=varargin{3};
32 else
33 y=rand(n,1);
34 end
35 y=y/norm(y);
36
37 for m=1:mmax
38 x=a*y;
39 lb=y*x;
40 x=x/norm(x);
41 if norm(x-y)<eps
42 return
43 end
44 y=x;
45 end
46 disp(numero maximo de iteraciones superado)
Observa la utilizacion de isempty que permite que el usuario especique alguno de
los parametros, ignorando los anteriores sin mas que utilizar el vaco []. Por ejemplo, la
siguiente llamada es valida:
176
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


>> [lb,v]=potencias(a,[],[],v0); % especifico el vector inicial

Ejercicio 9.3 Compara la velocidad de convergencia y el n umero de iteraciones requerido


para distintas tolerancias y vectores iniciales al tomar las matrices
A =
_
_
1 3 0
4 9 4
2 1 5
_
_
, B =
_
_
1 3 0
3 9 4
0 4 5
_
_
, C =
_
_
1 4 2
4 9 1
2 1 5
_
_
.
Nota. Cuando no se conoce una aproximacion del vector propio asociado al valor propio
dominante, se suele iniciar el algoritmo partiendo de un vector generado aleatoriamente.
Podra ocurrir que para el vector inicial
1
= 0, pero la probabilidad de que se de este
problema es (practicamente) nula. En este caso, si [
2
[ > [
3
[, salvo por errores de re-
dondeo
4
, el metodo proporcionara el valor propio subdominante
2
y su vector propio
asociado normalizado.
No es necesario que la matriz sea diagonalizable para que el metodo de potencias
converja. Tampoco que el subespacio asociado al valor propio dominante este generado
por un unico vector. En este caso, que solo puede darse si
1
es un valor propio repetido, el
metodo puede converger a distintos vectores propios normalizados dependiendo del vector
inicial considerado.
Si [
1
[ = [
2
[, es decir,
1
=
2
o
1
y
2
son n umeros complejos conjugados, entonces
el metodo de potencias falla.
Ejercicio 9.4 Consideremos la matriz
A =
_

_
0 0 0 24
1 0 0 50
0 1 0 35
0 0 1 10
_

_
cuyos valores propios son 1, 2, 3 y 4.
1. Aplicar el metodo de potencias a la matriz A partiendo de un vector aleatorio y del
vector (20, 33, 15, 2)

.
2. Sabiendo que v
1
= (24, 26, 9, 1)

y v
2
= (12, 19, 8, 1)

son vectores propios


asociados a los valores propios 1 y 2 respectivamente, que crees que ocurrira si se toma
como vector inicial v
1
3v
2
= (12, 31, 15, 2)

?
3. Observa para distintas tolerancias la diferencia entre partir del vector del apartado an-
terior y de (12, 31, 15, 2.0001)

.
4
El efecto de los errores de redondeo se traduce en una componente no nula en la direccion de v
1
,
incluso aunque el vector inicial no la tuviese. Se podra decir que este es uno de los pocos casos en los
que los errores de redondeo nos pueden ayudar.
177
B
o
r
r
a
d
o
r
9.3 Metodo de potencias LECCI

ON IV
Ejercicio 9.5 En este ejercicio vamos a comprobar que el calculo de los valores propios
utilizando el polinomio caracterstico no es el camino correcto. Teclea las instrucciones en un
chero script
n=50;
d=1/n:1/n:1; [q,r]=qr(rand(n));
a=q*d*q;
En a tenemos una matriz simetrica con valores propios
5
0.02, 0.04, 006, . . . , 1. Se trata de
que apliques potencias para calcular el valor propio dominante y compares el resultado con el
que obtienes al calcular las races del polinomio caracterstico.
Compara los resultados. Cambia el valor de n y observa el efecto que tiene en matrices
cada vez mas grandes.
9.3.2. Variantes del metodo de potencias
Metodo de la potencia inversa
Si A es invertible y v es un vector propio asociado a un valor propio (que sera distinto
de cero), entonces,
Av = v A
1
v =
1
v.
Es decir,
1
es un valor propio de la matriz inversa y v es un vector propio asociado.
Por tanto podemos aplicar el metodo de potencias a la matriz A
1
para calcular el menor
valor propio en valor absoluto de A.
En lugar de calcular el producto x
m
= A
1
y
m1
(lnea 04 en el metodo de potencias)
resolveremos en cada iteracion el sistema
6
Ax
m
= y
m1
.
Disponemos para ello de una galera amplia de metodos vistos en las Lecciones I y II.
Notemos ademas que en cada iteracion se tiene que resolver un sistema cuya matriz
es siempre la misma, as que si optamos por un metodo directo podemos calcular la
factorizacion LU una unica vez, fuera del bucle for (lneas 03--10), y resolver de forma
reiterada los dos sistemas triangulares. Si por contra se opta por un metodo iterativo,
podemos arrancar el esquema utilizando x
m1
, la aproximacion del vector propio calculada
en la iteracion anterior.
Ejercicio 9.6 Programa a partir del Ejercicio 9.2 el algoritmo de la potencia inversa.
Metodo de potencias desplazado
Si es un valor propio de A, entonces es un valor propio de AI y ( )
1
lo es de (A I)
1
. Por tanto, si aplicamos el metodo de potencias a la matriz
A I
5
El comando qr descompone A = QR con Q ortogonal y R triangular. Por tanto los valores propios
de Q

AQ coinciden con los de A. La Seccion 9.5.1 esta dedicada al calculo de esta descomposicion.
6
Recuerda que invertir una matriz para multiplicarla posteriormente por un vector es mucho mas
costoso que resolver el sistema correspondiente.
178
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


donde es una constante conocida, podemos obtener el valor propio de A mas alejado
de . Mas interesante desde el punto de vista practico es aplicar el metodo de potencias
a (A I)
1
, que nos proporcionara el valor propio de A mas proximo a .
Ejercicio 9.7 Modica el programa del Ejercicio 9.6 para implementar el metodo de poten-
cias desplazado. Los argumentos obligatorios de entrada seran ahora A y alpha.
Comentarios nales
El metodo de potencias tiene una ventaja evidente: su simplicidad. Ni siquiera nece-
sitamos la matriz en s, solo saber multiplicar por ella.
El algoritmo de la potencia desplazada se puede utilizar para el calculo de un vector
propio si se conoce , el valor propio asociado. Basta para ello aplicar el metodo con
= + con << 1. Puede plantearse si esto tiene efectos perniciosos habida cuenta
de que AI esta muy cerca de ser singular. Wilkinson probo sin embargo que el efecto
de esta inestabilidad se da precisamente en la direccion del vector propio, que a n de
cuentas es lo que nos interesa.
Se puede sugerir una version alternativa del metodo de potencias desplazada consis-
tente en tomar un nuevo en cada iteracion, por ejemplo el ultimo valor calculado
(m)
.
Aunque esto acelera enormemente la convergencia del metodo, dispara el costo por it-
eracion, ya que en cada paso hay que resolver un sistema lineal nuevo, por lo que salvo
en contados casos no es recomendable.
Si se conoce un valor propio de una matriz A de tama no n, puede construirse una
nueva matriz de tama no n 1 que tiene exactamente los mismos valores propios que A
salvo . Podra aplicarse ahora el metodo de potencias (o cualquiera de sus variantes) a la
nueva matriz para determinar un nuevo valor propio de A. Este tipo de tecnica, en la que
no entraremos en estos apuntes, se conoce como deacion. Debemos se nalar que mediante
esta tecnica los errores de redondeo se van acumulando, de modo que solo es factible para
calcular unos cuantos valores propios. El n umero nal depende obviamente de la propia
matriz y de la precision con que se van calculando los valores propios.
9.4. Metodo de Jacobi
En esta seccion estudiaremos un metodo que nos proporcionara todos los valores pro-
pios de una matriz simetrica (todos son reales) mediante un esquema iterativo basado
en transformaciones de semejanza.
9.4.1. Descripcion del metodo
El metodo de Jacobi transforma en cada paso una matriz simetrica A en otra semejante
con estructura mas diagonal mediante el producto a izquierda y derecha por matrices
apropiadas. Una matriz de Givens, tambien llamada de rotacion, es una matriz de la
179
B
o
r
r
a
d
o
r
9.4 Metodo de Jacobi LECCI

ON IV
forma
R
pq
() =
_

_
1
.
.
.
cos sin
1
.
.
.
1
sin cos
.
.
.
1
_

_
la p
la q

col. p col. q
(9.2)
Es facil ver que son ortogonales, es decir, R
pq
()
1
= R
pq
()

.
Mediante
A
1
:= R

pq
AR
pq
(p, q y adecuados) vamos a anular el mayor elemento extradiagonal de A. Esta operacion
solo afecta a las las y columnas p, q de A. Concretamente, si denotamos por a
(1)
ij
las
entradas de A
1
,
a
(1)
pq
= (a
qq
a
pp
) cos sen +a
pq
(cos
2
sen
2
) =
=
1
2
(a
qq
a
pp
) sen(2) +a
pq
cos(2).
Por tanto, el angulo debe tomarse de modo que
_

_
cos(2) = 0, si a
qq
= a
pp
,
tan(2) =
2a
pq
a
qq
a
pp
, en caso contrario.
Para calcular cos y sen evitando el uso de un arcotangente se recurre a algunas
manipulaciones trigonometricas que prueban que si
7
:=
a
qq
a
pp
2a
pq
, t :=
sign()
[[ +

2
+ 1
,
entonces
cos =
1

t
2
+ 1
, sen =
t

t
2
+ 1
.
Cuando a
qq
= a
pp
tomamos
cos =
1

2
, sen
m
=
sign(a
qq
)

2
.
7
sign (z) es el signo de z, 1 si z es negativo, 1 en caso contrario.
180
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


El metodo ya se vislumbra en este estado: se trata de repetir el mismo argumento
con A
1
para obtener una segunda matriz A
2
resultado de cancelar el mayor elemento
extradiagonal de A
1
. De esta forma, reiterando este proceso llegamos a una sucesion de
matrices A
m
que cumplen
A
m
D :=
_

2
.
.
.

n
_

_
, cuando m .
Ademas, deniendo Q
m
:= R
p
1
q
1
(
1
)R
p
2
q
2
(
2
) . . . R
p
m
q
m
(
m
), donde R
p
k
,q
k
es la matriz
utilizada en el paso kesimo
Q
1
m
AQ
m
= A
m
D.
Por tanto, las columnas de Q
m
son las aproximaciones (ortonormales) de los vectores
propios correspondientes.
El siguiente teorema prueba la convergencia de este metodo. Para ello necesitamos la
llamada norma de Frobenius
8
|A|
F
:=
_
n

i,j=1
[a
i,j
[
2
_
1/2
Teorema 9.3 Sea A
m
la matriz en la iteracion m, D
m
su diagonal y B
m
:= A
m
D
m
.
Entonces
|A
m
|
F
= |A
m+1
|
F
, |B
m+1
|
2
F
= |B
m
|
2
2[a
(m)
p
m
q
m
[
2
El resultado dice en primer lugar que la norma de Frobenius de una matriz no cambia
cuando se multiplica a izquierda y derecha por las matrices R
pq
(), una de ellas traspuesta.
De hecho se preserva cuando se multiplica, a izquierda y derecha, por matrices ortogonales
arbitrarias. El segundo resultado dice algo mas: el peso de los elementos extradiagonales
disminuye en cada paso seg un el elemento cancelado. Esto asegura la convergencia del
proceso hasta obtener una matriz diagonal.
En la practica, el proceso se interrumpe cuando los elementos que estan fuera de la
diagonal son sucientemente peque nos. En concreto, se suele tomar el siguiente criterio
de parada
[a
(m)
p
m
q
m
[ < eps
_
n

i=1
[a
(m)
ii
[
2
_
1/2
.
Fjate que las matrices A
m
y A
m+1
solo dieren en las las y columnas p
m
y q
m
. A
efectos practicos no sera necesario formar las matrices de rotacion ya que basta conocer
los valores de cos
m
y de sen
m
para construir A
m+1
a partir de A
m
.
Ejercicio 9.8 Implementa el metodo de Jacobi.
8
En Matlab sera norm(a(:)) o norm(a,fro).
181
B
o
r
r
a
d
o
r
9.4 Metodo de Jacobi LECCI

ON IV
Solucion. La parte central del programa se puede implementar con las siguientes lneas
01 % JACOBI
02 %
03 % D=JACOBI(A) Aplica el metodo de Jacobi a A y devuelve
04 % en D los valores propios; A debe ser
05 % simetrica
06 %
07 % [D,Q]= JACOBI(A) Q es ortogonal con QA Q=D
08 %
09 % [D,Q,NITER]= JACOBI(A) NITER Numero de iteraciones calculadas
10 %
11 % D=JACOBI(A,NMAX) NMAX numero maximo de iteraciones
12 %
13 % D=JACOBI(A,NMAX) NMAX numero maximo de iteraciones
14 %
11 % D=JACOBI(A,NMAX,EPS) EPS es el criterio de parada
12
13 function [d,Q,m]= jacobi(a,varargin)
14
15 n=length(a);
16 if nargin>1 & ~isempty(varargin{1})
17 mmax=varargin{1};
18 else
19 mmax=n^2;
20 end
21
22 if nargin>2 & ~isempty(varargin{2})
23 eps=varargin{2};
24 else
25 eps=1e-5;
26 end
27
28 Q=eye(n);
29 for m=1:mmax
30 d=diag(a);
31 %Calculo del mayor elemento extradiagonal
32 [max1,p]=max(abs(a-diag(d)));
33 [max2,q]=max(max1);
34 p=p(q);
35 if max2<eps*norm(d)
36 return % convergencia
37 end
38 %calculo sen y cos
39 if abs(a(q,q)-a(p,p))<eps
40 c=1/sqrt(2);
41 s=-c*sign(a(p,q));
182
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


42 else
43 theta=(a(q,q)-a(p,p))/(2*a(p,q));
44 t=sign(theta)/(abs(theta)+sqrt(theta^2+1));
45 c=1/sqrt(t^2+1);
46 s=c*t;
47 end
48 r=[c s ;-s c];
49 %La rotacion solo afecta a las filas y col. p y q
50 a([p q],:)=r*a([p q],:);
51 a(:,[p q])=a(:,[p q])*r;
52 Q(:,[p q])=Q(:,[p q])*r; % guardamos Q
53 end
54 disp(numero maximo de iteraciones sobrepasado);
55 return
Observa bien las lneas 32-33 que sirven para encontrar la posicion del maximo elemento
extradiagonal.

9.4.2. Variantes del metodo de Jacobi


Aunque el metodo de Jacobi ofrece la posibilidad de calcular de forma rapida todos
los valores propios, tiene una convergencia lenta incluso para matrices de tama no mod-
erado. Vamos a introducir algunas mejoras desde el punto de vista computacional, que
no matem atico. Concretamente vamos a realizar una peque na modicacion que aunque
eleva el n umero de iteraciones necesarias para converger (peor desde el punto de vista
matematico) cada iteracion se ejecuta en menos tiempo, de forma que al nal se consigue
reducir el tiempo de calculo (mejora computacional).
Para ello vamos a identicar primero donde se nos va el tiempo de calculo. Con este
n utilizaremos una de las herramientas mas utiles en Matlab: profile.
Comenzamos creando una matriz simetrica de tama no moderado:
>> a=rand(120); a=a+a;
y activamos el prole de Matlab con
>> profile on
Ahora Matlab va a llevar un control sobre el tiempo que consume cada lnea de codigo
9
.
A continuacion ejecuta el programa jacobi para a con un n umero maximo de iteraciones
sucientemente alto de forma que asegures convergencia. La instruccion
>> profile report
despliega un informe donde puedes ver el tiempo que ha consumido cada parte del pro-
grama. Se observa claramente que las lneas mas costosas son aquellas empleadas en la
b usqueda del maximo elemento extradiagonal (observa la Figura 9.1). Es precisamente
183
B
o
r
r
a
d
o
r
9.4 Metodo de Jacobi LECCI

ON IV
MATLAB Profile Report: Function Details
jacobi C: / Document s and Set t i ngs/ V ct or / Escr i t or i o/ Li br oMat l ab/ j acobi . m
Time: 14.75100000 s (100.0%)
Calls: 1
Self time: 14.75100000 s (100.0%)
Function: Time Calls Time/call
jacobi 14.75100000 1 14.75100000
Parent functions:
none
Child functions:
none
99% of the total time in this function was spent on the following lines:
33: f or m=1: mmax
0. 07643962 1%34: d=di ag( a) ;
35: %Cal cul o del mayor el ement o ext r adi agonal
13. 37100000 91%36: [ max1, p] =max( abs( a- di ag( d) ) ) ;
0. 26000000 2%37: [ max2, q] =max( max1) ;
38: p=p( q) ;
0. 07000000 0%39: i f max2<eps*nor m( d)
40: r et ur n %conver genci a
42: %cal cul o sen y cos
0. 09000000 1%43: i f abs( a( q, q) - a( p, p) ) <eps
44: c=1/ sqr t ( 2) ;
51: end
0. 10819591 1%52: r 0=[ c s ; - s c] ;
53: %La r ot aci on sol o af ect a a l as f i l as y col . p y q
0. 31000000 2%54: a( [ p q] , : ) =r 0' *a( [ p q] , : ) ;
0. 12000000 1%55: a( : , [ p q] ) =a( : , [ p q] ) *r 0;
0. 17000000 1%56: r ( : , [ p q] ) =r ( : , [ p q] ) *r 0; %guar damos r
0. 05000000 0%57: end
Figura 9.1: Profile aplicado al metodo de Jacobi.
184
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


en estas lneas donde debemos proponer nuestra mejora, reemplazando la b usqueda por
alg un proceso mas economico.
La variante que proponemos es la siguiente: recorreremos uno por uno todos los el-
ementos situados debajo de la diagonal (como la matriz es simetrica esto es suciente).
Si el tama no de un elemento es peque no, no hacemos nada y pasamos al siguiente. Si es
grande, se procede anularlo. Para dilucidar si es grande o peque no compararamos con
el tama no de la diagonal de forma semejante a como se hace en el programa original
(lnea 09). Una vez recorridos todos los elementos, esto es, una vez realizado un barrido
en la terminologa habitual, volvemos a empezar. Cada cierto n umero de iteraciones, por
ejemplo tras cada barrido, podemos medir el tama no de los elementos extradiagonales que
quedan para ver si se da por nalizada la ejecucion del programa. Si comprobamos que
hay todava elementos diagonales muy grandes, empezamos de nuevo.
Ejercicio 9.9 Implementa la modicacion sugerida en el parrafo de arriba. Ejecuta el profile
de Matlab y compara tiempos de ejecucion con el programa original. Que observas?. Fjate
tambien en el n umero de iteraciones que necesita para converger. Que te parece?.
Nota. La instruccion profile es muy util a la hora de depurar codigo dado que permite
controlar que partes del programa vale la pena optimizar y cuales no. La instruccion tiene
varios argumentos opcionales y comandos relacionados que puedes consultar en la ayuda.
Los comandos tic y toc son mas simples pero proporcionan menos informacion. El
primero activa el reloj y el segundo nos informa sobre el tiempo trascurrido desde que se
ejecuto tic.
9.5. Metodo QR de Francis
El metodo QR y sus variantes son sin lugar a dudas la eleccion mas apropiada para el
calculo de todos los valores propios de una matriz llena.
El metodo es muy facil de entender y sencillo de implementar. Sin embargo, es difcil
de comprender por que funciona (el analisis no es nada trivial).
Ya hemos visto descomposiciones matriciales del tipo A = LU con L (permutacion
de) triangular inferior con 1s en la diagonal y U triangular superior. Una descomposicion
alternativa es
A = QR
con Q ortogonal (Q

= Q
1
) y R triangular superior. Esta descomposicion siempre existe
y puede ser calculada de varias formas distintas.
El metodo QR de Francis consiste en grosso modo construir una sucesion de matrices
A
m
(A
0
= A) procediendo como sigue
A
m
= Q
m
R
m
(factorizar) A
m+1
:= R
m+1
Q
m+1
(construir)
Para una matriz simetrica el algoritmo converge practicamente en todos los casos a una
matriz diagonal con los valores propios. Mas adelante detallaremos el algoritmo y como se
9
Tener activada esta opcion resta algo de velocidad a los programas puesto que parte de Matlab
esta ocupada en autorevisarse. Con profile off desconectas este control.
185
B
o
r
r
a
d
o
r
9.5 Metodo QR de Francis LECCI

ON IV
puede mejorar su implementacion. En cualquier caso queda claro que antes de entrar en
materia debemos hablar con algo de profundidad de la descomposicion QR de una matriz.
Ejercicio 9.10 Probar que todas las matrices A
m
son semejantes y por tanto comparten los
mismos valores propios.
9.5.1. Factorizacion QR
Quizas la forma mas sencilla de calcular la descomposicion es aquella ligada al algo-
ritmo de Gram-Schmidt. Este algoritmo, uno de los clasicos en

Algebra Lineal, se utiliza
para hallar una base ortogonal de un subespacio partir de una base (o sistema generador)
dada. Las operaciones, una vez reescritas adecuadamente se pueden expresar de la forma
A = QR
donde las columnas de A son los vectores originales, las colunas de Q son los vectores
ortonormales que generan el mismo subespacio que los vectores columna de A y R es una
matriz triangular superior que indica como se transforma la base original en la nueva base
ortonormal. La descomposicion tiene sentido para matrices rectangulares y en este caso
las dimensiones de A y Q coinciden (si A, es mn, tambien lo es Q y R es n n).
Este algoritmo es, sin embargo, muy inestable numericamente y rara vez se utiliza en
la practica
10
.
Existen caminos distintos que nos conducen a la descomposicion QR. Los dos metodos
mas utilizados se basan en transformar la matriz original en una triangular superior mul-
tiplicando a izquierda por matrices ortogonales, ya sean rotaciones como las que aparecen
en el algoritmo de Jacobi (matrices de Givens), o matrices (reexiones) de Householder.
Factorizacion QR con Matrices de Householder
Una matriz de Householder viene dada por
Q = I 2 uu

, con |u|
2
=1,
donde u es un vector columna n1 e I es la matriz identidad de tama no n. Observa que
efectivamente es una matriz, ya que uu

es n n.
Es muy sencillo comprobar que es simetrica (Q

= Q) y que Q

Q = I, y por tanto
Q
1
= Q.
La factorizacion QR mediante transformaciones de Householder se basa en la siguiente
propiedad
Proposicion 9.4 Dado un vector columna x, si tomamos = |x|
2
y denimos
u :=
x e
1
|x e
1
|
2
, donde e
1
= (1, 0, . . . , 0)

,
Q := I 2 uu

,
entonces
Qx = (, 0, . . . , 0)

.
10
Existe el algoritmo de Gram-Schmit modicado que dota de algo mas de estabilidad al metodo
original.
186
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


Generalmente se suele escoger con el signo opuesto al de la primera componente de x
para que |u|
2
no sea demasiado peque na.
Para obtener una descomposicion A = QR podemos proceder del siguiente modo:
1. Construimos la matriz de Householder Q
1
como en la proposicion anterior tomando
como vector x la primera columna de A. Entonces
Q
1
A =
_

1
. . .
0
.
.
. A
2
0
_

_
(9.3)
2. Repetimos el proceso con la matriz A
2
que es (n 1) (n 1) para construir la
matriz de Householder Q

2
tal que
Q

2
A
2
=
_

2
. . .
0
.
.
. A
3
0
_

_
. (9.4)
Ahora basta considerar
Q
2
=
_

_
1 0 . . . 0
0
.
.
. Q

2
0
_

_
(9.5)
que cumple
Q
2
Q
1
A =
_

1
. . .
0
2
. . .
0 0
.
.
.
.
.
. A
3
0 0
_

_
3. En el kesimo paso se construyen las matrices Q

k
y Q
k
:
Q

k
A
k
=
_

k
. . .
0
.
.
. A
k+1
0
_

_
, Q
k
:=
_
I
k1
Q

k
_
,
donde I
k1
es la matriz identidad de tama no k 1.
Despues de n 1 pasos obtenemos la descomposicion
Q
n1
Q
1
A = R, con R triangular superior.
Deniendo Q := Q
1
Q
n1
, tenemos que Q
1
= Q
1
n1
Q
1
1
= Q
n1
Q
1
. Por tanto,
A = QR con Q ortogonal y R triangular superior.
Ejercicio 9.11 Implementa la descomposicion QR con matrices de Householder
187
B
o
r
r
a
d
o
r
9.5 Metodo QR de Francis LECCI

ON IV
Solucion. He aqu una implementacion del metodo
01 % [Q,R]=QRHOUSEHOLDER(A) Calcula Q ortogonal y R triangular
02 % superior tales que A=QR.
03 %
04 % El algoritmo esta basado en las matrices de Householder
05 %
06 function [q,r]=QRhouseholder(a)
07
08 n=length(a)
09 q=eye(n);
10 r=a;
11 for k=1:n
12 u=r(k:n,k); %primera columna
13 alpha=-sign(u(1))*norm(u);
14 u=u-alpha*[1;zeros(length(u)-1,1)];
15 u=u/norm(u);
16 qhouse=eye(length(u))-2*u*u;
17 r(k:n,k:n)=qhouse*r(k:n,k:n);
18 q(:,k:n)=r(:,k:n)*qhouse;
19 end
20 return
Observa la manipulacion simple de los bloques de a, q y r.

Ejercicio 9.12 Adapta el programa para calcular la factorizacion QR de matrices rectangu-


lares, es decir, matrices generales de m las y n columnas.
(Ayuda: el for de la lnea 11 es ahora for k=1:min([m,n]). El resto de cambios son inmediatos
sin mas que tener en cuenta los tama nos de las matrices implicadas.)
Si Q = I 2 uu

es nn y B nm, entonces el producto QB puede calcularse como


QB = (I 2 uu

)B = B 2u(u

B). (9.6)
Es decir, en ning un momento se requiere construir la matriz Q y unicamente necesitamos
realizar dos productos matriz-vector. El n umero de operaciones del producto QB es ahora
nm mientras que en la implementacion inicial el costo era n
2
m. De forma analoga se puede
calcular el producto BQ con B mn tambien en mn operaciones.
Ejercicio 9.13 Implementa la factorizacion QR utilizando las indicaciones previas. Compara
con alg un ejemplo la reduccion del tiempo de calculo.
Factorizacion QR con matrices de Givens
La factorizacion QR de una matriz se puede obtener tambien utilizando matrices de
rotacion, es decir, matrices de la forma (9.2). Esta alternativa es especialmente interesante
si la matriz tiene sus elementos no nulos concentrados entorno a la diagonal. Para matrices
188
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


llenas el tiempo de calculo es practicamente el doble comparado con el requerido al utilizar
matrices de Householder.
Es muy facil comprobar que para crear un cero en la posicion (p, q) al multiplicarla a
izquierda por una matriz de Givens R
p,q
() basta elegir de modo que
cos =
a
qq
_
a
2
qq
+a
2
pq
, sin =
a
pq
_
a
2
qq
+a
2
pq
.
Notemos que las matrices R
pq
()A y A solo dieren en las las p y q.
El metodo consistira entonces en ir transformado la matriz original (de tama no n) en
una matriz triangular superior del siguiente modo: en primer lugar se hacen ceros en las
posiciones de la primera columna por debajo del elemento de la diagonal multiplicando
por n 1 matrices como (9.2), de modo que
A
1
:= R
1n
(
1n
) . . . R
13
(
13
)R
12
(
12
)
. .
Q
1
A =
_

_
. . .
0 . . .
.
.
.
.
.
.
.
.
.
0 . . .
_

_
.
Obviamente Q
1
es una matriz ortogonal por ser producto de matrices ortogonales. En el
siguiente paso haremos ceros en la segunda columna por debajo de la diagonal y as suce-
sivamente. Fjate que los elementos nulos de las columnas anteriores se preservan en los
sucesivos pasos.
Ejercicio 9.14 Implementa la factorizacion QR utilizando matrices de Givens.
Solucion. Podemos denir la siguiente funcion:
01 % QRGIVENS
02 %
03 % [Q,R]=QRGIVENS(A) Calcula Q ortogonal y R triangular
04 % superior cumpliendo A=QR
05 %
06 % Utiliza el algoritmo basado en matrices de Givens
07 %
08
09
10 function [q,r]=QRGivens(a)
11 n=length(a);
12 q=eye(n);
13
14
15 for j=1:n-1
16 for i=j+1:n
17 if a(i,j)~=0
18 aux=sqrt(a(j,j)^2+a(i,j)^2);
19 c=a(j,j)/aux;
189
B
o
r
r
a
d
o
r
9.5 Metodo QR de Francis LECCI

ON IV
20 s=-a(i,j)/aux;
21 Rot=[c s; -s c];
22 %solo cambian las filas i y j
23 a([i j],:)=Rot*a([i j],:);
24 q([i j],:)=Rot*q([i j],:);
25 end
26 end
27 end
28 q=q;
29 r=a;
30 return

Ejercicio 9.15 Adapta el metodo para trabajar con matrices rectangulares.


Ejercicio 9.16 Compara el tiempo de calculo requerido al utilizar matrices de Householder
y de Givens, con matrices llenas y matrices tridiagonales.
(Ayuda: Recuerda los comandos tic y toc.)
Factorizacion QR con Matlab
En Matlab podemos obtener una factorizacion QR mediante el comando qr. Por ejem-
plo,
>> a=rand(4);
>> [q,r]=qr(a)
q =
-0.3685 0.7147 -0.2407 -0.5436
-0.7715 -0.4099 0.4388 -0.2102
-0.3858 -0.2967 -0.8391 0.2429
-0.3466 0.4829 0.2131 0.7754
r =
-1.2078 -1.0282 -0.7184 -1.1168
0 0.6539 0.5720 0.3849
0 0 -0.6839 -0.4834
0 0 0 -0.0530
La matriz a no tiene por que ser cuadrada:
>> a=rand(3,2);
>> [q2,r2]=qr(a)
190
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


q2 =
-0.6815 0.6346 -0.3644
-0.6680 -0.7428 -0.0444
-0.2989 0.2132 0.9302
r2 =
-1.3726 -0.7532
0 0.5993
0 0
Comentarios sobre la descomposicion QR
Si A es mn, y Q, R es la descomposicion dada por Householder o Givens
11
, tomando
(con notacion de Matlab)
Q
1
= Q(:, 1 : m), R
1
= R(1 : m, :),
entonces R
1
es cuadrada, Q
1
tiene las columnas ortonormales y A = Q
1
R
1
.
La factorizacion QR se puede utilizar para resolver sistemas lineales compatibles inde-
terminados mediante la aproximacion por mnimos cuadrados. Especcamente, se trata
de asignar como solucion de Ax = b la dada por
A

Ax = A

b.
Este sistema de ecuaciones recibe el nombre de ecuaciones normales. Se prueba en-
tonces que, bajo la hipotesis de que las columnas de A sean linealmente independientes,
la solucion anterior cumple
|b Ax|
2
< |b Az|
2
, z R
n
.
Esto es, minimiza el residuo. En la practica no se construyen las ecuaciones normales,
sino que utilizando la descomposicion QR, el problema se reduce a
R

1
Q

1
Q
1
. .
I
R
1
x = R

1
Q

1
b, R

1
R
1
x = R

1
Q

1
b, R
1
x = Q

1
b.
Recuerda que R
1
es triangular y que por tanto, la resolucion del ultimo sistema es trivial.
En particular este metodo puede aplicarse a un sistema compatible determinado y
resolver as sistemas de ecuaciones lineales. El metodo resultante es mas caro que el
metodo de Gauss, ya que realiza el doble n umero de operaciones, pero tiene una ventaja
muy importante: es estable numericamente y no hace falta realizar ninguna estrategia de
pivotaje
12
.
11
Ya hemos indicado en los Ejercicios 9.12 y 9.15 que estos metodos pueden aplicarse a matrices
rectangulares generales.
12
La razon de esta estabilidad se puede vislumbrar intuitivamente: como Q es ortogonal, todas las
entradas estan entre 0 y 1.
191
B
o
r
r
a
d
o
r
9.5 Metodo QR de Francis LECCI

ON IV
Otra aplicacion de la factorizacion QR es el calculo del rango de una matriz. Concre-
tamente, el rango de A coincide con el n umero de las de R distintas de cero. Asumiendo
que estamos trabajando con un rango numerico, examinaremos cuantas las son clara-
mente distintas de cero. Esto merece un comentario: casi cualquier perturbacion de una
matriz que no tenga rango maximo da una matriz que si lo tiene. Por esto, numerica-
mente, las matrices tienen (casi) siempre rango maximo. Sin embargo, el hecho de estar
muy cerca de una matriz que no tenga rango maximo tiene consecuencia perniciosas en
muchas aplicaciones numericas.
Ejercicio 9.17 Implementa la resolucion de sistemas lineales por mnimos cuadrados.
Ejercicio 9.18 Introduce la siguiente matriz en Matlab
A =
_
11 13
22 26
_
Calcula el determinante en Matlab y deduce cual es su rango. Calcula la descomposicion QR.
Que rango le asignaras a A?.
9.5.2. Metodo QR de Francis
Retomamos el metodo QR de Francis para matrices simetricas. El algoritmo es sim-
plemente el siguiente:
Metodo QR de Francis
A = A
1
matriz inicial
for k=1:mmax
Descomponer A
k
= Q
k
R
k
Calcular A
k+1
:= R
k
Q
k
D
k+1
=diag(A
k+1
)
if (
n1

j=1
n

i=j+1
[a
(k+1)
ij
[
2
< eps
n

i=1
[a
(k+1)
ii
[
2
)
return
end
end
El algoritmo naliza cuando el tama no de los elementos por debajo de la diagonal
principal es peque no respecto de los elementos diagonales, es decir, cuando consideramos
que la matriz es practicamente triangular.
Para matrices simetricas, que es el caso que de momento nos ocupa, el metodo converge
salvo en situaciones algo extra nas a una matriz diagonal con los valores propios. Un hecho
sorprendente es que ademas los valores propios aparecen ordenados en la diagonal de
mayor a menor modulo.
192
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


Ejercicio 9.19 Que modicacion haras del algoritmo anterior para que tambien devolviera
los vectores propios?.
Ejercicio 9.20 Implementa el algoritmo QR de Francis utilizando cualquiera de las descom-
posiciones QR vistas.
Ayuda: Que calculamos mediante las ordenes tril(a,-1) y norm(a,fro)?
Si A no es simetrica pero es diagonalizable, el metodo converge, tambien bajo condi-
ciones muy generales a una matriz quasitriangular, es decir, a una matriz de la forma
T =
_

_
D
1
. . . . . . . . . . . .
D
2
. . . . . . . .
.
.
.
.
.
.
D
m
_

_
, donde D
j
es 1 1 o 2 2.
Los valores propios de A son exactamente los valores propios de estos bloques 2 2.
De hecho cada par de valores propios complejos conjugados genera un bloque D
j
de
orden 2. En particular, si la matriz tiene unicamente valores propios reales, la matriz T
es triangular. Si trabajamos con aritmetica compleja entonces la matriz T es triangular
superior.

Este es el conocido Teorema de Schur.
Ejercicio 9.21 Adapta el metodo QR a matrices no simetricas. Observa que deberas cambiar
el criterio de parada.
Ejercicio 9.22 Aplica el metodo QR a distintas matrices (simetricas, no simetricas, con
todos los valores propios reales o con alguno complejo) para observar como es la matriz lmite
resultante en cada caso.
Nota. La descomposicion de Schur, tanto real como compleja, se puede calcular en
Matlab con schur.
9.5.3. Comentarios adicionales
Tecnicas de aceleracion
Una matriz es de Hessenberg si tiene la forma
H =
_

_
. . . . . .

.
.
.
0
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
0 . . . 0
_

_
,
es decir, si todos los elementos por debajo de la subdiagonal principal son nulos.
Toda matriz se puede llevar a forma de Hessemberg mediante producto a izquierda y
derecha por matrices ortogonales. Si ademas la matriz original es simetrica, la matriz de
Hessenberg correspondiente es de hecho tridiagonal simetrica.
193
B
o
r
r
a
d
o
r
9.5 Metodo QR de Francis LECCI

ON IV
Trabajar sobre una matriz de Hessemberg tiene importantes ventajas. En primer lugar,
la factorizacion QR es mucho mas economica: si utilizamos matrices de Givens unicamente
debemos preocuparnos de cancelar los elementos situados en la subdiagonal inferior. Es
mas, si H es Hessemberg (respectivamente tridiagonal simetrica), y H = QR, entonces la
matriz RQ es de nuevo de Hessemberg (respectivamente tridiagonal simetrica). En el caso
de matrices tridiagonales hay claramente una reduccion en las necesidades de memoria
del metodo pues solo requerimos guardar tres diagonales de la matriz durante todo el
proceso.
El metodo QR no se programa en la practica tal como lo hemos presentado. Se recurre
a dos tipos de estrategias que aceleran enormemente la velocidad de convergencia. La
primera es la traslacion. Utilizando la notacion de la Seccion 9.5.2, se tratara de en
lugar de factorizar la matriz A
m
, descomponer
A
m

m
I = Q
m
R
m
,
para posteriormente denir
A
m+1
:=
m
I +R
m
Q
m
.
Es trivial comprobar que A
m
y A
m+1
son semejantes, por lo que tendran los mismos
valores propios. Una eleccion adecuada de
m
consigue acelerar la convergencia en zonas
determinadas de la matriz. Por ejemplo, si A simetrica se puede conseguir que en pocas
iteraciones
A
m

_

_
B
n1
0
0
n
_

_
.
En este caso,
n
es un valor propio, se guarda en memoria y se empieza a trabajar con B
n1
que es de orden n 1. Este tipo de tecnica se denomina deaccion. Existen algoritmos
que permiten seguir la pista a los vectores propios, relacionando los vectores propios de
A
m
con los de B
n1
.
Apendice: reduccion a la forma de Hessenberg
Disponemos ya de las herramientas necesarias para implementar la reduccion a forma
de Hessenberg de una matriz. Para ello, consideremos la siguiente particion de A
A =
_
_
b

c A
1
_
_
,
donde b y c son vectores columna de n 1 componentes y A
1
es (n 1) (n 1).
Tomemos H
1
una matriz de Householder n1 n1, que especicaremos mas adelante,
y construyamos
H :=
_
_
1 0
0 H
1
_
_
.
194
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


Entonces
HAH =
_
_
b

H
1
H
1
c H
1
A
1
H
1
_
_
.
Si H
1
se toma ahora de forma que H
1
c = e
1
, se consigue cancelar todos los elementos
de la primera columna situados por debajo de la subdiagonal inferior. Es mas, si A es
simetrica, b = c y por tanto en la primera la de HAH solo los dos primeros elementos
son no nulos.
A continuacion se procede a trabajar con la matriz H
1
A
1
H
1
de forma similar a como
se hizo en la Seccion 9.5.1.
Nota. En Matlab la funcion hess reduce una matriz a forma de Hessenberg. Puede
utilizarse de las siguientes maneras:
>>H=hess(A); %H es una matriz de Hessenberg semejante a A
>>[P,H] = hess(A); %Ademas P ortogonal tal que A = P*H*P

9.6. Valores y vectores propios en Matlab


Para determinar todos los valores y vectores propios de una matriz podemos utilizar
el comando eig. Esta funcion es de hecho una compilacion de funciones que se aplican
dependiendo de la forma de la matriz. Este comando tambien sirve para resolver el prob-
lema de valores propios generalizados: dadas dos matrices cuadradas A y B encontrar
escalares y vectores v ,= 0 tales que
Av = Bv.
En ocasiones requerimos unos pocos valores propios. El comando eigs, proporciona
los valores propios mas relevantes, siendo el propio usuario el que especique si estos son
los mayores o menores en valor absoluto, los de mayor o menor parte real,etc. La ayuda
de Matlab es bastante extensa y desde aqu animamos a su consulta. Como detalle curioso
este comando se puede llamar de forma que uno de los argumentos sea una funcion que
devuelva el producto por la matriz. Es decir, solo necesita saber multiplicar por la matriz
y por tanto no es necesario disponer de ella
13
. El uso de este comando es indispensable
en matrices sparse no simetricas dado que, a un reduciendola a forma de Hessenberg, las
necesidades de memoria son gigantescas
14
. Para este tipo de problemas se utilizan otros
tipos de metodos no relacionados con QR.
Asociado al calculo de valores propios, se encuentra el calculo de los valores singulares,
esto es, buscar P y Q ortogonales de forma que
P

AQ = D,
13
Puede resultar extra no, pero en muchas aplicaciones practicas es mas facil hallar el producto de un
vector por la matriz que construirla explcitamente.
14
La descomposicion QR destroza la estructura sparse de una matriz.
195
B
o
r
r
a
d
o
r
9.7 Notas historicas LECCI

ON IV
donde D es una matriz diagonal con elementos no negativos. Las entradas de D son los
valores singulares, mientras que las columnas de P y Q contienen los vectores singulares
asociados. Esta descomposicion existe a un cuando A es rectangular. El comando que cal-
cula esta descomposicion en Matlab es svd. El algoritmo mas utilizado para este problema
es una variante del metodo QR conocido como Algoritmo de Golub-Kaham.
9.7. Notas historicas
15
El problema del calculo numerico de los valores propios de una matriz puede remon-
tarse a los trabajos de Carl Jacobi quien utilizo el metodo del mismo nombre en 1846.
No existe un origen claro del metodo de potencias, sino que parece haber surgido
de forma simultanea en diversos ambientes. El metodo de la potencia desplazada fue
introducido por Helmut Wielandt en 1944, quien sugirio tambien algunas tecnicas de
deaccion para, combinadas con el metodo de potencias, obtener varios valores propios
de la matriz.
En 1958, Heinz Rutishause propuso un precursor del metodo QR, el metodo LU. El
metodo descompona la matriz en la forma LU, para posteriormente construir UL. Se
trataba de aplicar de forma simultanea el metodo de potencias y para evitar que to-
das las direcciones degeneran hacia la direccion dominante, se haca una descomposicion
LU que aseguraba la independencia de los vectores. Desgraciadamente, el metodo era
inestable numericamente salvo para algunos casos particulares. J. G. F. Francis y V. N.
Kublanovskaya propusieron independientemente en 1961 reemplazar la descomposicion
LU por la QR dando origen al metodo que hemos visto. El trabajo de Francis era mas
completo y sugera ya de hecho la reduccion a forma de Hessenberg, la deacion y estrate-
gias de desplazamiento.
El calculo estable de la descomposicion QR tuvo que esperar a los a nos 1950, cuando
Wallace Givens y Alstom S. Householder propusieron sus metodos en 1954 y 1958 re-
spectivamente. Householder tambien en 1958 y Wilkinson en 1960 estudiaron los aspectos
numericos de la reduccion de una matriz a su forma de Hessenberg.
9.8. Google
16
Google
17
ha pasado a ser en su corta vida uno de los referentes mundiales de Internet.
Su sistema de b usqueda de paginas en la red ofrece en general unos resultados bastante
precisos. Una de las claves de su sistema es su metodo de evaluacion de las paginas,
denominado Pagerank
tm
. Este sistema eval ua las paginas web seg un el n umero de enlaces
que permiten llegar a ella.
15
Las fuentes de esta seccion se han obtenido principalmente del artculo Eigenvalue computation in
the 20th Century (Gene H. Golub y Henk A. van der Vorst, publicado en Journal of Computational and
Applied Mathematics 123 y Matrix Algorithms Volume II: Eigensystems, de G.W. Stewart.
16
Este captulo se ha extrado esencialmente del libro Numerical Computing de Cleve Moler, disponible
en http://www.mathworks.com/moler/
17
Por si alg un despistado todava no conoce su direccion electronica, vistese http://www.google.es,
http://www.google.com y muchos mas...
196
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


Figura 9.2: Una web muy sencilla.
Concretamente, la cuestion sobre la que se basa este sistema de evaluacion es la que
sigue:
Si una persona navega de forma continuada durante un largo periodo de tiempo,
c ual es la probabilidad de que llegue a una pagina web determinada?
Esta probabilidad es la que se utiliza para evaluar las paginas. A priori hay dos formas
de llegar a una pagina:
i) a traves de un enlace desde otra pagina (probabilidad p),
ii) directamente (probabilidad (1 p)).
Un valor habitual es p = 0.85.
En la gura 9.2 vemos un (muy) simple ejemplo de una web representada como un
grafo dirigido. Una echa de i a j indica que la pagina i tiene un enlace (un link) a la
pagina j.
En este ejemplo n = 6 es el n umero de paginas que cuenta con 9 enlaces. Este grafo
se puede representar matematicamente mediante la matriz 6 6
G = (g
ij
) =
_

_
0 0 1 0 0 0
1 0 0 1 1 0
0 1 0 0 0 0
0 0 1 0 0 0
0 0 0 1 0 1
0 0 0 1 0 0
_

_
donde
g
ij
= 1, si llegamos a i desde j.
De forma natural G es sparse, puesto que con n paginas uno puede esperar que el n umero
de enlaces sea del orden de O(n) (esto es, proporcional al n umero de paginas) y no del
orden O(n
2
) que se correspondera con una matriz llena.
Sea
c
j
=
n

i=1
g
ij
(n umero de enlaces que salen de j).
197
B
o
r
r
a
d
o
r
9.8 Google LECCI

ON IV
Entonces la probabilidad de llegar a i si estamos en j es
p
g
ij
c
j
..
Siguiendo un enlace desde j
+
1 p
n
. .
Tecleando la direccion
Esta informacion se puede recoger en la matriz A de tama no n n cuyas componentes
vienen dadas por
a
ij
= p
g
ij
c
j
+
1 p
n
.
Esta matriz no es sparse, pero se puede escribir
p

G +
1 p
n
e
n
e

n
donde g
ij
= g
ij
/c
j
y e
n
es la matriz columna 1 n
e
n
=
_
1 1 1

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

Gx +
1 p
n
e
n
e

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

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

_
x
(1)
1
x
(1)
2

x
(1)
n
_

_
=
_

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

_
_

_
x
(0)
1
x
(0)
2

x
(0)
n
_

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

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


relacion
x
m+1
= Ax
m
.
La idea es hacer evolucionar el sistema hasta que se estabilice.
198
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


Proposicion 9.5 Existe un unico x de componentes no negativas tal que
x = Ax, x

e
n
=
n

i=1
x
i
= 1.
Ademas, comenzando con x
0
cuyas componentes sean positivas y sumen uno,
x = lm
m
x
m
.
El resultado dice, en palabras llanas, que la probabilidad de que estemos en una pagina
web (esto es, x), despues de navegar una cantidad suciente de tiempo
18
es independiente
de como hemos empezado (es decir, de x
0
). Matematicamente hablando, dice que existe
un unico vector propio asociado al valor propio 1 de componentes positivas con |x|
1
= 1
y que ademas la sucesion x
m
converge a x independientemente del vector inicial escogido.
Observa que la sucesion de vectores x
m
son el resultado de aplicar el metodo de potencias
a la matriz A (sin normalizar respecto de | |
2
) y que por su forma particular
19
siempre
que se parta de un vector inicial cumpliendo los requisitos de la proposicion tendremos
que x
m
0 y |x
m
|
1
= 1.
Aqu vemos una forma completamente directa de programar este calculo
01 % PAGERANK(G)
02 %
03 % PAGERANK(G) Calcula el indice de impacto de una WEB dada
04 % por el grafo G
05 % El grafo tiene que ser conexo, es decir, no puede haber nodos
06 % separados del resto
07
08 function y=pagerank(g)
09
10 p=0.85; % probabilidad de llegar a traves de un enlace
11 eps=0.0001; % criterio de parada
12 nmax=1000; % numero maximo de iteraciones
13 n=length(g);
14 x=1/n*ones(n,1); % vector inicial
15 for j=1:nmax
16 y=producto(g,x,p);
17 if norm(x-y)<eps
18 disp(convergencia)
19 return
20 end
21 x=y;
22 x=x/sum(x);
23 end
18
Ciertamente, podramos tener que dedicar muchas horas...
19
La matriz A cumple que todas sus entradas son positivas y que la suma de los elementos de cada la
es 1. Una matriz de esta forma se denomina matriz de Markov. Teoricamente se sabe que el valor propio
dominante de estas matrices es siempre 1.
199
B
o
r
r
a
d
o
r
9.8 Google LECCI

ON IV
24 disp(Convergencia no alcanzada)
25 return
26
27 % Y= PRODUCTO(G,X,P)
28 % calcula el producto a*x
29 % notese que la matriz no llega a construirse
30
31 function y=producto(g,x,p)
32 c=sum(g);
33 c=c(:);
34 x=x(:);
35 n=length(x);
36 en=ones(n,1);
37 y=p*g*(x./c)+(1-p)/n*en*(en*x);
38 return
Nota. Aplicando la funcion pagerank al ejemplo de la Figura 9.2, obtenemos este re-
sultado
x = [0.1370 0.2806 0.2636 0.1370 0.1181 0.0638]

Por orden de preferencia nos encontramos los nodos


2, 3, 1 y 4, 5, 6.
A pesar de que el nodo 3 solo se enlaza a traves del 2, la importancia de este nodo inuye
en su buena puntuacion.
En problemas reales, las matrices son enormes, en Febrero de 2006 google haba cat-
alogado 9.680.000.000 paginas
20
. Despues de la evaluacion hay que hacer un ltrado de
acuerdo a las palabras clave con las que se hace la b usqueda.
Es posible hacer subir la evaluacion de una pagina mediante la creacion de paginas web
que se enlacen entre ellas y especialmente sobre una. Este tipo de tecnicas, denominada
google bombing ha sido utilizado reiteradas veces por objetivos de diversa naturaleza,
economicos, polticos, de protesta.... Los algoritmos del buscador tratan de detectar este
tipo de trampas y reconstruir la evaluacion para que sea mas imparcial.
Nota historica
Google fue fundado en 1995 por Sergey Brin y y Larry Page, el primero ingeniero
electrico y el segundo licenciado en matematicas y que contaban entonces con 23 y 24
a nos. El nombre proviene del n umero 10
100
que, aunque no ocialmente, se llama Googol
21
El ambiente desenfadado y el origen matematico del buscador tuvo un curioso reejo
en la primera oferta p ublica de acciones que tuvo lugar a principios del 2004. Brin y Page
sacaron al mercado una participacion de la compa na cuyo valor era 2.718.281.828$, el
n umero e con 10 cifras decimales
22
.
20
Basta hacer la b usqueda de una palabra inexistente precedida de un - para obtener el n umero de
paginas catalogadas.
21
As lo denomino el matematico Edward Kasner. En ingles existe la palabra goggles que son unas gafas
de natacion (?).
22
Muy pocos se dieron cuenta de este gui no. Se hizo de nuevo palpable la escasa cultura cientca
200
B
o
r
r
a
d
o
r
LECCI

ON IV Cap

tulo 9. Calculo numerico de valores y vectores propios.


en general y matematica en particular del mundo periodstico.
201
B
o
r
r
a
d
o
r
9.8 Google LECCI

ON IV
202
B
o
r
r
a
d
o
r
Leccion V
Salidas gracas en Matlab. Interpolacion
203
B
o
r
r
a
d
o
r
B
o
r
r
a
d
o
r
Introduccion
...but it had no pictures or conversations in it,
and what is the use of a book, thought Alice
without pictures or conversation?
Lewis Carroll, Alice in Wonderland
Trataremos en este proyecto uno de los aspectos mas potentes de Matlab: las salidas
gracas. Ciertamente exponer con cierto detalle todo lo relacionado con este campo es
una tarea ardua y extensa. Sin embargo, y este es nuestro objetivo, s es asumible alcanzar
un conocimiento base de forma que sea el usuario quien, con la ayuda de Matlab o con
manuales especcos, profundice en los aspectos puntuales que necesite.
En la segunda parte estudiaremos el problema de la interpolacion polinomica como
una buena piedra de toque para testar las salidas gracas. Como aspectos relacionados
hablaremos someramente de la interpolacion por splines y las curvas Bezier, que nos
ofrecen un ejemplo muy sencillo de las Matematicas aplicadas al dise no graco.
205
B
o
r
r
a
d
o
r
B
o
r
r
a
d
o
r
Captulo 10
Matlab: Salidas gracas en Matlab
10.1. Dibujos bidimensionales
10.1.1. El comando plot
Ya hemos observado que los comandos de Matlab cuentan con varios niveles de manip-
ulacion. Los niveles iniciales son basicos y por tanto faciles de utilizar. El acceso a niveles
nos exige trabajar con argumentos nuevos, mas instrucciones y el manejo de una sintaxis
mas complicada.
Esta caracterstica se destaca mas, si cabe, en los comandos relacionados con las salidas
gracas. Es por ello que, empezando por la instruccion plot, recorreremos los diferentes
niveles de forma gradual. No trataremos el nivel superior, que conlleva un control absoluto
del dibujo, dado que requerira una exposicion demasiada larga. Lo que aqu expondremos
es suciente en un 99 % de los casos, y en ultima medida, se puede acceder a todos los
aspectos de un dibujo desde la ventana graca a golpe de raton.
Primer nivel
El primer comando que trataremos es plot. Es una instruccion muy versatil y la mas
indicada para dibujar gracas de funciones y curvas en el plano. Su sintaxis basica es
>> plot(x,y)
que dibuja el vector y versus el vector x. Mas en concreto une los puntos (x(i), y(i))
mediante segmentos. Tomando un n umero sucientemente elevado de puntos trazamos
con ello una graca suave, sin esquinas visibles.
Al ejecutar este comando se abre una ventana, gure en el vocabulario de Matlab,
donde se traza la correspondiente gura.
Si y es real, plot(y) toma x=1:n donde n es la longitud de y. Si, por otro lado, y es
un vector de n umeros complejos, dibuja la parte imaginaria versus la parte real. Es decir,
es equivalente a plot(real(y),imag(y)).
Ejercicio 10.1 Que hacen las siguientes lneas de codigo?
>> clear i
>> t=linspace(0,2*pi,9);
>> plot(exp(i*t));
207
B
o
r
r
a
d
o
r
10.1 Dibujos bidimensionales LECCI

ON V
Figura 10.1: Ventana graca.
Te parece natural? Que observas con la escala? Que sucede si se ejecuta axis equal?.
Como dibujaras una circunferencia?.
Segundo nivel
El comando ademas acepta una serie de argumentos que, entre otras cosas, permiten
controlar el color, el tipo de marcas sobre los puntos (x(i), y(i)) y el formato de las
lneas que los unen. As, en su aspecto mas general,
plot(x,y,S)
dibuja y versus x, con S una cadena de caracteres que se construye con
1
b azul . punto - linea solida
g verde o circulo : punteado
r rojo x equis -. punto-linea
c cian + cruz -- linea-linea
m magenta * estrella
y amarillo s cuadrado
k negro d diamante
v triangulo (hacia abajo)
^ triangulo (arriba)
1
Traducido directamente de la ayuda de Matlab.
208
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


< triangulo (izquierda)
> triangulo (derecha)
p estrella pentagonal
h estrella hexagonal
La primera columna especica el color utilizado, la segunda la marca sobre cada punto y
la tercera el patron que siguen las lneas utilizadas para unir los puntos.
Por ejemplo el siguiente chero script
x=linspace(0,4,100);
y=exp(-x).*cos(2*pi*x);
figure(1); plot(x,y,.)
figure(2); plot(x,y,r-.)
figure(3); plot(x,y,sm--)
figure(4); plot(x,y,hg)
figure(5); plot(x,y,kv:)
genera (tras el reordenamiento manual de las ventanas) la pantalla mostrada en la Figura
10.2.
El comando figure abre una ventana graca asignandole un n umero. Si la ventana
ya esta abierta, la coloca como la ventana de salida por defecto. En particular, figure
permite manejarse con varias ventanas de forma simultanea.
Para superponer varios dibujos sobre una misma ventana podemos
Utilizar plot de la siguiente forma
2
>> plot(x1,y1,x2,y2,x3,y3,x4,y4)
mediante el cual dibujaremos y1 vs. x1, y2 vs. x2, etc., o si queremos dar un formato
personalizado a cada dibujo podemos usar
>> plot(x1,y1,r-,x2,y2,b:,x3,y3,m-.,x4,y4,k--)
Utilizar la instruccion hold on que activa la superposicion en pantalla. Por ejemplo,
>> hold on %activamos superposicion
>> plot(x1,y1,r-)
>> plot(x2,y2,r:)
>> plot(x3,y3,m.-)
>> plot(x4,y4,k--)
Esta opcion es mas versatil dado que permite superponer gracas construidas con
diferentes comandos. La superposicion se desconecta con hold off, de forma que
un nuevo dibujo borrara los anteriores.
2
Se asignan distintos colores a cada una de las gracas de forma automatica.
209
B
o
r
r
a
d
o
r
10.1 Dibujos bidimensionales LECCI

ON V
Figura 10.2: Ventana graca.
Tercer nivel
Ya en un tercer nivel, se pueden acceder a detalles concretos del dibujo, como el tama no
y color de las marcas, la anchura de la lnea, etc. Las diferentes opciones llevan nombres
nemotecnicos que facilitan su memorizacion
3
. Destacamos entre las mas importantes
color: color de la lnea.
LineWidth: anchura de la lnea.
Marker: selecciona la marca que se coloca en los puntos evaluados
MarkerEdgeColor: color del borde de las marcas
MarkerFaceColor: color de la marca
MarkerSize: tama no de la marca
Para especicar un color, se puede utilizar uno de estos caracteres b, g, r, c, m, y, k o
bien un vector con tres componentes con valores entre 0 y 1 que especica un color seg un
3
nemotecnicos en ingles, of course.
210
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


el estandar RGB
4
.
Por ejemplo
>>x=0.01:0.2:2; y=sin(x)./x;
>>plot(x,y,o-.,color,[0.2 0.4 0.6],linewidth,2,...
markeredgecolor,k,markerfacecolor,[0.9 0.6 0.4],...
markersize,9)
Ejercicio 10.2 Dibuja las funciones seno y coseno en [2, 2], la primera en rojo y la
segunda en azul. El ancho de lnea debe ser de dos puntos y deben seguir dos estilos diferentes,
a tu eleccion.
Puedes empaquetar las instrucciones en un chero script. Sera mas comodo para editar y
cambiar lo que desees.
La ventana graca
Las propiedades anteriores se pueden editar directamente en la ventana graca. Para
ello, hay que seleccionar edit plot (vease la Figura 10.3) y pulsar sobre la graca con
un doble click. Se desplegara una ventana adicional con varias pesta nas que informan y
permiten modicar las diferentes caractersticas del objeto. Si se procede igual sobre el
fondo de la pantalla controlaremos mas aspectos del propio entorno, como la escala, el ratio
entre el eje OX y OY, las marcas sobre los ejes..., aspectos que trataremos seguidamente.
No entraremos a explicar estos detalles en profundidad.

Este es un buen ejemplo
donde la prueba, la experimentacion y el ensayoerror permiten aprender mejor y mas
rapidamente que cualquier manual que podamos redactar.
La ventaja principal de trabajar a traves de comandos es que podemos dotar de un as-
pecto determinado a nuestros dibujos sin necesidad de retocarlos en cada paso y para cada
ejemplo. Esto es especialmente importante si necesitamos un n umero elevado de gracas
o bien necesitamos rehacerlas constantemente. En contrapartida deberemos manejar una
mayor galera de instrucciones.
Ejercicio 10.3 Ejecuta
>> t=linspace(-2*pi, 2*pi,200);
>> y1=cos(t);
>> y2=sin(t);
>> plot(t,y1,t,y2)
Desde la ventana graca modica su aspecto para que tenga el que le habas dado en el
Ejercicio 10.2.
4
Red, Green, Blue. Crea un color a nadiendo partes de rojo, verde y azul (de 0 a 1) especicado por
un vector de tres componentes.
211
B
o
r
r
a
d
o
r
10.1 Dibujos bidimensionales LECCI

ON V
Figura 10.3: Edicion de un dibujo.
212
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


10.1.2. Comandos asociados a plot
Hay una serie de comandos que controlan el entorno donde se despliega la graca.
Entre los mas elementales (o al menos, mas faciles de utilizar), podemos destacar:
clf: borra la ventana actual (gure) de gracos.
cla: borra el axes actual. El axes es la parte de la ventana utilizada para
dibujar. Una ventana puede contener varios axes (vease el comando
subplot tratado mas adelante).
hold: hold on permite que sucesivas gracas se vayan solapando; hold off
desconecta esta opcion (es la que esta por defecto).
axis: un comando algo complejo. Puede controlar entre otros detalles el ratio
entre los ejes OX y OY, la parte del dibujo que se muestra por pantalla,
las coordenadas utilizadas, el ajuste del marco al dibujo...
xlim, ylim: especican los lmites del dibujo. Se puedn utilizar para centrar el
dibujo.
grid: grid on muestra una malla en pantalla; grid off la desconecta.
legend: despliega una leyenda, esto es, un cuadro explicativo sobre las gracas
presentes.
text: a nade un texto en las coordenadas especicadas.
xlabel, ylabel: a nade ttulos (etiquetas) a los ejes OX y OY.
title: coloca un ttulo en la cabecera del dibujo.
whitebg: asigna un color al fondo del dibujo.
A modo de ejemplo, el siguiente conjunto de instrucciones (empaquetado en un chero
script) despliega las gracas mostradas en la Figura 10.4
figure(1) % desplegamos ventana 1
clf % borramos todo
x=linspace(0,5,100);
f=inline(exp(-n*x).*cos(x),n,x); % funciones vectorizadas
hold on % solapamiento de graficas
y=f(1/3,x);
plot(x,y,k--,linewidth,2)
y=f(1,x);
plot(x,y,r-.,linewidth,2)
y=f(3,x);
plot(x,y,:,color,[0.0,0.0,0.5],linewidth,2)
y=f(9,x);
213
B
o
r
r
a
d
o
r
10.1 Dibujos bidimensionales LECCI

ON V
plot(x,y,-,color,[0.0,0.3,0.0],linewidth,2)
grid on % desplegamos la red
xlim([-0.5,6]), ylim([-0.25,0.5]) % rango de los graficos
xlabel(Eje OX,fontname, Comic Sans Ms, fontsize,12)
ylabel(Eje OY,fontname, Comic Sans Ms, fontsize,12)
title(Algunas graficas de funciones,...
fontsize,16,fontname,Times new roman)
legend(exp(-x/3).*cos(x), exp(-x).*cos(x),...
exp(-3x)*cos(x), exp(-9x).*cos(x));
0 1 2 3 4 5 6
-0.2
-0.1
0
0.1
0.2
0.3
0.4
0.5
Eje OX
E
j
e

O
Y
Algunas graficas de funciones
exp(-x/3).*cos(x/3)
exp(-x).*cos(x)
exp(-3x)*cos(3x)
exp(-9x).*cos(9x)
Figura 10.4: Una muestra de dibujos.
Nota. En el comando title hemos utilizado los atributos fontname y fontsize para
especicar la fuente y su tama no utilizada en el ttulo. Otros atributos son
fontweight: los valores posibles son light, normal, demi, bold. Especica el trazo
de los caracteres, desde no (light) hasta negrita (bold).
fontangle: sus valores son normal, italic u oblique. Fija la inclinacion de la fuente.
rotate: especica el angulo con el que se escribe el texto. El valor por defecto, 0, es
la escritura horizontal, mientras que con 90 se escribe el texto en vertical.
214
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


Estos atributos estan disponibles para cualquier comando que se ocupe de desplegar
textos en la pantalla graca. Por ejemplo, xlabel, ylabel, title,...
Quizas lo mas difcil sea saber que fuentes tenemos instaladas y su correspondiente
nombre. La solucion mas sencilla a esta cuestion es ir a la venta graca, y editar las
caractersticas del dibujo
5
. All podremos ver que fuentes estan a nuestra disposicion y su
nombre correspondiente.
Ejercicio 10.4 En este ejercicio trataremos de visualizar el efecto del comando axis con
diferentes opciones sobre el aspecto nal de un dibujo.
Teclea
>> clf
>> x = 0:.025:pi/2; plot(x,tan(x),-ro)
La funcion tangente presenta una asntota vertical
6
en /2. Teclea los siguientes comandos y
observa el aspecto nal de la gura.
>> axis equal
>> axis image
>> axis normal % vuelta al formato original
>> axis([0 pi/2 0 5]) % especificamos el rango de salida
>> axis tight
Podras decir que hace cada comando?.
10.1.3. Comandos get y set
Los comandos get y set permiten acceder y cambiar los atributos de cualquier graca.
Todo objeto graco, desde una simple curva hasta la propia ventana donde se despliega
el dibujo tiene asociado un puntero, un handle al que se encuentra enlazado. Los valores
de cada uno de los parametros se pueden visualizar (get) y editar (set) desde la lnea de
comandos o desde una funcion.
Nos limitaremos de momento a dar unas ideas a grandes trazos para el comando plot.
Ejecuta
>> x=0:0.01:pi;
>> h=plot(x,x.*cos(4*x));
La variable h es un puntero que enlaza con el dibujo desplegado sobre la ventana. Ahora
se puede recabar informacion sobre este:
>> get(h,linestyle)
ans =
-
5
Seleccionar editar dibujo, doble click sobre el fondo, seleccionar la pesta na style e ir al men u desple-
gable font name
6
Tiende a innito.
215
B
o
r
r
a
d
o
r
10.1 Dibujos bidimensionales LECCI

ON V
>> get(h,marker)
ans =
none
>> get(h,linewidth)
ans =
0.5000
Las ordenes anteriores nos informan de que el dibujo se ha trazado con lnea continua, sin
ninguna marca y con anchura de lnea 0.5.
Con set podemos cambiar cualquiera de estos atributos
>> set(h,linewidth,2)
>> set(h,color,[0.5 0.6 0.2])
>> set(h,linestyle,-.)
de forma que la graca pasa a tener una anchura de 2 puntos, cambia el color y el estilo
ahora es punto-raya.
Si se ejecuta get(h) podemos visualizar todos los atributos del objeto graco:
>> get(h)
Color = [0.5 0.6 0.2]
EraseMode = normal
LineStyle = -.
LineWidth = [2]
Marker = none
MarkerSize = [6]
MarkerEdgeColor = auto
MarkerFaceColor = none
XData = [ (1 by 315) double array]
YData = [ (1 by 315) double array]
ZData = []
BeingDeleted = off
ButtonDownFcn =
Children = []
Clipping = on
CreateFcn =
DeleteFcn =
BusyAction = queue
HandleVisibility = on
HitTest = on
Interruptible = on
216
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


Parent = [101.001]
Selected = off
SelectionHighlight = on
Tag =
Type = line
UIContextMenu = []
UserData = []
Visible = on
De forma similar
h= legend(x*cos(x));
devuelve en h, despues de desplegar la leyenda correspondiente en el dibujo, una variable
que permite a continuacion la manipulacion de muchas de sus propiedades. Para ello se
utiliza la instruccion set
>> set(h,fontsize,11,fontname,arial,fontangle,...
oblique,color,[0.8 0.8 0.8])
cambia alguno de los atributos de la leyenda, como la fuente y su tama no, la inclinacion
y el color de fondo.
Otro ejemplo lo da el siguiente codigo:
01 x=linspace(0,4,1000);
02 y=x.*log(x);
03 figure(1);
04 clf % borramos
05 plot(x,y,--,linewidth,3);
06 h2=gca; % accedemos al handle de la grafica
07 set(h2,xtick,[0 0.25 0.5 1 2 4],fontsize,16,ygrid,...
08 off,xgrid,on,linewidth,2,gridlinestyle,-.)
09 title(x*log(x),fontangle,oblique,fontname,...
10 Comic Sans ms ,fontweight,bold,fontsize,20)
que accede a la estructura de la graca (gca), que esencialmente es el marco donde de-
splegamos los dibujos. Las lneas 07-08 edita los atributos xtick, que se nala los puntos
donde se colocan las marcas en el eje OX, la fuente utilizada en el dibujo, activa la malla
unicamente en la direccion OX, especica la anchura de la lnes y el patron que sigue. El
resultado se puede ver en la Figura 10.5.
Todas las propiedades anteriores se pueden modicar mas facilmente en la ventana
graca. Su manejo es facil e intuitivo (seleccionar, doble click, boton derecho del raton....).
Con helpwin line y helpwin axes obtenemos la informacion de las diferentes op-
ciones para la instruccion plot (y similares) y para la gura.
Finalmente gca y gcf devuelven el puntero al axis y gure utilizado en ese momento
(get current axis y get current gure). Si quieres ver todos sus atributos, ejecuta
>> get(gca), get(gcf)
217
B
o
r
r
a
d
o
r
10.1 Dibujos bidimensionales LECCI

ON V
0 0.25 0.5 1 2 4
-1
0
1
2
3
4
5
6
x log(x)
Figura 10.5: Modicacion del entorno del dibujo.
Un ejemplo de caractersticas mas avanzadas
Es posible asignar a un objeto graco funciones que se ejecuten al realizar alguna
accion, como cuando se crean ( util especialmente si se redibuja constantemente) o cuando
se seleccione con el raton.
Por ejemplo con
t=linspace(-6*pi,6*pi,200);
h=plot(t,sin(t)./t);
orden=v=get(h,color); set(h,color,v([3 1 2]));
set(h,ButtonDownFcn,orden)
asignamos al dibujo la siguiente propiedad: cuando se pulse encima de el con el raton, se
ejecutara la instruccion dada en orden:
>> v=get(h,color); set(h,color,v([3 1 2]));
La variable orden es simplemente una cadena de caracteres con esta instruccion. Observa
como se repite precisamente para insertar este caracter y evitar as la confusion con el
smbolo n de cadena de caracteres.
En ultima medida, estas caractersticas enlazan con las interfaces gracas de Mat-
lab (gui), donde los objetos gracos pueden ser men us desplegables, campos de textos,
items,... Matlab dispone de una gua para el desarrollo de interfaces gracos con su tu-
torial correspondiente. Aqu no entraremos en la descripcion y uso de estas interfaces,
pero animamos al lector a consultar la correspondiente ayuda mediante helpwin guide.
Una vez dentro de la ayuda, aconsejamos seleccionar Go to online doc for guide y
all acceder a Creating GUIs.
218
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


10.1.4. El comando subplot
Este comando permite la visualizacion de diferentes subventanas gracas (axes) en
una misma ventana. A modo de ejemplo,
subplot(231)
dene en la gure seis zonas para volcar las salidas gracas dispuestas en 2 3 (dos las,
tres columnas) y accede a la primera de ellas. La numeracion es la desplegada en la gura
10.6.
1 2 3
4 5 6
Figura 10.6: Ejemplo de numeracion con subplot.
Por ejemplo, las instrucciones
x=linspace(0,2*pi,150);
subplot(321)
plot(x,sin(x),linewidth,2);
title(sin(x),fontsize,14)
axis tight
subplot(322)
plot(x,cos(x),linewidth,2);
title(cos(x),fontsize,14)
axis tight
subplot(323)
plot(x,sin(2*x),linewidth,2);
title(sin(2x),fontsize,14)
axis tight
subplot(324)
plot(x,cos(2*x),linewidth,2);
title(cos(2x),fontsize,14)
axis tight
219
B
o
r
r
a
d
o
r
10.1 Dibujos bidimensionales LECCI

ON V
subplot(325)
plot(x,sin(4*x),linewidth,2);
title(sin(4x),fontsize,14)
axis tight
subplot(326)
plot(x,cos(4*x),linewidth,2);
title(cos(4x),fontsize,14)
axis tight
crean la Figura 10.7.
10.1.5. Otras salidas gracas
Se nalaremos a continuacion otros comandos relacionados con dibujos y gracas bidi-
mensionales de manejo similar a plot
plotyy: permite mostrar dos dibujos en la misma graca con dos ejes
OY a la izquierda y a la derecha.
polar: curvas en polares.
semilogx, semilogy: similar a plot pero utilizando, respectivamente, una escala log-
artmica en el eje OX y en el eje OY.
loglog: escala logartmica en ambos ejes.
stem: dibuja puntos uniendolos con una linea vertical al eje OX.
stairs: traza una graca en forma de escalera.
bar, barh, bar3: despliega gracas en forma de barras. Muy apropiada para rep-
resentar datos y estadsticas (estilo excel).
area: muestra los datos en una graca de forma acumulada. El col-
or utilizado se controla mediante el comando colormap, cuyo
funcionamiento veremos mas adelante.
line: une puntos mediante lneas. Es una instruccion de bajo niv-
el cuyo funcionamiento es similar a plot. De hecho, plot se
construye a partir de line.
fill: dibuja polgonos cerrados y colorea su interior.
patch: una instruccion tambien de bajo nivel, construye polgonos, o
caras en tres dimensiones y asigna un color a la cara denida.
Comandos faciles de usar
Matlab tiene implementada una serie de comandos, asociados a la toolbox de calculo
simbolico que vimos en la leccion anterior, que permiten dibujar de forma sencilla gracas
de funciones. No se tiene un control tan completo como con plot pero se compensa con
su facil uso. En el apartado que nos ocupa (gracas bidimensionales) son resaltables
220
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


0 2 4 6
-0.5
0
0.5
sin(x)
0 2 4 6
-0.5
0
0.5
1
cos(x)
0 2 4 6
-0.5
0
0.5
sin(2x)
0 2 4 6
-0.5
0
0.5
1
cos(2x)
0 2 4 6
-0.5
0
0.5
sin(4x)
0 2 4 6
-0.5
0
0.5
1
cos(4x)
Figura 10.7: Disposicion simultanea de gracas con subplot.
ezplot ezpolar
La ayuda de Matlab es, en nuestra opinion, suciente para hacernos con su manejo.
10.2. Gracas en 3D
Comenzaremos con curvas en el espacio para pasar y tratar con mayor profundidad
las supercies en 3D. Hemos decidido incluir en este apartado las instrucciones relativas
a curvas de nivel aunque hablando propiamente son dibujos bidimensionales. Su origen y
su posterior interpretacion nos conducen de nuevo al entorno espacial.
10.2.1. El comando plot3
Este comando sirve, grosso modo, para dibujar curvas en el espacio. Su manejo es muy
similar a plot, por lo que no nos detendremos demasiado en su explicacion.

Esta es su
sintaxis
plot3(x,y,z,opciones)
Las opciones son esencialmente las mismas que aparecan en plot. He aqu un ejemplo
sencillo
221
B
o
r
r
a
d
o
r
10.2 Gracas en 3D LECCI

ON V
clf
t=linspace(0,8*pi,200);
plot3(t.*cos(t),t.*sin(t),t,r-,linewidth,2)
grid on % dibujamos la malla
title(Una curva en espiral...,fontsize,18,fontname,...
Comic Sans MS,color,[0.675 0.000 0.000])
zlim([0,20])
xlabel(eje OX,fontsize,14)
ylabel(eje OY,fontsize,14)
zlabel(eje OZ,fontsize,14)
cuyo resultado se muestra en la Figura 10.8. Los comandos relacionados con los aspectos
-30
-20
-10
0
10
20
30
-30
-20
-10
0
10
20
30
0
5
10
15
20
25
30
eje OX
Una curva en espiral...
eje OY
e
j
e

O
Z
Figura 10.8: Un dibujo en 3D con plot3.
accesorios del dibujo (axes, title, xlabel, grid...) funcionan exactamente igual. Ademas
aparecen algunos nuevos cuya utilidad y manejo no debera causar sorpresa:
zlabel zlim
Para poder manipular, rotar en 3D, el objeto graco basta presionar en la barra de
herramientas en el boton se nalado en la Figura 10.9 y mover el raton sobre el objeto con
el boton pulsado
222
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


Figura 10.9: Icono para rotar los dibujos.
10.2.2. El comando surf
Primer nivel
El comando surf dibuja esencialmente supercies en el espacio. En su forma mas
simple se puede identicar con el dibujo de funciones de dos variables en el espacio. En
este caso, el formato es
surf(x,y,z)
donde x e y especican una malla en el plano y z la altura correspondiente. El color que
se da a cada punto esta asignado por defecto seg un la altura en el eje Z.
Queda pendiente, no obstante, como construir una malla. Aunque se puede hacer a
mano (Matlab ofrece en su ayuda informacion detallada de como hacerlo), es mejor utilizar
los comandos propios de Matlab, en este caso, meshgrid. As, si queremos representar una
supercie z = f(x, y) en un dominio rectangular utilizando los puntos de coordenadas
x = (x
1
, . . . , x
n
) e y = (y
1
, . . . , y
m
), deberemos generar primero la malla formada por los
puntos (x
i
, y
j
). En Matlab simplemente tenemos que utilizar la orden
[X,Y]=meshgrid(x,y)
que crea las matrices de tama no mn
X =
_

_
x
1
. . . x
n
.
.
.
.
.
.
x
1
. . . x
n
_

_
Y =
_

_
y
1
. . . y
1
.
.
.
.
.
.
y
m
. . . y
m
_

_
.
Es decir, las m las de X son copias del vector x y las n columnas de Y son copias del
vector y. La malla esta formada por los puntos (X(i,j),Y(i,j)). Por ejemplo,
>> x=[0 0.33 0.67 1]; y=[-1 0 1];
>> [X,Y]=meshgrid(x,y)
X =
0 0.3300 0.6700 1.0000
0 0.3300 0.6700 1.0000
0 0.3300 0.6700 1.0000
223
B
o
r
r
a
d
o
r
10.2 Gracas en 3D LECCI

ON V
Y =
-1 -1 -1 -1
0 0 0 0
1 1 1 1
Ahora para representar la supercie z = f(x, y) utilizamos la orden surf(X,Y,Z)
donde
Z = f(X, Y) =
_

_
f(x
1
, y
1
) . . . f(x
n
, y
1
)
.
.
.
.
.
.
f(x
1
, y
m
) . . . f(x
n
, y
m
)
_

_
.
El dibujo de la Figura 10.10 se ha construido con el siguiente conjunto de instrucciones
>>x=linspace(-2,2,40); y=linspace(-1,1,20);
>>[X,Y]=meshgrid(x,y); Z=X.^2-Y.^2;
>>surf(X,Y,Z)
Figura 10.10: Ejemplo de una supercie creada con surf.
Se puede dibujar la supercie y asignar un color seg un los valores de un cuarto vector
(matriz mas bien). Desde una interpretacion matematica, se tratara de dibujar los valores
de una funcion sobre una supercie:
>> x=linspace(-3,3,60); y=linspace(-3,3,60);
>> [X,Y]=meshgrid(x,y); Z=X.^2-Y.^2; T=cos(sqrt(X.^2+Y.^2+Z.^2));
>> surf(X,Y,Z,T), colorbar
224
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


Figura 10.11: Otro ejemplo de surf.
despliega la graca de la Figura 10.11. El comando colorbar muestra la barra de colores
de la derecha que informa sobre el valor numerico que corresponde a cada color.
Tambien es posible dibujar supercies denidas sobre partes de un rectangulo. Para
ello, cualquier punto cuya coordenada z sea un nan (not a number), no se dibuja. Por
ejemplo
>> x=linspace(-1,1,101); y=x;
>> [X,Y]=meshgrid(x,y);
>> Z=-X.^2-Y.^2;
>> Z(sqrt(X.^2+Y.^2)<0.5)=nan;
>> surf(X,Y,Z)
despliega la supercie de la Figura 10.12). La cuarta lnea merece un comentario aunque
instrucciones parecidas han sido tratadas ya en la Leccion 1. Al hacer la comparacion
sqrt(X.^2+Y.^2)<0.5, Matlab devuelve una matriz logica, de 1s y 0s seg un el punto
correspondiente este cerca del cero o no. La instruccion Z(sqrt(X.^2+Y.^2)<0.5)=NaN,
hace que los puntos situados dentro del crculo de radio 1/

2 (que es donde la expresion


logica es 1), tomen como valor NaN. De todos modos se observa la deciente aproximacion
de los cuadrados, propios de surf, del crculo interior. Al nal de esta leccion veremos
una forma mas elaborada para trabajar con supercies denidas sobre conjuntos mas
generales.
Comandos del entorno 3D
Nos limitaremos a hablar de cinco comandos que controlan las propiedades del entorno
3D, aunque estos no son los unicos disponibles en Matlab:
225
B
o
r
r
a
d
o
r
10.2 Gracas en 3D LECCI

ON V
Figura 10.12: Utilizacion de nan en un dibujo.
colorbar: despliega una barra de colores que informa sobre la correspondencia
entre el valor numerico y el color utilizado. Por defecto se despliega
verticalmente a la derecha del dibujo, aunque puede mostrarse horizon-
talmente si as se desea.
colormap: especica que colores se van a utilizar en el dibujo (mapa de colores).
Existe un conjunto de formatos predenidos que listamos a continuacion
autumn bone colorcube cool copper flag
gray hot hsv jet lines pink
prism spring summer white winter default
Para cambiar a un formato basta ejecutar
>> colormap(bone)
Se pueden tambien denir formatos personalizados, bien mediante la
lnea de comandos o desde la propia ventana graca.
daspect: controla la relacion entre los ejes del dibujo. Baste decir que
daspect([1 1 1])
ja que las proporciones de los ejes OX, OY y OZ sean iguales. Es decir,
>> sphere(40); % dibuja una esfera
>> daspect([1 1 1]) % relaciones 1:1:1 en los ejes
muestra la esfera como tal y no como un elipsoide.
226
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


pbaspect: similar al anterior pero relacionado con la caja que enmarca el dibujo.
view: especica el punto desde el que se ve el dibujo. Tiene dos parametros:
view(az,el)
El primero es el azimuth (angulo de rotacion horizontal) y el segundo
es el angulo de elevacion vertical. Ambos deben especicarse en grados.
Por defecto en dibujos tridimensionales az = 37.5 y el = 30.
El comando surf: segundo y tercer nivel
En un segundo nivel de utilizacion del comando anterior podemos acceder a algunas
opciones adicionales entre las que podramos destacar:
7
EdgeAlpha: se especica un valor entre 0 y 1 que dene la transparencia que
tiene la rejilla o red en el dibujo (con 0 la red es transparente
y por tanto no se ve).
FaceAlpha: como la opcion anterior pero relativa a las caras.
LineStyle: indica el formato de la rejilla: -, --, :,.... Igual que en
plot. Con none desaparece del dibujo.
MeshStyle tiene tres opciones posibles both (por defecto), row y column.
Especica como despliega la red: entera, solo las las o solo
columnas, respectivamente.
EdgeColor: toma cuatro posible valores: un color (en el formato habitual),
none, flat, interp. Especica que color utilizar en la
rejilla. Por defecto es negro, pero se puede eliminar la rejil-
la (none), se puede utilizar el color marcado por el primer
vertice (flat) o bien utilizar un color denido por los colores
de los dos vertices de cada eje (interp).
FaceColor: con los mismos valores que en la opcion anterior. La opcion
interp ja un color interpolado sobre la cara, eliminan-
do as el aspecto de mosaico que en ocasiones adoptan las
supercies.
LineWidth: anchura de las lneas utilizadas en el dibujo de la red.
Marker: indica que marca colocar en cada punto del dibujo. Sigue el mis-
mo formato que plot (por defecto no coloca ninguna marca).
MarkerEdgeColor
MarkerFaceColor
MarkerSize
: igual que en plot.
Por ejemplo, la Figura 10.13 se obtiene con
7
siempre a nuestro juicio...
227
B
o
r
r
a
d
o
r
10.2 Gracas en 3D LECCI

ON V
f=inline(x^2-y^2); f=vectorize(f);
x0=linspace(-2,2,6);
y0=linspace(-2,2,4);
[X0,Y0]=meshgrid(x0,y0);
x1=linspace(-2,2,40);
y1=linspace(-2,2,40);
[X1,Y1]=meshgrid(x1,y1);
hold on % solapamos dos dibujos
surf(X0,Y0,f(X0,Y0),facecolor,none,edgecolor,k,...
marker,o, markersize,6,MarkerFaceColor,k, linewidth,2);
surf(X1,Y1,f(X1,Y1),facecolor,interp, facealpha,0.5,...
edgecolor,none);
colorbar
colormap(spring)
Figura 10.13: Algunas opciones con surf.
Ejercicio 10.5 Observa las diferencias entre estas dos salidas de la misma supercie
>> x=linspace(-2,2,20); y=linspace(-1,1,20);
>> [X,Y]=meshgrid(x,y);
>> figure(1)
>> surf(X,Y,X.^3-Y.^2.*Y,linestyle,none)
>> figure(2)
>> surf(X,Y,X.^3-Y.^2.*Y,linestyle,none,facecolor,interp)
228
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


En un tercer nivel de dicultad (y de precision), se puede manipular el dibujo va el
handle que devuelve, de forma similar a como hacamos en plot. Como ejemplo ilustrativo,
>> x1=linspace(-2,2,60); y1=linspace(-2,2,60);
>> [X1,Y1]=meshgrid(x1,y1);
>> h=surf(X1,Y1,exp(-X1.^2-Y1.^2).*cos(pi*(X1.^2-Y1.^2)/2),...
facecolor,interp,edgecolor,none);
devuelve en h, despues de dibujar, un puntero al dibujo. Podemos leer una propiedad
determinada mediante get:
>> get(h,facecolor)
ans =
interp
o bien ver todas con
>> get(h)
AlphaData = [1]
AlphaDataMapping = scaled
CData = [ (60 by 60) double array]
CDataMapping = scaled
EdgeAlpha = [1]
EdgeColor = none
EraseMode = normal
FaceAlpha = [1]
FaceColor = interp
LineStyle = -
LineWidth = [0.5]
Marker = none
MarkerEdgeColor = auto
MarkerFaceColor = none
MarkerSize = [6]
MeshStyle = both
XData = [ (60 by 60) double array]
YData = [ (60 by 60) double array]
ZData = [ (60 by 60) double array]
FaceLighting = flat
EdgeLighting = none
................
................
Observaramos as algunas de las opciones que hemos comentado y otras muchas mas que
no hemos estudiado.
Para cambiar una propiedad utilizamos de nuevo el comando set:
>> set(h, edgecolor,[0.2 0 0],linewidth,1);
>> set(h, facaalpha,.5);
229
B
o
r
r
a
d
o
r
10.2 Gracas en 3D LECCI

ON V
Mallados especiales
Con sphere podemos obtener el mallado de una esfera. Puede utilizarse para dibujar
bien una esfera o incluso funciones denidas sobre una supercie esferica. Por ejemplo,
mediante el siguiente chero script hemos obtenido las representaciones gracas de la
Figura 10.14.
[X,Y,Z]=sphere(60);
subplot(121)
surf(X,Y,Z,facecolor,[0.4 0.9 0.6])
daspect([1 1 1]) % aspecto [1 1 1]
title(La esfera,fontsize,14)
subplot(122);
surf(X,Y,Z,16*X.^2.*Y.^3.*Z.^4)
title(16 X^2 Y^3 Z^4 sobre la esfera,fontsize,14)
colormap(hot)
colorbar(hor) % barra de colores horizontal
daspect([1 1 1]) % aspecto [1 1 1]
Figura 10.14: Esferas en 3D.
Comandos similares son ellipsoid (elipsoides) y cylinder (cilindros). Son algo mas
exibles de lo que pueda parecer. As, y aunque parezca paradojico,
230
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


>> cylinder(0:0.1:1,40)
dibuja un cono.
Ejercicio 10.6 Lee bien la ayuda de cylinder. Podras dibujar una semiesfera utilizando
este comando?.
10.2.3. Otros comandos
Comentaremos a continuacion otras instrucciones relacionadas con gracas de objetos
tridimensionales.
pcolor
Proporciona un dibujo bidimensional de una supercie vista desde arriba. Es equiva-
lente a dibujar primero la supercie con la orden surf y posteriormente cambiar el punto
de vista mediante view(0,90). Puedes ver un ejemplo en la Figura 10.15.
Figura 10.15: Una supercie con surf y pcolor.
contour y contourf
Despliegan las lneas de nivel del dibujo. Propiamente generan una graca en 2D. La
diferencia entre ellas es que la primera instruccion solo traza las curvas de nivel mientras
que la segunda colorea el espacio entre ellas.
Es posible a nadir un texto sobre cada lnea de nivel utilizando clabel. Para ello basta
hacer como en el ejemplo siguiente
231
B
o
r
r
a
d
o
r
10.2 Gracas en 3D LECCI

ON V
>> x1=linspace(-2,2,60); y1=linspace(-2,2,60);
>> [X1,Y1]=meshgrid(x1,y1);
>> f=vectorize(inline(cos(x^2-y)));
>> subplot(211) % dos dibujos
>> [c,h]=contour(X1,Y1,f(X1,Y1)); colorbar;
>> clabel(c,h) % Inserta el texto sobre las curvas de nivel
>> subplot(212)
>> [c,h]=contourf(X1,Y1,f(X1,Y1),5); colorbar % 5 curvas de nivel;
>> clabel(c,h,fontsize,12); % cambiamos tamano de la letra
El resultado es el de la Figura 10.16.
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
-2
-1
0
1
2
-
0
.
8
-
0
.8
-
0
.
8
-
0
.8
-
0
.
8
-
0
.
8
-
0
.
6
-
0
.6
-
0
.
6
-
0
.6
-
0
.
6
-
0
.
6
-
0
.
4
-0
.4
-
0
.4
-
0
.
4
-
0
.
4
-
0
.
4
-
0
.
2
-
0
.2
-0
.2
-
0
.
2
-
0
.
2
-0.2
-
0
.
2
0
0
0
0
0
0
0
0
.
2
0.2
0
.
2
0
.
2
0
.2
0
.
2
0
.
4
0.4
0
.
4
0
.
4
0
.4 0
.4
0
.
4
0
.
6
0.6
0
.
6
0
.6
0
.6
0
.
6
0
.
8
0.8
0
.
8
0
.8
0
.8
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
-2
-1
0
1
2
-
0
.
5
9
9
9
9
-
0
.
5
9
9
9
9
-0.2
-
0
.
2
-0.2
-
0
.
2
0
.2
0
.
2
0
.
2
0
.
2
0
.
6
0
.
6
0
.
6
0
.6
0
.
6
-
0
.
2
-
0
.
2
0
.
2
0
.
2 -0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
Figura 10.16: Lneas de nivel
surfc y surfl
Ambas son variantes de surf. La primera despliega la supercie y dibuja en el plano
OXY (plano inferior) las curvas de nivel.
La segunda es como surf pero el color que asigna a cada punto viene determinado
por un punto de iluminacion exterior. El resultado es el de una supercie de un color
determinado iluminado desde un punto
mesh, meshc, meshz y waterfall
Todos ellos dibujan unicamente la malla (rejilla) del dibujo. La segunda ademas a nade
las lneas de nivel, de forma semejante a como proceda surfc. Finalmente, waterfall es
232
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


como mesh pero a nade un efecto de caida en los bordes del dibujo
8
.
10.2.4. Comandos faciles de usar
Los comandos
ezplot3 ezmesh ezmeshc ezsurf ezsurfc
ezcontour ezcontourf
permiten trazar, de forma muy sencilla, curvas y supercies en el espacio. Su sencillez de
uso (consulta la ayuda) queda lastrada con el inconveniente de que apenas se tiene control
sobre el aspecto nal.
10.3. Campos vectoriales
Los comandos quiver y quiver3 despliegan en 2D y 3D campos de velocidades. Esto
es, a cada punto se le asigna un vector y se dibuja.
-2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5
-2.5
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
2.5
Figura 10.17: Campo de velocidades con quiver
Por ejemplo, la Figura 10.17 se ha obtenido con
>>x=-2:0.25:2; y=x;
>>[X,Y]=meshgrid(x,y); % malla del cuadrado [-2,2] x [-2,2]
>>ind=logical(zeros(size(X))); % matriz logica de dimensi\{o}n la de X
>>ind(X.^2+Y.^2<0.5^2)=1; % si (x,y) esta cerca de (0,0) vale 1
>>X(ind)=[]; Y(ind)=[]; % eliminamos estos puntos
8
Es mas facil verlo que explicarlo...
233
B
o
r
r
a
d
o
r
10.4 Dibujos sobre dominios mallados en triangulos LECCI

ON V
>>vx=-Y./(X.^2+Y.^2);
>>vy=X./(X.^2+Y.^2); % calculamos vectores
>>h=quiver(X,Y,vx,vy);
>>axis square
Observa que cerca del (0,0) los vectores se hacen muy grandes. Para evitar que esto
distorsione el dibujo hemos optado por no dibujar los vectores correspondientes a puntos
muy cercanos al origen. Con este n hemos utilizado una variable (en realidad una matriz)
logica ind que toma valor uno unicamente si el punto correspondiente (X,Y) esta cerca
del origen.
Una vez salvada esta dicultad, hemos procedido a dibujar el campo de velocidades
resultante.
El comando quiver devuelve en realidad dos punteros, uno a las lneas y otro a
la cabeza del vector. Sus valores opcionales son similares a los ya vistos en secciones
anteriores.
Ejercicio 10.7 Siguiendo con las instrucciones desplegadas arriba, observa que sucede si se
ejecuta
set(h(1),linewidth,1,color,r,linestyle,:)
set(h(2),color,k)
Podras eliminar la punta de los vectores?.
Ejercicio 10.8 Utilizando el comando quiver3, dibuja el campo de velocidades que a cada
punto le asigna el vector (velocidad) dado por
_

x
_
x
2
+y
2
+z
2
,
y
_
x
2
+y
2
+z
2
,
z
_
x
2
+y
2
+z
2
)
(Ayuda: el comando meshgrid es tambien el apropiado para construir mallas en 3D)
10.4. Dibujos sobre dominios mallados en triangulos
Los comandos que hemos estudiado a lo largo de la seccion precedente estan pensados
para dibujar supercies denidas esencialmente sobre una cuadrcula. Aunque en muchos
casos esto es suciente, en otras muchas ocasiones se trabaja con funciones denidas sobre
conjuntos, o dominios en la terminologa habitual, mucho mas generales.
Una forma muy simple de trabajar con estos dominios es dividirlos en triangulos y
construir la supercie solapando diferentes planos denidos sobre cada triangulo
9
. Los
resultados que se obtienen son bastante satisfactorios, puesto que los triangulos son mas
exibles que los cuadrilateros a la hora de adaptarse a los dominios.
Esta division en triangulos de un dominio se denomina triangulacion o mallado del
dominio. Se dice que un mallado se hace mas no si el tama no de los triangulos disminuye.
Una triangulacion es conforme si la interseccion de dos lados cualesquiera del mallado
es o bien vaca (los triangulos no se tocan), o un vertice o un lado entero. Es decir no
9
Se utiliza el conocido resultado de que tres puntos no alineados denen un unico plano. Es facil ver
tambien que la supercie as construida es continua
234
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


Figura 10.18: Triangulacion no conforme.
se admite que un lado de un triangulo pueda ser parte de dos lados de dos triangulos
diferentes (vease la Figura 10.18). Por otro lado, una familia de triangulaciones se dice
regular si los triangulos no se aplanan, es decir, los angulos de los triangulos no se hacen
muy peque nos.
La siguiente cuestion es como almacenar la informacion de una triangulacion. Si
optaramos por guardar cada triangulo, con sus correspondientes vertices, guardaramos
informacion redundante. Por ejemplo, un vertice compartido por 6 triangulos sera alma-
cenado 6 veces.
En lugar de ello se opta por una estructura mas elaborada pero mas economica. Se
empieza almacenando las dos coordenadas de los vertices en dos vectores que denotaremos
por x e y. En segundo lugar, apuntamos los vertices que corresponden a cada triangulo.
Esto se hace mediante una matriz, que llamaremos en lo que sigue t, de tres columnas y
n umero de las igual al n umero de triangulos. Para saber los vertices que corresponden
al triangulo i basta leer la correspondiente la de t y sus coordenadas seran
[x(t(i,1)),y(t(i,1))], [x(t(i,2)),y(t(i,2))], [x(t(i,3)),y(t(i,3))]
A modo de ejemplo, el mallado expuesto en la Figura 10.19 se guarda en las siguientes
variables
Triangulos
8 3 16
7 2 15
9 5 21
11 6 20
10 1 14
12 4 17
16 9 21
4 8 17
1 7 14
15 11 20
235
B
o
r
r
a
d
o
r
10.4 Dibujos sobre dominios mallados en triangulos LECCI

ON V
-0.5 0 0.5
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
1
2
3
4
5
6
7 8
9 10
11 12
13
14
15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Figura 10.19: Ejemplo de triangulacion. En el graco la numeracion de los triangulos se
rodea con un crculo.
5 10 19
6 12 20
14 7 15
2 11 15
17 13 20
18 15 20
3 9 16
18 13 19
16 13 17
8 16 17
10 14 19
14 15 18
19 13 21
14 18 19
12 17 20
13 18 20
13 16 21
5 19 21
coordenadas:
x y
236
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 10. Matlab: Salidas gracas en Matlab


0.5033 -0.3584
0.5033 0.2378
-0.4967 -0.3584
-0.4967 0.2378
0.0033 -0.4603
0.0033 0.3397
0.5033 -0.0603
-0.4967 -0.0603
-0.2523 -0.4363
0.2590 -0.4363
0.2590 0.3157
-0.2523 0.3157
-0.0716 -0.1050
0.2924 -0.1866
0.2820 0.0614
-0.2806 -0.1991
-0.2641 0.0537
0.1204 -0.0707
0.0838 -0.2577
0.0113 0.1306
-0.1031 -0.2912
La informacion anterior es suciente para construir la malla, la triangulacion del do-
minio. Si ademas se desea construir una supercie denida sobre ese dominio, basta a nadir
un vector adicional z de forma que z(j) sea el valor de la funcion en el nodo j.
Figura 10.20: Un dominio mallado en triangulos.
237
B
o
r
r
a
d
o
r
10.4 Dibujos sobre dominios mallados en triangulos LECCI

ON V

Esta es una forma ya estandar de denir y trabajar con una triangulacion que tambien
sigue Matlab
10
con los comandos trimesh y trisurf.
El primero despliega la malla triangular especicada por t, (la matriz conteniendo los
triangulos), x e y (que dan las coordenadas de los vertices),
trimesh(t,x,y)
Se puede especicar la coordenada z de los vertices (la altura),
trimesh(t,x,y,z)
con lo que se dibuja la malla 3D correspondiente.
El comando trisurf es similar, pero colorea las caras. Hablando con propiedad, estos
comandos al igual que mesh y surf, representan supercies. Las opciones para manipular
el aspecto nal de la supercie son iguales que las de surf, incluyendo las ya vistas
facecolor, facealpha, meshalpha, edgecolor,....
Nota. Un tema nada trivial es la construccion de un mallado sobre un dominio (polig-
onal) dado. Existen multitud de algoritmos que tratan este problema. En principio se
plantea la construccion de una malla gruesa, con pocos triangulos y de area consider-
able, con los triangulos lo mas regulares posibles (sin deformar, alargar, en demasa los
triangulos).
Posteriormente, se trata de renar la malla, es decir, dividir los triangulos en triangulos
mas peque nos hasta que se alcance una precision adecuada.
Esta idea se esconde detras de aplicaciones como la interpolacion (aproximacion de
una funcion) y especialmente el metodo de elementos nitos, probablemente del metodo
11
mas utilizado en la resolucion de problemas de contorno para ecuaciones en derivadas
parciales.
Si se desea informacion de como se puede inicializar un malla en Matlab, as como
sobre el algoritmo utilizado se puede consultar el comando initmesh (incluido el tema de
triangulaciones de Delaunay). Para el renamiento puedes consultar refinemesh. .
Existe otra posibilidad mas visual, y por tanto mas amigable para empezar a trabajar.
Teclea
>> pdetool
Se cargara un entorno graco para la resolucion de ecuaciones en derivadas parciales. No
entraremos en este tema por ser demasiado tecnico. En lugar de ello, nos centraremos en
la denicion de mallados. Una vez dibujado el dominio, y mallado, se puede exportar la
malla a la ventana de comandos en las variables t y p. La primera contiene en las tres
primeras las los triangulos que componen la triangulacion mientras que las coordenadas
de los vertices estan guardadas en las dos las de p.
10
La toolbox pdetool dedicada a la resolucion de ecuaciones en derivadas parciales sigue una variante
algo mas complicada que la expuesta arriba.
11
Propiamente hablando es una familia de metodos.
238
B
o
r
r
a
d
o
r
Captulo 11
Interpolacion. Curvas Bezier
11.1. Interpolacion polinomica
Un problema ya clasico es la construccion, o aproximacion de una funcion conocidos
unos pocos valores. Algunas referencias a este tipo de problemas se remontan al manejo de
tablas trigonometricas y posteriormente logartmicas y exponenciales donde unos pocos
valores estaban tabulados y para valores intermedios era necesario un proceso de interpo-
lacion. Se habla en este caso de un problema de interpolacion de Lagrange. Si ademas del
valor puntual, a nadimos informacion sobre las derivadas estamos ante una interpolacion
de Hermite.
En estos apuntes trataremos principalmente la interpolacion polinomica, esto es, la
construccion de polinomios que pasen por unos puntos predeterminados. Daremos tam-
bien unos breves esbozos sobre la interpolacion por polinomios trigonometricos y la inter-
polacion polinomica a trozos con las funciones spline.
11.1.1. Interpolacion polinomica de Lagrange
El problema que queremos resolver es el siguiente
Dados un conjunto de n + 1 puntos (x
0
, y
0
), (x
1
, y
1
), . . . (x
n
, y
n
), construir
un polinomio p
n
de grado n tal que
p
n
(x
j
) = y
j
, j = 0, . . . , n.
El polinomio p
n
recibe el nombre de polinomio de interpolacion de Lagrange. Ha-
bitualmente, y
j
son valores de una funcion f que solo se puede evaluar en un conjunto
nito de puntos porque o bien en el resto del intervalo es desconocida, o bien es cara
computacionalmente de evaluar.
Tenemos una serie de cuestiones pendientes:
Se puede construir siempre el polinomio de interpolacion p
n
?. Y relacionada con
esta cuestion, el polinomio de interpolacion es unico?.
Existen formas optimas para calcular este polinomio?.
239
B
o
r
r
a
d
o
r
11.1 Interpolacion polinomica LECCI

ON V
7.994 7.996 7.998 8 8.002 8.004 8.006
-1
0
1
2
3
4
5
x 10
-9
z
6
-46*z
5
+884*z
4
-9088*z
3
+52736*z
2
-163840*z+212992
(z-8)
4
*(4+(z-8)*(2+(z-8))
Figura 11.1: Dos formas de escribir y evaluar un polinomio.
Como aproxima p
n
a esta funcion f?. Este punto es crucial ya que se trata del error
que podemos esperar de nuestra aproximacion.
Como cuestion asociada, pero no menos importante, nos deberamos plantear
Cual es la mejor forma de evaluar un polinomio?. Es decir, nos interesa el poli-
nomio escrito en la manera tradicional o simplemente poder evaluarlo de forma facil,
rapida y estable numericamente?
Ejemplo En la Figura 11.1 hemos dibujado los polinomios (z8)
4
(4+(z8)(2+(z8)))
y z
6
46z
5
+884z
4
9088z
3
+52736z
2
163840z+212992 en un entorno de 8. Analticamente
son el mismo polinomio pero el resultado de evaluar una u otra expresion puede dar
un resultado muy diferente debido a los errores de redondeo. La primera expresion es
mucho mas apropiada desde el punto de vista computacional aunque nosotros estemos
mas acostumbrados a escribir los polinomios de la segunda manera.
El algoritmo mas estable para evaluar un polinomio es el metodo de Horner que
esta basado a su vez en el metodo de Runi para dividir polinomios. Concretamente
utiliza que el valor de p(a) es el resto de dividir p(z) por z a . El algoritmo es facilmente
implementable y tiene un costo reducido.
11.1.2. Existencia del polinomio de interpolacion
Probaremos la existencia del polinomio de interpolacion mediante un razonamiento
directo. Tomemos
P
n
p
n
(x) = a
0
+a
1
x +a
2
x
2
+. . . +a
n
x
n
,
240
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 11. Interpolacion. Curvas Bezier


un polinomio de grado n. Obviamente, p
n
cuenta con n + 1 parametros libres que son
simplemente sus coecientes a
j
. Si exigimos que
p
n
(x
j
) = y
j
, j = 0, . . . , n,
nos encontramos con que los coecientes satisfacen el sistema lineal
_

_
1 x
0
x
2
0
x
n
0
1 x
1
x
2
1
x
n
1
1 x
2
x
2
2
x
n
2
. . . . . . . . . . . . . . . . . .
1 x
n
x
2
n
x
n
n
_

_
_

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

_
=
_

_
y
0
y
1
y
2
.
.
.
y
n
_

_
. (11.1)
Por tanto el problema se reduce a la resolucion de un sistema de ecuaciones lineales y
la existencia y unicidad del polinomio de interpolacion a que el sistema en cuestion sea
compatible determinado.
La matriz del sistema (11.1) es de tipo Vandermonde que nos ha surgido repetidas
veces en estos apuntes
1
. Dado que el sistema tiene el mismo n umero de ecuaciones que
de incognitas, se tiene que la existencia de solucion para cualquier conjunto de
datos es equivalente a la unicidad. Ademas, la unicidad de solucion es equivalente
a que la unica solucion posible para el termino independiente nulo sea el polinomio cero.
Pero esto es inmediato puesto que todo polinomio no nulo de grado n tiene a lo sumo n
races.
Otra forma de ver la existencia y unicidad es de tipo constructiva. Tomemos
L
j
(x) :=
(x x
0
) (x x
j1
)(x x
j+1
) (x x
n
)
(x
j
x
0
) (x
j
x
j1
)(x
j
x
j+1
) (x
j
x
n
)
=

i=j
x x
i
x
j
x
i
.
Es facil ver que L
j
P
n
y que ademas
L
j
(x
i
) :=
_
1, i = j,
0, i ,= j.
Por tanto,
p
n
(x) = y
0
L
0
(x) +y
1
L
1
(x) +. . . +y
n
L
n
(x)
satisface las condiciones (11.1). Una vez probada la existencia deducimos por los mismos
argumentos la unicidad del polinomio de interpolacion.
La formula anterior se conoce como formula de Lagrange del polinomio de in-
terpolacion y la base del espacio de polinomios P
n
formada por L
j

j
se denomina base
de Lagrange del problema de interpolacion.
Ejercicio 11.1 Programar una funcion que eval ue el polinomio de interpolacion seg un la
formula de Lagrange en un conjunto de puntos.
1
Cada columna es el resultado de elevar a una potencia el vector [1 x
0
x
1
x
n
]

241
B
o
r
r
a
d
o
r
11.1 Interpolacion polinomica LECCI

ON V
Solucion. He aqu una posible implementacion
2
01 % LAGRANGEP
02 %
03 % Y=LAGRANGEP(X0,Y0,X) devuelve en Y el valor del pol. de interp.
04 % que pasa por los puntos (X0,Y0) evaluado
05 % en x mediante la formula de Lagrange
06 %
07 % X0 y Y0 son dos vectores de la misma longitud, X puede ser un
08 % vector.
09
10 function y=lagrangep(x0,y0,x)
11
12 x0=x0(:).; y0=y0(:).; x=x(:).; % todos vectores filas
13 n=length(x0);
14 if (length(y0)~=n)
15 disp(ERROR. Long de x0 debe ser igual a Long de y0)
16 return
17 end
18 y=x*0; % y es un vector nulo de igual dimension que x
19
20 for j=1:n
21 p=ones(size(x));
22 for i=[1:j-1 j+1:n]
23 p=p.*(x-x0(i))./(x0(j)-x0(i));
24 end
25 y=y+p*y0(j);
26 end
27
28 return

Hemos testado el programa anterior para interpolar la funcion exp(sen(6x)) en [0, ]


en diversos puntos uniformemente distribuidos (a igual distancia). El resultado, junto con
el error cometido se muestra en la Figura 11.2.
Ejercicio 11.2 Implementa la construccion del polinomio de interpolacion mediante la res-
olucion directa del sistema dado en (11.1). Que observas cuando el grado del polinomio
crece?.
11.1.3. Formula de Newton
Es facil comprobar que la formula de Lagrange tiene un costo computacional elevado.
Por ello es necesario explorar formas alternativas de construir el polinomio de interpolacion
y de proceder a su evaluacion.
2
Observa el for de la lnea 20
242
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 11. Interpolacion. Curvas Bezier


0 0.5 1 1.5 2 2.5 3 3.5
-1
-0.5
0
0.5
1
1.5
2
0 0.5 1 1.5 2 2.5 3 3.5
-1.5
-1
-0.5
0
0.5
1
1.5
Error
polinomio de grado 5
polinomio de grado 9
polinomio de grado 13
exp(-x).*sin(6.*x)
polinomio de grado 5
polinomio de grado 9
polinomio de grado 13
Figura 11.2: Polinomios de interpolacion con diferentes grados y el error cometido.
Observa que la formula de Lagrange se basa en tomar como base de P
n
la dada por
L
0
(x), L
1
(x), . . . , L
n
(x).
En esta base, las coordenadas del polinomio de interpolacion son simplemente los valores
que toma la funcion en los puntos donde se interpola. Es decir, no es necesario resolver
ning un sistema de ecuaciones lineales (la matriz del sistema sera la matriz identidad).
El precio que se paga como contrapartida es una evaluacion mas cara del polinomio de
interpolacion.
Podemos explorar otras bases que, aumentando el costo de la resolucion del sistema,
ofrezcan formulas del polinomio de interpolacion cuya evaluacion sea menos costosa.
Planteamos as utilizar la base
1, (x x
0
), (x x
1
)(x x
0
), . . . , (x x
n1
)(x x
n2
) (x x
0
).
Es inmediato probar que es una base de los polinomios de grado n. Dicho de otra forma,
cualquier polinomio de grado n se puede escribir (de forma unica) como

0
+
1
(x x
0
) +. . . +
n
(x x
n1
)(x x
n2
) (x x
0
). (11.2)
Ademas el sistema lineal que hay que resolver para obtener los coecientes
j
es ahora tri-
angular superior, por lo que su resolucion es practicamente directa en O(n
2
) operaciones.
243
B
o
r
r
a
d
o
r
11.1 Interpolacion polinomica LECCI

ON V
A un es mas, si p
n
(x) interpola a f en n + 1 puntos, a nadir un punto mas (x
n+1
, y
n+1
) es
simplemente corregir el polinomio anterior en la forma siguiente
p
n+1
(x) = p
n
(x) +
n+1
(x x
0
) (x x
n
), (11.3)
donde

n+1
=
y
n+1
p
n
(x
n+1
)
(x
n+1
x
n
)(x
n+1
x
n1
) (x
n+1
x
0
)
. (11.4)
Es decir, el trabajo hecho para calcular el polinomio de interpolacion en n + 1 puntos se
puede utilizar si se desea a nadir un punto mas de interpolacion.
Estas identidades se pueden utilizar para calcular el polinomio de interpolacion uti-
lizando polinomios intermedios que vayan interpolando en subconjuntos crecientes de
datos. Sin embargo, un analisis algo mas detallado nos va a descubrir una manera mas
apropiada de calcular los coecientes del polinomio de interpolacion. Siguiendo la no-
tacion clasica, consideraremos que los valores y
j
que deseamos interpolar provienen de
una funcion f a priori desconocida, es decir,
y
j
= f(x
j
), j = 0, . . . , n.
Escribiremos entonces el polinomio que interpola en x
k
, . . . , x
k+m
como sigue
f[x
k
] +f[x
k
, x
k+1
](x x
k
) +. . . +f[x
k
, x
k+1
, . . . , x
k+m
](x x
k
) (x x
k+m1
). (11.5)
La identidad (11.3) justica el uso de esta notacion es correcta. Esto es, el coeciente
de (x x
k
) (x x
k+r
) no depende de m. Obviamente, si k = 0 y m = n, entonces
recuperaremos el polinomio de interpolacion en el conjunto inicial de valores. A estas
alturas f[x
k
, x
k+1
, . . . , x
k+r
] son todava simples coecientes del polinomio de cuyo calculo
nos ocupamos a continuacion. Es inmediato comprobar que si

p
n
interpola en
_
(x
0
, f(x
0
)), (x
1
, f(x
1
)), . . . , (x
n
, f(x
n
))
_
,
q
n
interpola en
_
(x
1
, f(x
1
)), (x
2
, f(x
2
)), . . . , (x
n+1
, f(x
n+1
))
_
,
entonces
p
n+1
(x) = q
n
(x) +
x x
n+1
x
0
x
n+1
(p
n
(x) q
n
(x)), (11.6)
es el polinomio que interpola en los n + 1 puntos
_
(x
0
, f(x
0
)), (x
1
, f(x
1
)), . . . , (x
n+1
, f(x
n+1
))
_
.
Detengamonos un momento a examinar el coeciente director de cada polinomio. El
coeciente en x
n
de p
n
y q
n
y el de x
n+1
de p
n+1
son respectivamente
f[x
0
, . . . , x
n
], f[x
1
, . . . , x
n+1
] f[x
0
, . . . , x
n+1
].
Utilizando (11.6) deducimos que
f[x
0
, x
1
. . . , x
n+1
] =
f[x
0
, . . . , x
n
] f[x
1
, . . . , x
n+1
]
x
0
x
n+1
. (11.7)
244
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 11. Interpolacion. Curvas Bezier


Como
f[x
j
] = f(x
j
)
(simplemente porque el polinomio de grado 0 que pasa por (x
j
, f(x
j
)) es la constante
f(x
j
)), obtenemos una forma recursiva de calcular los coecientes del polinomio de in-
terpolacion. El algoritmo resultante se puede representar esquematicamente mediante el
diagrama de la Figura 11.3.
En la literatura, f[x
k
, . . . , x
k+r
] recibe el nombre de diferencia dividida de order
r, mientras que la forma de escribir el polinomio expuesta en (11.2) y (11.5) recibe el
nombre de formula de Newton
3
.
Obviamente, a partir de la formula de Newton podemos expresar el polinomio que
interpola a f en los puntos x
0
, . . . , x
n
en la forma
f[x
0
] + (x x
0
)
_
f[x
0
, x
1
] + (x x
1
)
_
f[x
0
, x
1
, x
2
] + (x x
2
)
_
. . .
+(x x
n1
)f[x
0
, x
1
, . . . , x
n
]
___
, (11.8)
que es mucho mas apropiada desde el punto de vista computacional que la forma clasica.
En forma de pseudocodigo podemos proceder del siguiente modo para evaluar el poli-
nomio de interpolacion utilizando la formula de Newton:
Diferencias divididas
01 x
0
, y
0
% datos
02 n = length(x
0
) 1
03 D(:, 0) = y
0
;
04 for j=1:n
05 for i=0:n-j
06 D(i, j) =
D(i + 1, j 1) D(i, j 1)
x
0
(i + j) x
0
(i)
07 end
08 end
09
10 % Evaluacion del polinomio
11 y=D(0,n)
12 for i=n-1:-1:0
13 y = (x x
0
(i)) y + D(0, i)
14 end
Con la notacion anterior
D(i, j) = f[x
i
, x
i+1
, . . . , x
i+j
]
de forma que j es el orden de la diferencia e i el nodo donde empieza.
3
De nuevo los nombres utilizados dan idea de la antig uedad de estas tecnicas. Newton hallo esta forma
de escribir el polinomio cuando estudiaba las formulas de cuadratura de Newton-Cotes.
245
B
o
r
r
a
d
o
r
11.1 Interpolacion polinomica LECCI

ON V
Orden 0 Orden 1 Orden 2 Orden 3
x
0 f(x
0
) = f[x
0
]
//
f[x
0
, x
1
]
//
f[x
0
, x
1
, x
2
]
//
f[x
0
, x
1
, x
2
, x
3
]
x
1 f(x
1
) = f[x
1
]
//
66
m
m
m
m
m
m
m
m
m
m
m
m
m
f[x
1
, x
2
]
66
m
m
m
m
m
m
m
m
m
m
m
m
m
//
f[x
1
, x
2
, x
3
]
66
l
l
l
l
l
l
l
l
l
l
l
l
l
x
2 f(x
2
) = f[x
2
]
//
66
m
m
m
m
m
m
m
m
m
m
m
m
m
f[x
2
, x
3
]
66
m
m
m
m
m
m
m
m
m
m
m
m
m
x
3 f(x
3
) = f[x
3
]
66
m
m
m
m
m
m
m
m
m
m
m
m
m
Figura 11.3: Estructura del calculo de las diferencias dividas.
Ejercicio 11.3 Implementa el calculo del polinomio de interpolacion mediante diferencias
divididas.
Solucion. Nuestra intencion es, si no se especican valores donde evaluar el polinomio,
que se devuelva el polinomio escrito en forma simbolica. Es decir, declararemos x como
variable simbolica y devolveremos el polinomio en esta variable. Podemos escoger hacerlo
en forma expandida o bien simplemente escrito en la forma anidada. Nosotros hemos
escogido hacerlo en la segunda forma.
Por otro lado y entrando ya en el tema de su implementacion, en el algoritmo anterior
todas las entradas de los vectores y matrices implicados se numeran de 0 a n. Hay que tener
en cuenta, como ya hemos hecho repetidas veces, que la numeracion en Matlab comienza
necesariamente en 1 y por tanto los vectores y bucles iran de 1 a n+1. Recordemos que
n+1 es la longitud del vector de datos. Aunque en teora renumerar el algoritmo es
algo sencillo, hay que hacerlo con cierto cuidado.
Dicho esto, una implementacion posible es la siguiente
01 % NEWTONP
02 %
03 % Y= NEWTONP(X0,Y0) devuelve el polinomio que interpola
04 % en (X0,Y0) escrito en forma de Newton
05 %
06 % Y= NEWTONP(X0,Y0,X) devuelve en Y el polinomio interpolante
07 % evaluado en X
08
09 function y=newtonp(x0,y0,varargin)
10
11 x0=x0(:).; y0=y0(:).; n=length(x0)-1;
12 if (length(y0)~=n+1)
13 disp(long de x0 debe ser igual long de y0)
246
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 11. Interpolacion. Curvas Bezier


14 return
15 end
16 if nargin>2
17 x=varargin{1}; % evaluamos x
18 else
19 syms x; % x es una variable simbolica
20 end
21 % calculo de las diferencias divididas
22 D=zeros(n+1); % matriz n+1 x n+1 de ceros
23 D(:,1)=y0.;
24 for j=2:n+1
25 for i=1:n-j+2
26 D(i,j)=(D(i+1,j-1)-D(i,j-1))/(x0(i+j-1)-x0(i));
27 end
28 end
29 % evaluacion del polinomio
30 D=D(1,:); % tomamos las diferencias que vamos a usar
31 y=x.^0.*D(n+1); % asi y tiene la longitud de x
32 for i=n:-1:1
33 y=(x-x0(i)).*y+D(i);
34 end
35 return

Ejercicio 11.4 El bucle interno en las lneas 25-27 se puede vectorizar. Hazlo.
Un analisis mas detenido muestra que no es necesario denir toda una matriz D sino
que es posible realizar todo el proceso con un vector. Para ello observa que las diferencias
D(i, j) con solo se utilizan dos veces, para construir D(i 1, j + 1) y D(i, j + 1). Esto se
consigue modicando las lneas 03-08 del algoritmo como sigue
Modicacion
03 D = y
0
;
04 for j=1:n
05 for i=n:-1:j
06 D(i) =
D(i) D(i 1)
x
0
(i) x
0
(i j)
07 end
08 end
247
B
o
r
r
a
d
o
r
11.1 Interpolacion polinomica LECCI

ON V
Observa que las diferencias se sobrescriben en el vector pero de una forma tal que un
valor no es borrado hasta que ya ha sido utilizado. De ah que el bucle en 05 vaya hacia
atras. Con esta modicacion
D(i) =f[x
0
, x
1
, . . . , x
i
].
Ejercicio 11.5 Retoca el programa newtonp seg un las indicaciones anteriores.
Ejercicio 11.6 El algoritmo de Neville para la evaluacion del polinomio de interpolacion se
basa en la identidad (11.6). Dado el punto x donde evaluar el polinomio de interpolacion
y partiendo de n + 1 polinomios de grado cero que interpolan los datos (x
0
, x
1
, . . . , x
n
)
procede a calcular el valor que toman en x los polinomios de grado 1 que interpolan en
dos puntos (x
0
, x
1
, x
1
, x
2
, . . . , x
n1
, x
n
), seguidamente los de grado 2 interpolantes
en tres puntos, (x
0
, x
1
, x
2
, x
1
, x
2
, x
3
, . . . , x
n2
, x
n1
, x
n
), y as sucesivamente hasta
llegar al polinomio nal de grado n.
En todos los casos es la identidad (11.6) la que permite calcular el valor del polinomio de
grado k + 1 en funcion de dos de grado k. La evaluacion se puede representar en forma de
estructura en arbol, muy similar a la que se obtiene para las diferencias divididas. Podras
dise nar y programar este algoritmo?.
Nota. Observa que el metodo funciona a un cuando los puntos x
0
, . . . , x
n
no esten
ordenados, aunque para una evaluacion del polinomio mas estable es mejor que as sea.
Ademas la denicion de las diferencias divididas no depende del orden de los puntos
f[x
0
, . . . , x
i
, . . . , x
j
, . . . x
n
] = f[x
0
, . . . , x
j
, . . . , x
i
, x
n
].
De forma alternativa se puede escribir el polinomio de interpolacion mediante
f[x
n
] +f[x
n
, x
n1
](x x
n
) +. . . +f[x
n
, x
n1
, . . . , x
0
](x x
1
)(x x
2
) (x x
n
). (11.9)
En este caso se habla de diferencias regresivas, mientras que en el caso que hemos
tratado reciben el nombre de diferencias progresivas.
Ejercicio 11.7 Modicar los algoritmos anteriores para trabajar con las diferencias regresi-
vas.
Interpolacion en Matlab
La interpolacion polinomica esta implementada en Matlab con polyfit. La sintaxis es
>> p=polyfit(x0,y0,n)
donde x0 e y0 son los puntos a interpolar y n es el grado del polinomio utilizado. Si n se
toma igual a length(x0) 1, devuelve el polinomio de interpolacion mientras que para
n menor calcula el polinomio que mejor aproxima a los puntos por mnimos cuadrados
4
.
Para evaluar el polinomio se recurre a polyval.
El algoritmo que utiliza Matlab es el directo, construyendo simplemente la matriz
de Vandermonde y resolviendo el sistema mediante una descomposicion QR que es mas
estable numericamente. Sin embargo, con un n umero (muy) elevado de puntos, la inesta-
bilidad numerica subyacente se hace palpable.
4
Es decir, calcular el polinomio de grado n, que minimiza

i
(p(x
i
) y
i
)
2
.
248
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 11. Interpolacion. Curvas Bezier


Ejercicio 11.8 Interpola la funcion cos(8x) en [0, 1] con 20,40, 80 y 160 puntos utilizando
el comando polyfit y las funciones lagrangep y newtonp y dibuja el resultado. Que obser-
vas?.
11.1.4. Analisis del error de interpolacion
El error entre la funcion y el polinomio de interpolacion se puede estudiar utilizan-
do algunas propiedades de las diferencias divididas que detallaremos mas adelante. En
cualquier caso, el resultado relevante es el siguiente: si f es la funcion regular que inter-
polamos en x
0
, x
1
, . . . , x
n
[a, b], entonces el error en cada punto se puede escribir
f(x) p
n
(x) =
1
(n + 1)!
f
(n+1)
(
x
) (x x
0
)(x x
1
) (x x
n
)
. .

n
(x)
(11.10)
donde
x
[a, b] depende de x. Vemos que hay varias contribuciones al error nal:
el factor 1/(n + 1)! que tiende rapidamente a 0,
un factor que depende del crecimiento de la derivada n + 1,
un termino que depende de la colocacion de los nodos de interpolacion y que puede
ser muy oscilante.
En vista de lo anterior sera facil concluir que hay convergencia del polinomio de
interpolacion a la funcion si esta es suave. Dicho de otra manera, funcion y polinomio se
volveran indistinguibles si tomasemos un n umero elevado de puntos.
Desafortunadamente
5
, la conclusion anterior es falsa. Uno de los primeros (con-
tra)ejemplos lo encontro Carl Runge
6
a nales del siglo XIX
7
. Consista en interpolar la
funcion
f(x) =
1
1 + 25x
2
en el intervalo [1, 1] en un conjunto uniforme de puntos. El resultado (desastroso) se
muestra en la Figura 11.4.
Una forma de reducir el error es controlar la funcion
n
(x) para que sea lo mas peque na
posible. As, el problema se plantea en los siguientes terminos
8
Que eleccion de los nodos x
0
, x
1
, . . . , x
n
hace que max
x
[
n
(x)[ sea
mnimo?.
5
Y contraintuitivamente. Como entender si no que dos funciones regulares que coincidan en un n umero
cada vez mayor de puntos no acaben siendo muy similares?
6
Matematico aleman de nales del siglo XIX. Tambien es conocido por ser codesarrollador del Metodo
Runge-Kutta para la resolucion de problemas de valor inicial.
7

Este fue el siglo de la fundamentacion de las Matematicas. Se probo que multitud de resultados que se
tenan como evidentes eran falsos y fue necesario reconstruir las Matematicas desde su base. Por ejemplo,
en el mismo siglo se mostro la existencia de funciones no continuas en ning un punto, de funciones continuas
pero no derivables en ning un punto, as como de funciones con un n umero innito de maximos y mnimos
locales. Tambien se construyeron curvas que rellenaban el plano, curvas cerradas que englobando una area
nita tenan una longitud innita (fractales)... Algunas de estas construcciones, originarias esencialmente
en las Matematicas puras han encontrado en el siglo XX aplicaciones a problemas de ndole esencialmente
practico.
8
Un problema min-max: minimizar un maximo.
249
B
o
r
r
a
d
o
r
11.1 Interpolacion polinomica LECCI

ON V
-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1
-4
-3
-2
-1
0
1
2
3
4
Error
1./(1+25.*x.
2
)
polinomio de grado 5
polinomio de grado 10
polinomio de grado 15
polinomio de grado 20
polinomio de grado 5
polinomio de grado 10
polinomio de grado 15
polinomio de grado 20
Figura 11.4: Ejemplo de Runge. Polinomio de interpolacion y error cometido.

Este es un problema clasico que fue resuelto por Pafnuty Lvovich Chebyshev
9
en
terminos de una familia de polinomios conocidos como polinomios de Chebyshev de primer
tipo.
Para un intervalo arbitrario [a, b], la disposicion de los n + 1 puntos de interpolacion
que minimizan el max
x[a,b]
[w
n
(x)[ es la dada por los puntos
x
k
:=
a +b
2
+
b a
2
cos
_

2n + 2
+
k
n + 1
_
, k = 0, . . . , n. (11.11)
Es facil comprobar que la distribucion de puntos no es en medida alguna uniforme sino
que tiende a concentrar puntos en los extremos.
La eleccion de estos puntos para la interpolacion no asegura la convergencia del
polinomio pero s permite controlar mejor uno de los terminos que mas rapido pueden
crecer con n, con lo que en la practica se traduce en mejores resultados
10
. De hecho con
esta elecci on,
max
x[a,b]
[
n
(x)[ =
1
2
n
9
Matematico ruso del siglo XIX. Estos polinomios surgieron en sus estudios en aproximacion de fun-
ciones por polinomios. Chebyshev hizo tambien importantes contribuciones en Teora de la Probabilidad.
10
Dicho de otra manera, es mas difcil dar con un ejemplo para el que esta disposicion de nodos de un
polinomio interpolante que no converja a la funcion original.
250
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 11. Interpolacion. Curvas Bezier


de forma que
n
(x) 0 cuando n (ademas esta convergencia es rapida). En la
Figura 11.5 observamos como ahora el polinomio interpolante para el ejemplo de Runge
converge a la funcion.
-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1
-4
-3
-2
-1
0
1
2
3
4
Error
1./(1+25.*x.
2
)
polinomio de grado 5
polinomio de grado 10
polinomio de grado 15
polinomio de grado 20
polinomio de grado 5
polinomio de grado 10
polinomio de grado 15
polinomio de grado 20
Figura 11.5: Ejemplo de Runge con otros nodos.
Ejercicio 11.9 Elege un intervalo arbitrario [a, b] y crea un chero script que muestre la
disposicion de los puntos dados por (11.11). Dibuja los puntos obtenidos para diferentes
valores de n. Dibuja tambien el polinomio
n
(x). A que funcion te recuerda?.
Ejercicio 11.10 (teorico) Se trata de probar una serie de propiedades de las diferencias
divididas de las que nalmente se deduce la estimacion del error del polinomio de interpolacion
dada en (11.10).
(1) Prueba que f
(j)
(x) p
(j)
(x) se anula en n + 1 j puntos para j = 0, . . . , n + 1.
(2) Utilizando (1), prueba que existe tal que
f[x
0
, . . . , x
n
] =
f
(n)
()
n!
.
(3) Fijemos y [a, b]. Entonces
f(x) = p
n
(y) +f[x
0
, . . . , x
n
, y](x x
0
)(x x
1
) (x x
n
).
Utiliza ahora (2) para probar la estimacion del error dada en (11.10).
251
B
o
r
r
a
d
o
r
11.2 Extensiones adicionales LECCI

ON V
(Ayuda: El Teorema de Rolle establece que si g es derivable en [a, b] con g(a) = g(b) entonces
existe c (a, b) tal que
g

(c) = 0.
Aplicando este resultado, concluimos que existe
j
(x
j
, x
j+1
) (j = 0, . . . , n 1) tal que
f

(
j
) p

(
j
) = 0.
Se puede aplicar el mismo resultado para probar que existen n 2 puntos tales que f

(
j
) =
p

(
j
) y as sucesivamente.)
11.2. Extensiones adicionales
11.2.1. Interpolacion de Hermite
La interpolacion de Hermite incorpora las derivadas como datos adicionales. Concre-
tamente, partimos de este conjunto de datos
_

_
(x
0
, f(x
0
)), . . . , (x
0
, f
(m
0
)
(x
0
))
(x
1
, f(x
1
)), . . . , (x
1
, f
(m
1
)
(x
1
))
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
(x
n
, f(x
n
)), . . . , (x
n
, f
(m
n
)
(x
n
))
Observa que estamos asumiendo que no hay huecos en los datos. Esto, si por ejemplo la
derivada de orden 2 es dato, tambien lo es el valor de la funcion y su primera derivada.
El n umero total de datos es
N := (m
0
+ 1) + (m
1
+ 1) + + (m
n
+ 1),
por lo que el polinomio debera tener grado N 1.
El analisis de este problema no tiene mayor dicultad que el ya realizado para la inter-
polacion polinomica de Lagrange. La clave esta en la fuerte relacion entre diferencias divi-
didas y derivada, mostrada en el Ejercicio 11.10. As, se hace la siguiente interpretacion:
f[ x
k
, . . . , x
k
. .
m + 1 veces
] := f
(m)
(x
k
).
La idea es ordenar los nodos y tomarlos repetidos seg un el n umero de datos que consid-
eramos en cada punto de forma que tomaremos los N nodos
x
0
, x
0
, . . . , x
0
. .
m
0
+1
, x
1
, x
1
, . . . , x
1
. .
m
1
+1
, . . . , x
n
, x
n
, . . . , x
n
. .
m
n
+1
.
Las diferencias divididas se denen de nuevo de forma recursiva
f[x
i
, x
i+1
, . . . , x
i+m
] :=
_

_
f
(m)
(x
i
)
m!
, si x
i
= x
i+m
,
f[x
i
, x
1
, . . . , x
i+m1
] f[x
i+1
, x
1
, . . . , x
i+m
]
x
i
x
m
, en otro caso,
252
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 11. Interpolacion. Curvas Bezier


y el polinomio de interpolacion se construye exactamente como antes, es decir, utilizando
la formula (11.8) con las nuevas deniciones de los nodos y de las diferencias divididas.
El calculo de las diferencias y la evaluacion del polinomio en un punto en el caso de
la interpolacion de Hermite puede describirse en lenguaje de pseudocodigo de la siguiente
forma:
Diferencias divididas para la interpolacion Hermite
01 x
0
, y
0
datos
02 n = length(x
0
) 1
03 D = y
0
;
04 for j=1:n
05 for i=n:-1:j
06 if x
0
(i) == x
0
(i j)
07 D(i) = D(i)/j
08 else
09 D(i) =
D(i) D(i 1)
x
0
(i) x
0
(i j)
10 end
11 end
12 end
13
14 % Evaluacion del polinomio
15 y=D(n);
16 for i=n-1:-1:0
17 y = (x x
0
(i)) y + D(i)
18 end
En este algoritmo la tabla de diferencias divididas se almacena de forma compacta,
como se sugirio en el Ejercicio 11.5. Observa que desde el punto de vista computacional
las diferencias con respecto a la interpolacion de Lagrange son mnimas.
Ejercicio 11.11 Entiende bien el algoritmo anterior. Implementa la interpolacion de Hermite
seg un el siguiente prototipo
01 HERMITEP
02
03 Y=HERMITEP(X0,Y0) Devuelve en Y el polinomio de interpolacion de
04 Hermite X0 debe estar ordenados. Los nodos
05 repetidos se interpretan como derivadas sucesivas
06 en ese punto
07
08 Y=HERMITE(X0,Y0,X) Devuelve en Y la evaluacion del polinomio en X
Observa que, una vez implementada esta funcion,
>> x0=[0 0 0 0 0 0]; y0=[1 1 1 1 1 1];
>> p=hermitep(x0,y0)
253
B
o
r
r
a
d
o
r
11.2 Extensiones adicionales LECCI

ON V
devuelve de hecho el polinomio de Taylor de orden 5 de f(x) = exp(x) en el cero. La
orden
>> simple(hermitep(x0,y0))
hace mas evidente esta identidad.
11.2.2. Interpolacion de funciones periodicas
Si una funcion es periodica es natural reemplazar en el problema de interpolacion los
polinomios por funciones periodicas sencillas con el mismo periodo. Por simplicar, vamos
a suponer que estamos considerando unicamente funciones 2periodicas, aunque las ideas
que a continuacion expondremos se extienden facilmente a funciones con cualquier periodo.
Concretamente, si se trata de funciones 2periodicas podemos utilizar
sen(nx), cos(nx), n N 0
para interpolarlas, o bien,
exp(inx), n Z.
Ambas son equivalentes, como ya vimos en la Leccion 3 con la FFT, pero la utilizacion
de exponenciales complejas facilita tanto el analisis como la manipulacion as como la
extension de la interpolacion a funciones complejas
Supongamos que tomamos un n umero impar 2n+1 de puntos de interpolacion equidis-
tantes:
x
k
=
2k
2n + 1
, k = 0, . . . , 2n.
El problema queda as denido: calcular
p
2n+1
(x) :=
n

j=n

j
exp(ijx)
tal que
y
k
= p
2n+1
(x
k
) =
n

j=n

j
exp
_
2ijk
2n + 1
_
.
La resolucion de este problema se puede llevar a cabo con la transformada de Fourier
Discreta, y por tanto es aplicable la FFT.
Ejercicio 11.12 Comprueba que efectivamente se reduce todo a una transforma de Fourier
discreta.
(Ayuda: Observa que
exp
_

2ijk
2n + 1
_
= exp
_
2i(2n + 1 j)k
2n + 1
_
.
Por tanto el problema es equivalente a encontrar
j
tales que
y
k
= p
2n+1
(x
k
) =
n

j=0

j
exp
_
2ijk
2n + 1
_
+
2n

j=n+1

2n+1j
exp
_
2ijk
2n + 1
_
.
_
Ejercicio 11.13 Que pasa si se toma un n umero par de puntos de interpolacion?
254
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 11. Interpolacion. Curvas Bezier


Nota. El interpolante converge a la funcion bajo hipotesis mucho mas debiles que en
el caso no periodico. Por ejemplo, basta con que la funcion tenga derivada continua. No
existen por tanto fenomenos como el de Runge para funciones periodicas con condiciones
mnimas de regularidad.
11.2.3. Interpolacion polinomica a trozos
Los polinomios tienen un importante inconveniente que desaconseja su utilizacion para
la interpolacion en un n umero elevado de puntos. La Figura 11.6 ilustra esta problematica
con un problema de interpolacion para el que el polinomio correspondiente exhibe un com-
portamiento ciertamente irracional. Ello se debe a que se obliga a que el polinomio sea
practicamente constante en dos zonas con un salto en medio. El polinomio es excesiva-
mente rgido
11
que en ultima medida provoca que este se rompa.
0 0.2 0.4 0.6 0.8 1
-0.5
0
0.5
1
1.5
2
Figura 11.6: Rigidez polinomica
Como forma de solventar estos problemas se opta por utilizar elementos mas compli-
cados pero que sean mas exibles.
Uno de los elementos mas populares son los splines. Un spline
12
es una funcion
polinomica a trozos que cuenta con cierta regularidad. Es decir, diferentes polinomios
sobre diferentes subintervalos se unen exigiendo ademas que la funcion resultante sea con-
tinua y derivable hasta cierto orden. Los representantes mas sencillos son las constantes a
11
Es un smil con lo que sucede si se dobla una vara muy rgida. El problema al utilizar polinomios es
que basta modicar un solo dato para que el polinomio se cambie en todo el dominio, en muchas ocasiones
sin ning un control. Sin embargo, en un interpolante uno debera esperar que la modicacion de un punto
afectara solo al entorno de dicho punto.
12
aceptaremos el anglicismo a partir de ahora.
255
B
o
r
r
a
d
o
r
11.2 Extensiones adicionales LECCI

ON V
trozos y las poligonales. En este ultimo caso, se trata sencillamente de unir los puntos por
segmentos obteniendose una curva poligonal. Sin embargo para las constantes a trozos no
podemos exigir continuidad y para las poligonales no podemos exigir derivabilidad en los
puntos de contacto (tiene picos).
Los splines c ubicos son probablemente los mas utilizados. Partiendo de una subdivision
del intervalo a = x
0
< x
1
< < x
n
= b, se trata de construir una funcion s
n
tal que
s
n
(x)[
[x
i
,x
i+1
]
P
3
, i = 0, . . . , n 1,
es decir, sea un polinomio de grado tres en cada subintervalo, cumpliendo que
s
n
(x
i
) = y
i
, , i = 0, . . . , n,
esto es, que tome unos valores prejados en los puntos de interpolacion y de modo que
tanto la funcion s
n
como sus derivadas primera y segunda sean continuas
13
en todo el
intervalo [a, b]. Por tanto tenemos que exigir que
lm
xx
+
j
s
(j)
n
(x) = lm
xx

j
s
(j)
n
(x), j = 0, 1, 2.
La continuidad de la primera derivada preserva la existencia de recta tangente (no hay
picos) y por tanto la velocidad de recorrido de la curva, mientras que con la continuidad
de la derivada segunda garantizamos que curvatura de la curva sea tambien continua en
todo el dominio de denicion.
Dado que tenemos n subintervalos, y cuatro parametros sobre cada intervalo (s
n
es un
polinomio de grado 3 en cada intervalo), disponemos de 4n variables. Por contra, los datos
de interpolacion jan n + 1 restricciones y las condiciones de continuidad del spline y de
sus dos primeras derivadas en las interfaces de los subintervalos dan otras 3n condiciones.
En total tenemos
n + 1 + 3(n 1) = 4n 2
restricciones, por lo que el problema precisa jar dos condiciones adicionales para poder
hablar, siquiera plantear, la unicidad del spline.
Estas son algunas de las elecciones habituales
s

n
(x
0
) = s

n
(x
n
) = 0, spline natural.
Datos adicionales s

n
(x
0
) = y
1
, s

n
(x
n
) = y
n+1
, spline grapado.
Condiciones de periodicidad: si los datos son periodicos se puede imponer s

n
(x
0
) =
s

n
(x
n
), s

n
(x
0
) = s

n
(x
n
), spline periodico.
No nos detendremos a detallar como se prueba la existencia y unicidad de tales splines,
ni la forma de calcularlos. Baste decir que se recurre a tecnicas mas ecientes, y por tanto
complejas, que la forma directa que se deduce de su denicion.
Entre las buenas propiedades de los splines destacamos que convergen a la funcion si
esta es continua. A un es mas, si la funcion f que se interpola es regular (de hecho basta
con que su derivada cuarta sea continua)
max
x
[s
n
(x) f(x)[ C max
j
(x
j+1
x
j
)
4
con C una constante dependiente de f pero independiente de los puntos.
13
Si forzaramos la continuidad de la tercera derivada tendramos globalmente un polinomio de grado
tres.
256
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 11. Interpolacion. Curvas Bezier


Nota. Los splines tienen un origen muy natural. Exista una herramienta de dibujo,
ya anticuada, que reciba el nombre de spline, o trazador en castellano. Consista en
una especie de regla hecha de un material exible que se moldeaba para hacer coincidir
el trazado por una serie de puntos. La curva as trazada es fsicamente equivalente a
resolver el problema de construir una curva que pase por una serie de puntos y que
minimice la energa elastica. La solucion matematica a este problema es un spline natural
(polinomio c ubico a trozos con derivada segunda nula en los extremos) lo que justica su
denominacion.
Se pueden denir splines de mayor grado, siguiendo exactamente la idea anterior, esto
es, pegando polinomios a trozos y dando la mayor regularidad posible.
Splines en Matlab
Matlab dispone de dos comandos encargados de esta tarea:
ppval spline
El primero (piecewise polynomial value) eval ua una funcion polinomica a trozos. Uno
de sus argumentos es la propia estructura de la funcion seg un una sintaxis propia de
Matlab. La segunda instruccion devuelve una estructura de este tipo que contiene el spline
que interpola a datos.
A modo de ejemplo, he aqu el spline natural que interpola a los datos desplegados en
la Figura 11.7
14
>> x0=linspace(0,1,21);
>> y0=[zeros(1,6) ones(1,15)];
>> p1=spline(x0,y0); % spline natural
>> x=linspace(0,1,200);
>> h=plot(x0,y0,o,x,ppval(p1,x),r,linewidth,2);
Por otro lado Matlab tiene implementada una serie de funciones para trabajar con
splines mas generales en una toolbox. Al ejecutar splinetool podemos acceder a un
entorno graco donde testar las capacidades de Matlab en este campo.
Ejercicio 11.14 Se plantea el siguiente problema: dada una serie de puntos en el plano
_
(x
0
, y
0
), (x
1
, y
1
), . . . , (x
n
, y
n
)
_
construir una curva en parametricas
x(t) := (x(t), y(t)), t [0, T] (11.12)
tal que
x(t
j
) = (x
j
, y
j
). (11.13)
Una buena eleccion es utilizar splines. Para ello se trata de calcular dos splines cx(t) y cy(t)
que satisfagan, obviamente,
cx(t
j
) = x
j
, cy(t
j
) = y
j
.
14
Los splines siguen conservando cierta rigidez pero se adaptan mucho mejor a los datos.
257
B
o
r
r
a
d
o
r
11.2 Extensiones adicionales LECCI

ON V
0 0.2 0.4 0.6 0.8 1
-0.2
0
0.2
0.4
0.6
0.8
1
1.2
Figura 11.7: Interpolacion con splines c ubicos naturales
Tenemos as dos problemas de interpolacion desacoplados, esto es, cada uno se resuelve in-
dependiente del otro. Queda como cuestion pendiente la eleccion de T en (11.12) y de los
puntos t
j
en (11.13). Una buena eleccion es tomar
h
j
:=
_
(x
j+1
x
j
)
2
+ (y
j+1
y
j
)
2
,
que coincide con la longitud del segmento que une (x
j
, y
j
) y (x
j+1
, y
j+1
), y hacer luego
t
0
= 0, t
k
:= h
0
+h
1
+. . . +h
k1
, T = t
n
.
Una vez ya calculados, la curva se dibuja evaluando
x(t) := (cx(t), cy(t)), t [0, T].
Implementa un programa que siga este prototipo
01 SPLINE2D
02
03 SPLINE2D(X,Y) Traza una curva en el plano que pasa por
04 (X(i),Y(i)) utilizando splines cubicos
05
Ejercicio 11.15 El comando ginput permite introducir los puntos a traves del raton. Lee
bien la ayuda y modica el programa anterior para que haga posible la lectura de los datos
con el raton en caso de que se llame a la funcion sin argumentos.
Entre las posibilidades que ofrece esta la de controlar que tecla o boton del raton se ha
utilizado.
258
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 11. Interpolacion. Curvas Bezier


Ayuda. Deduce que realiza el siguiente codigo...
x0=[]; y0=[]; n=length(x0);
salir=0;
cla
xlim([0,1]); ylim([0,1])
while salir==0
[xi,yi,b]=ginput(1);
if b==3 % boton derecho del raton
cla
if n>0 % borramos el ultimo punto
x0(n)=[]; y0(n)=[];
plot(x0,y0,ro)
xlim([0,1]); ylim([0,1])
n=n-1;
end
elseif isempty(b) % Se ha pulsado return: finalizamos lectura
salir=1;
elseif b==2 % boton central: finalizamos la lectura
salir=1
else % introducimos el punto
x0=[x0 xi]; y0=[y0 yi];
plot(x0,y0,o)
n=n+1;
axis([0 1 0 1])
end
end
Nota. El comando gtext es similar a ginput. Despliega un texto en el punto selec-
cionado con el raton.
11.3. Curvas Bezier
Las curvas Bezier son curvas en el plano que quedan determinadas por un conjunto
de puntos que marcan su recorrido, aunque estas curvas no pasan necesariamente por
todos los puntos.

Estos forman un polgono de control en el siguiente sentido: la curva
esta contenida en el polgono formado por esos puntos e imita con cierta libertad la
poligonal que dibujan.
La curva se construye utilizando los polinomios de Bernstein de orden n:
B
n
j
(t) =
_
n
j
_
t
j
(1 t)
nj
, j = 0, 1, . . . , n.
Es un simple ejercicio comprobar que los polinomios cumplen las siguientes propiedades:
B
n
j

n
j=0
son una base de P
n
. Dicho de otra forma, cualquier polinomio se puede
escribir como una combinacion de estos polinomios.
259
B
o
r
r
a
d
o
r
11.3 Curvas Bezier LECCI

ON V
n

j=0
B
n
j
(t) = 1, t R.
A partir de unos puntos
x
i
= (x
i
, y
i
), con i = 0, . . . , n,
se construye ahora la curva de Bezier utilizando estos polinomios:
S(t) :=
n

j=0
B
n
j
(t)x
j
=
_
n

j=0
B
n
j
(t)x
j
,
n

j=0
B
n
j
(t)y
j
_
, t [0, 1].
El parametro t se mueve de forma que para t = 0 estamos en el punto inicial y para t = 1,
en el nal. Notese que los puntos utilizados para dibujar la curva estan ordenados: hay
un punto inicial x
0
, uno nal x
n
y a x
j
le sigue x
j+1
...
Podemos comprobar (vease la Figura 11.8), que la curva se adapta a la forma que mar-
can los puntos. Sin embargo, unicamente podemos garantizar que esta curva pasara por
el primer y ultimo punto ya que S(0) = x
0
y S(1) = x
n
pero en general S(t) ,= x
j
para
j ,= 0, n.
0 0.2 0.4 0.6 0.8 1
0
0.2
0.4
0.6
0.8
1
0 0.2 0.4 0.6 0.8 1
0
0.2
0.4
0.6
0.8
1
0 0.2 0.4 0.6 0.8 1
0
0.2
0.4
0.6
0.8
1
0 0.2 0.4 0.6 0.8 1
0
0.2
0.4
0.6
0.8
1
Figura 11.8: Curvas Bezier para algunas conguraciones de puntos.
260
B
o
r
r
a
d
o
r
LECCI

ON V Cap

tulo 11. Interpolacion. Curvas Bezier


Ejercicio 11.16 Utilizando el codigo mostrado en el Ejercicio 11.15, programa las curvas
Bezier. Compara con las curvas que denen la interpolacion por splines y la polinomica.
Ejercicio 11.17 Implementa la siguiente extension del programa anterior: permitir que el
usuario seleccione puntos y pueda moverlos o borrarlos (por ejemplo, con el boton derecho del
raton) y as comprobar la sensibilidad de la curva al polgono de control.
Una sugerencia: una vez ledos los puntos, y dibujada la correspondiente curva nos situamos
de nuevo en la ventana graca con ginput y leemos la seleccion hecha por el raton. Ahora
hay tres opciones
Si pulsamos cerca de un punto, entendemos que hemos seleccionado dicho punto.
Si se ha pulsado con el boton derecho lo eliminamos del dibujo, redibujamos la
curva y esperamos de nuevo.
Si pulsamos cerca de un punto con el boton izquierdo entendemos que vamos a
mover ese punto. Esperamos otra seleccion del raton (otro ginput), reemplazamos
el punto seleccionado por el nuevo y redibujamos.
Si pulsamos lejos de todos los puntos, entendemos que a nadimos un nuevo punto.
Llamemoslo y. En este punto hay un tema no trivial: como ordenamos el nuevo punto
y respecto a los puntos anteriores x
j
.
y
x
x
j+1
j

x
j+2
j
Figura 11.9: Ordenacion de nodos para la curva Bezier.
Una forma de determinar
15
este orden es medir el angulo entre los vectores
u =

x
j
y, v =

x
j+1
y
y quedarse con aquel para el que angulo
j
sea mayor (vease la Figura 11.9). Para ello,
basta utilizar que
[ cos(
j
)[ =
[u v[
|u||v|
.
15
Gracias a Jon Garca por sugerirnos esta solucion.
261
B
o
r
r
a
d
o
r
11.3 Curvas Bezier LECCI

ON V
Escogeremos entonces j para que [ cos(
j
)[ sea mnimo, y construiremos la curva Bezier
con puntos
x
1
, . . . , x
j
, y, x
j+1
, . . . , x
n

x
j
, x
j+1
.
Nota. Las curvas Bezier fueron introducidas por los ingenieros Pierre Bezier y Paul
de Casteljau, que trabajaban entonces en Renault y Citroen. Concretamente, buscaban
herramientas para el dise no de parachoques de forma que la curva que diera su forma
fuera controlada por una serie de puntos y que tuviera buenas propiedades geometric-
as. Los algoritmos iniciales (todava se utilizan en la practica hoy en da) seguan ideas
muy geometricas
16
, y se tardo alg un tiempo en darle la forma que hemos mostrado, mas
matematica. Como resultado de este estudio surgieron las curvas B-spline, que reemplaz-
aban a los polinomios de Bernstein por splines de grados adecuados. Las curvas B-spline
son mas exibles que las curvas Bezier y en su caso lmite incluyen a estas. Por lo tanto
pueden interpretarse como una generalizacion de las mismas.
Por otro lado existen formas mucho mas ecientes de evaluar y calcular este tipo de
curvas que permiten en ultima media su implementacion en una forma mas interactiva,
de forma que el usuario mueva los puntos (cambie el polgono de control) y que la curva
se redibuje constantemente.
16
La version original ni siquiera hablaba de polinomios.
262
B
o
r
r
a
d
o
r
Bibliografa
[1] Atkinson, K. (1993): Elementary Numerical Analysis. Wiley.
[2] Burden, R.L. y Faires, J.D. (1998): Analisis Numerico. International THOMSON.
[3] Chapman, S.J. (1997): Fortran 90/95 for Scientists and Engineers. McGraw-Hill.
[4] Chapman, S.J. (2002): Matlab Programming for Engineers. Books/Cole.
[5] Cooper, J. (2001): A Matlab Companion for Multivariate Calculus.Academic Press.
[6] Eriksson, K.E., Step, D. y Johnson, C. (2004): Applied Mathematics: body and soul.
Springer Verlag.
[7] Garca de Jalon, J. (2004): Aprenda Matlab 6.5 como si estuviera en primero.
Publicacion electronica, disponible en
http://mat21.etsii.upm.es/ayudainf/aprendainf/varios.htm
[8] Gander, W. y Hrebcek, J. (2004): Solving problems in Scientic Computing using
Maple and Matlab. SpringerVerlag.
[9] Golub, G.H. y van Loan, C.F. (1989): Matrix Computations. University Press.
[10] Golub, G.H. y van der Vorst, H. (2000): Eigenvalue computation in the 20th centu-
ry en J. Comput. Appl. Math. 123 (2000), 3565.
[11] Greenbaum, A. (1997): Iterative Methods for Linear Systems. SIAM.
[12] Hanmerlin, G. y Homann, K.H. (1991): Numerical Mathematics. SpringerVerlag.
[13] Hanselman, D. y Littleeld, B.R. (2000): Mastering Matlab 6. Prentice Hall.
[14] Higham, D.J. y Higham, N.J. (2005): Matlab guide. SIAM.
[15] Homan, J., Johnson, C. y Logg, A. (2004): Dreams of Calculus. Springer.
[16] Infante, J.A. y Rey, J.M. (2002): Metodos numericos. Teora, problemas y practicas
con Matlab. Anaya.
[17] Kharab, A. y Guenther, R.B. (2001): An Introduction to Numerical Methods: A MAT-
LAB Approach. Chapman & Hall.
[18] Kincaid, D. y Cheney, W. (1994): Analisis numerico. Las matematicas del calculo
cientco. AddisonWesley Iberoamericana.
B
o
r
r
a
d
o
r
[19] Kress, R. (1988): Numerical Analysis. Springer Verlag.
[20] The MacTutor History of Mathematics archive, University of St. Andrew,
http://turnbull.mcs.st-and.ac.uk/ history/.
[21] Marchand, P. y Holland, T.O. (2003): Graphics and GUIs with Matlab, tercera edi-
cion. Chapman & Hall/CRC.
[22] Maron, M.J. (1987): Numerical Analysis. A practical approach. Macmillan.
[23] Mathews, J.H. y Fink, K.(2000): Metodos Numericos con Matlab. Prentice Hall.
[24] Mathworks, http://www.mathworks.com/products/.
[25] Meurant, G. (1999): Computer solution of Large Linear systems. North Holland.
[26] Moler, C. (2004): Numerical computing with Matlab. SIAM.
[27] Palm, W.J. (2004): Introduction to Matlab 7 for engineers. McGraw-Hill.
[28] Quarteroni, A., Sacco, R. y Salery, F. (2000): Numerical Mathematics. Springer.
[29] Quarteroni, A. y Salery, F. (2003): Scientic computing with Matlab. Springer.
[30] Wikipedia: the free enciclopedy, http://www.wikipedia.org.
[31] Saasd, Y. y van der Vorst, H.A. (2000): Iterative solution of linear systems in the
20th century en J. Comput. Appl. Math., 123, 1-33 (2000).
[32] Stewart, G.W. (1996): Afternotes in Numerical Analysis. SIAM.
[33] Stewart, G.W. (2001):Matrix Algorithms: Vol. I. Basic decompositions. SIAM.
[34] S uli, E. y Mayers, D. (2003): An Introduction to Numerical Analysis. Cambridge
University Press.
264
B
o
r
r
a
d
o
r

Indice de guras
2.1. Pantalla Principal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2. Pantalla de ayuda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3. Ayuda con helpwin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4. Ayuda on line. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.1. Diagrama de un matriz sparse . . . . . . . . . . . . . . . . . . . . . . . . 64
5.1. Resultado de reordenar las las y columnas con symrcm y symmmd. . . . . 73
5.2. Eliminacion gaussiana y su representacion como un grafo. . . . . . . . . . 75
5.3. Historial del residuo para el metodo del Gradiente. . . . . . . . . . . . . . 93
5.4. Historial del residuo para el metodo del Gradiente Conjugado . . . . . . . 98
5.5. Efecto del en el Gradiente Conjugado. . . . . . . . . . . . . . . . . . . . . 103
7.1. Reglas de cuadratura: punto medio y trapecio . . . . . . . . . . . . . . . 116
7.2. Regla de Simpson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
7.3. Diagrama del metodo de Romberg . . . . . . . . . . . . . . . . . . . . . . 128
7.4. Integracion adaptativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
7.5. Integracion adaptativa de

x . . . . . . . . . . . . . . . . . . . . . . . . 133
7.6. Primeras exponenciales trigonometricas. . . . . . . . . . . . . . . . . . . . 136
7.7. Coecientes de Fourier y transformada discreta de Fourier . . . . . . . . . 143
7.8. Ruido y su Transformada de Fourier Discreta . . . . . . . . . . . . . . . . 144
7.9. Filtrado del ruido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
9.1. Profile aplicado al metodo de Jacobi. . . . . . . . . . . . . . . . . . . . 184
9.2. Una web muy sencilla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
10.1. Ventana graca. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
10.2. Ventana graca. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
10.3. Edicion de un dibujo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
10.4. Una muestra de dibujos. . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
10.5. Modicacion del entorno del dibujo. . . . . . . . . . . . . . . . . . . . . . 218
10.6. Ejemplo de numeracion con subplot. . . . . . . . . . . . . . . . . . . . . 219
10.7. Disposicion simultanea de gracas con subplot. . . . . . . . . . . . . . . 221
10.8. Un dibujo en 3D con plot3. . . . . . . . . . . . . . . . . . . . . . . . . . 222
10.9. Icono para rotar los dibujos. . . . . . . . . . . . . . . . . . . . . . . . . . 223
10.10. Ejemplo de una supercie creada con surf. . . . . . . . . . . . . . . . . . 224
10.11. Otro ejemplo de surf. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
265
B
o
r
r
a
d
o
r
10.12. Utilizacion de nan en un dibujo. . . . . . . . . . . . . . . . . . . . . . . . 226
10.13. Algunas opciones con surf. . . . . . . . . . . . . . . . . . . . . . . . . . 228
10.14. Esferas en 3D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
10.15. Una supercie con surf y pcolor. . . . . . . . . . . . . . . . . . . . . . . 231
10.16. Lneas de nivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
10.17. Campo de velocidades con quiver . . . . . . . . . . . . . . . . . . . . . . 233
10.18. Triangulacion no conforme. . . . . . . . . . . . . . . . . . . . . . . . . . . 235
10.19. Numeracion de triangulos . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
10.20. Un dominio mallado en triangulos. . . . . . . . . . . . . . . . . . . . . . . 237
11.1. Dos formas de escribir y evaluar un polinomio. . . . . . . . . . . . . . . . 240
11.2. Polinomios de interpolacion con diferentes grados y el error cometido. . . 243
11.3. Estructura del calculo de las diferencias dividas. . . . . . . . . . . . . . . 246
11.4. Ejemplo de Runge. Polinomio de interpolacion y error cometido. . . . . . 250
11.5. Ejemplo de Runge con otros nodos. . . . . . . . . . . . . . . . . . . . . . 251
11.6. Rigidez polinomica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
11.7. Interpolacion con splines c ubicos naturales . . . . . . . . . . . . . . . . . 258
11.8. Curvas Bezier para algunas conguraciones de puntos. . . . . . . . . . . . 260
11.9. Ordenacion de nodos para la curva Bezier. . . . . . . . . . . . . . . . . . 261
266
B
o
r
r
a
d
o
r

Indice general
1. Introduccion 1
1.1. Que es? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Como trabaja? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3. Como aprenderemos? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
I Primeros pasos en Matlab.
Metodos directos para sistemas de ecuaciones lineales 5
2. Matlab: Primeros pasos 9
2.1. Entorno de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2. Comandos de ayuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4. Ficheros script y funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.1. Ficheros script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.2. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.5. Vectores y matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.5.1. Denicion de matrices y vectores . . . . . . . . . . . . . . . . . . . 22
2.5.2. Operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.5.3. Detalles adicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5.4. Acceso a partes de matrices . . . . . . . . . . . . . . . . . . . . . . 27
2.6. Bucles y estructuras de decision . . . . . . . . . . . . . . . . . . . . . . . . 30
2.6.1. Bucles: el comando for . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.6.2. Operadores logicos y estructuras de decision . . . . . . . . . . . . . 31
3. Metodos directos para sistemas de ecuaciones lineales 37
3.1. Metodo de Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.1.1. Metodo de Gauss sin pivotaje . . . . . . . . . . . . . . . . . . . . . 38
3.1.2. Metodo de Gauss con pivotaje parcial . . . . . . . . . . . . . . . . . 41
3.1.3. Metodo de Gauss con pivotaje parcial cticio . . . . . . . . . . . . 43
3.2. Descomposiciones matriciales . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2.1. Descomposicion LU . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2.2. Casos particulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.2.3. Comandos correspondientes en Matlab . . . . . . . . . . . . . . . . 48
267
B
o
r
r
a
d
o
r
II Programacion Avanzada. Metodos iterativos 51
4. Matlab: programacion avanzada 55
4.1. Retorno a las matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.1.1. Acceso a partes estructuradas de una matriz . . . . . . . . . . . . . 55
4.1.2. Mas operaciones sobre matrices . . . . . . . . . . . . . . . . . . . . 60
4.1.3. Matrices sparse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.2. Argumentos de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5. Matrices sparse en Matematicas. Metodos iterativos 71
5.1. Metodo de Gauss para matrices sparse . . . . . . . . . . . . . . . . . . . . 71
5.2. Metodos iterativos para sistemas lineales . . . . . . . . . . . . . . . . . . . 76
5.2.1. Denicion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.2.2. Detalles sobre la implementacion . . . . . . . . . . . . . . . . . . . 78
5.2.3. Metodos iterativos clasicos . . . . . . . . . . . . . . . . . . . . . . . 79
5.2.4. Metodos de tipo gradiente . . . . . . . . . . . . . . . . . . . . . . . 88
III Funciones como argumento. Recursividad
Formulas de cuadratura. FFT 105
6. Matlab: Funciones como argumentos. Recursividad 109
6.1. Funciones inline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
6.2. Funciones como argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . 111
6.2.1. Recursividad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7. Formulas de cuadratura. FFT 115
7.1. Formulas de cuadratura . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
7.1.1. Primeras nociones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
7.1.2. Reglas simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
7.1.3. Retorno a las reglas compuestas . . . . . . . . . . . . . . . . . . . . 122
7.1.4. Reglas gaussianas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
7.1.5. Extrapolacion de Richardson . . . . . . . . . . . . . . . . . . . . . . 126
7.1.6. Integracion adaptativa . . . . . . . . . . . . . . . . . . . . . . . . . 129
7.2. Transformada rapida de Fourier . . . . . . . . . . . . . . . . . . . . . . . . 134
7.2.1. Transformada de Fourier discreta . . . . . . . . . . . . . . . . . . . 135
7.2.2. Calculo de la transformada de Fourier Discreta . . . . . . . . . . . . 140
7.2.3. Aplicaciones a la eliminacion de ruido . . . . . . . . . . . . . . . . . 142
7.2.4. Transformada rapida de Fourier . . . . . . . . . . . . . . . . . . . . 144
IV Calculo simbolico, arrays y celdas en Matlab. Valores y
vectores propios. Google. 153
8. Matlab: Calculo simbolico y estructuras de datos. 157
8.1. Polinomios y calculo simbolico . . . . . . . . . . . . . . . . . . . . . . . . . 157
8.1.1. Polinomios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
268
B
o
r
r
a
d
o
r
8.2. Procesador simbolico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
8.3. Tensores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
8.4. Vectores de celdas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
9. Calculo numerico de valores y vectores propios. 171
9.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
9.2. Matrices semejantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
9.3. Metodo de potencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
9.3.1. Descripcion del metodo . . . . . . . . . . . . . . . . . . . . . . . . . 174
9.3.2. Variantes del metodo de potencias . . . . . . . . . . . . . . . . . . . 178
9.4. Metodo de Jacobi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
9.4.1. Descripcion del metodo . . . . . . . . . . . . . . . . . . . . . . . . . 179
9.4.2. Variantes del metodo de Jacobi . . . . . . . . . . . . . . . . . . . . 183
9.5. Metodo QR de Francis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
9.5.1. Factorizacion QR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
9.5.2. Metodo QR de Francis . . . . . . . . . . . . . . . . . . . . . . . . . 192
9.5.3. Comentarios adicionales . . . . . . . . . . . . . . . . . . . . . . . . 193
9.6. Valores y vectores propios en Matlab . . . . . . . . . . . . . . . . . . . . . 195
9.7. Notas historicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
9.8. Google . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
V Salidas gracas en Matlab. Interpolacion 203
10.Matlab: Salidas gracas en Matlab 207
10.1. Dibujos bidimensionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
10.1.1. El comando plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
10.1.2. Comandos asociados a plot . . . . . . . . . . . . . . . . . . . . . . 213
10.1.3. Comandos get y set . . . . . . . . . . . . . . . . . . . . . . . . . . 215
10.1.4. El comando subplot . . . . . . . . . . . . . . . . . . . . . . . . . . 219
10.1.5. Otras salidas gracas . . . . . . . . . . . . . . . . . . . . . . . . . . 220
10.2. Gracas en 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
10.2.1. El comando plot3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
10.2.2. El comando surf . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
10.2.3. Otros comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
10.2.4. Comandos faciles de usar . . . . . . . . . . . . . . . . . . . . . . . 233
10.3. Campos vectoriales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
10.4. Dibujos sobre dominios mallados en triangulos . . . . . . . . . . . . . . . . 234
11.Interpolacion. Curvas Bezier 239
11.1. Interpolacion polinomica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
11.1.1. Interpolacion polinomica de Lagrange . . . . . . . . . . . . . . . . . 239
11.1.2. Existencia del polinomio de interpolacion . . . . . . . . . . . . . . . 240
11.1.3. Formula de Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
11.1.4. Analisis del error de interpolacion . . . . . . . . . . . . . . . . . . . 249
11.2. Extensiones adicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
11.2.1. Interpolacion de Hermite . . . . . . . . . . . . . . . . . . . . . . . . 252
269
B
o
r
r
a
d
o
r
11.2.2. Interpolacion de funciones periodicas . . . . . . . . . . . . . . . . . 254
11.2.3. Interpolacion polinomica a trozos . . . . . . . . . . . . . . . . . . . 255
11.3. Curvas Bezier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
270
B
o
r
r
a
d
o
r

Indice de comandos de Matlab


[], 30
%, 10
|, 32
&, 32
, 57
., 58
./, 24
/, 24
<, 32
<=, 32
==, 32
>, 32
>=, 32
@, 110
\, 24
\., 24
~=, 32
:
def. de vectores, 27
seleccion de submatrices, 28
abs, 13
acos, 15
acosh, 15
acot, 15
acsc, 15
angle, 13
ans, 11
area, 218
asec, 15
asin, 15
asinh, 15
atan, 15
atanh, 15
axis, 211, 213
bar, 218
bar3, 218
barh, 218
blkdiag, 57
break, 31
ButtonDownFcn, 216
celldisp, 167
chol, 49
cholinc, 100
cla, 211
clabel, 230
clear, 18
clf, 211
collect, 161
colorbar, 223
colormap, 223
cond, 63
continue, 31
contour, 229
contourf, 229
conv, 150, 155
cos, 10, 15
cosh, 15
cot, 15
csc, 15
cylinder, 228
daspect, 223
dblquad, 132
dct, 147
deconv, 155
det, 24
diag, 55
dot, 60, 63
dsolve, 161
dst, 147
edit, 19
eig, 193
eigs, 193
ellipsoid, 228
271
B
o
r
r
a
d
o
r
else, 33
elseif, 34
end
con for, 30
con if, 33
con while, 35
en arrays, 35
eps, 20
exp, 15
expand, 161
eye, 26
ezcontour, 231
ezcontourf, 231
ezmesh, 231
ezmeshc, 231
ezplot, 218
ezplot3, 231
ezpolar, 218
ezsurf, 231
ezsurfc, 231
factor, 161
factorial, 111
feval, 109
fft, 147
figure, 207
fill, 218
fontangle, 212
fontname, 212
fontsize, 212
fontweight, 212
for, 30
format, 12
fourier, 160
full, 65
function, 20
gca, 215
gcf, 215
get, 213
ginput, 256
grid, 211
gtext, 257
help, 14
helpwin, 14
hess, 193
hilb, 26
hold, 207
i,j, 13
idct, 147
idst, 147
if, 33
ifft, 147
ifourier, 160
ilaplace, 160
inf, 12
initmesh, 236
inline, 107
input, 110
inv, 24
invhilb, 26
isempty, 91, 174
laplace, 160
legend, 211
length, 25
limit, 160
line, 218
linspace, 27
load, 18
log, 15
log10, 10, 15
log2, 15
logical, 33
loglog, 218
lookfor, 14
lu, 49
maple, 162
max, 42, 61
mesh, 230
meshc, 230
meshgrid, 221
meshz, 230
mhelp, 162
min, 61
mldivide, 25
mod, 146
mrdivide, 25
NaN, 12
en dibujos, 223
272
B
o
r
r
a
d
o
r
nargin, 66
nargout, 66
nnz, 65
norm, 62
num2str, 149
ones, 26
pascal, 26
patch, 218
pbaspect, 223
pcg, 100
pcolor, 229
pdetool, 236
pi, 12
plot, 110, 205
color, 208
LineWidth, 208
Marker, 208
MarkerEdgeColor, 208
MarkerFaceColor, 208
MarkerSize, 208
plot3, 219
plotyy, 218
polar, 218
poly, 157
polyder, 161
polyfit, 246
polyint, 161
polyval, 156
power, 15
ppval, 255
profile, 181
qr, 49, 188
quad, 132
quadl, 132
quiver, 231
quiver3, 231
rank, 63
rcond, 63
realmax, 20
realmin, 20
refinemesh, 236
reshape, 60
return, 20
roots, 157
rotate, 212
save, 18
schur, 191
sec, 15
semilogx, 218
semilogy, 91, 218
set, 213
sign, 15
simple, 161
simplify, 161
sin, 10, 14, 15
sinh, 15
size, 25
solve, 161
spalloc, 65
sparse, 64
spdiags, 66
speye, 66
sphere, 228
spline, 255
splinetool, 255
spones, 66
sprand, 66
sprandn, 66
spy, 65
sqrt, 11
stairs, 218
stem, 218
str2num, 149
subplot, 217
sum, 61
surf, 221
EdgeAlpha, 225
EdgeColor, 225
FaceAlpha, 225
FaceColor, 225
LineStyle, 225
LineWidth, 225
Marker, 225
MarkerEdgeColor, 225
MarkerSize, 225
MeshStyle, 225
surfc, 230
surfl, 230
273
B
o
r
r
a
d
o
r
svd, 194
switch, 35
symamd, 72
symmmd, 70
symrcm, 70
symsum, 160
tan, 15
tanh, 15
taylor, 160
text, 211
tic, 183
title, 211
toc, 183
tril, 55
trimesh, 236
triplequad, 132
trisurf, 236
triu, 55
varargin, 66
varargout, 66
vectorize, 108
view, 223
vpa, 160
waterfall, 230
while, 35
whitebg, 211
who, 17
whos, 17
xlabel, 211
xlim, 211
ylabel, 211
ylim, 211
zeros, 23, 26
zlabel, 220
zlim, 220
274

You might also like