matlab en cinco lecciones de num´erico - kalan · unos apuntes muy completos de libre...

280
Matlab en cinco lecciones de Num´ erico ıctor Dom´ ınguez B´ aguena M a Luisa Rap´ un Banzo Febrero de 2006 Disponible en http://www.unavarra.es/personal/victor dominguez/

Upload: dangque

Post on 05-Oct-2018

254 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Matlab en cinco lecciones de Numerico

Vıctor Domınguez Baguena Ma Luisa Rapun Banzo

Febrero de 2006

Disponible en

http://www.unavarra.es/personal/victor dominguez/

Page 2: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo
Page 3: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorPrefacio

El origen de este libro es una asignatura de libre eleccion que uno de los autores im-partio durante los cursos 2004–2005 y 2005–2006 en la Universidad Publica de Navarra.Nuestra intencion original era tratar temas algo avanzados de Calculo Cientıfico y utilizarMatlab como vıa para su aprendizaje. Los alumnos, obviamente, estaban mas interesadosen aprender Matlab y veıan el Numerico como forma de probar y ensayar las diferentesherramientas de Matlab que se iban exponiendo en clase. Desafortunadamente, la forma-cion en Numerico de nuestros alumnos nos obligo a relajar considerablemente el contenidomatematico del curso y a ser mas modestos, desde el punto de vista teorico, en nuestrosobjetivos. El resultado final en su vertiente matematica se podrıa enmarcar sin problemasen un curso introductorio de Calculo Numerico. En cuanto a Matlab, creemos que hemostratado todos sus aspectos fundamentales aunque en ocasiones sea de forma superficial.Nuestro objetivo era conseguir no tanto un conocimiento muy profundo de Matlab comoel 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 queconviene citar nuestro propio bagaje matematico1, el uso que hemos tenido que hacer deMatlab en nuestra carrera investigadora y, como ya hemos mencionado, los conocimientosde partida que tenıan nuestros propios alumnos. Hemos insistido bastante en la manip-ulacion de vectores y matrices y a la programacion en forma vectorizada. Esta es unade las diferencias mas acusadas con los lenguajes de programacion tradicionales y unaimplementacion eficiente en Matlab pasa necesariamente por la vectorizacion.

Los apuntes estan organizados en torno a temas o lecciones, cada cual dividido en dospartes, la primera de Matlab y la segunda con un tema especıfico de Calculo Numerico.En la primera parte se presentan los aspectos instrumentales de Matlab que utilizaremosen la implementacion de los algoritmos de la parte de Numerico. La longitud de cadaparte es variable, y dependiente de la dificultad tratada ya sea en la parte instrumental(Matlab) o en la parte matematica. De tanto en tanto nos hemos permitido hacer algo deMatematicas 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 especıficos, matematicos e informaticos. Finalmentese han introducido algunas notas historicas que describen brevemente la evolucion que hantenido las ideas a lo largo del tiempo. Con ello tratamos de combatir la idea gaussiana,demasiado extendida, de las Matematicas como un mundo estatico, monolıtico y perfectodonde la teorıa se presenta cerrada y completa. Las Matematicas en general y el CalculoCientıfico en particular recorren un largo trecho antes de llegar a este estado, duranteel cual brotan ideas constantemente, siempre prometedoras en un primer momento, que

1modelado por nuestra formacion cientıfica, comun en muchos aspectos.

i

Page 4: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borradorevolucionan con los anos, con muchas de ellas desechadas finalmente e incluso algunasrescatadas anos despues de considerarse como vıas muertas.

Hemos adjuntado al final una bibliografıa utilizada en este texto. Nos gustarıa resaltartres textos sobre los demas. En primer lugar, Numerical Computing with Matlab, de CleveMoler, que descubrimos cuando andabamos en la redaccion de la Leccion II. Su sencillezy la buena eleccion de ejemplos ha ejercido una influencia considerable en estas notas.

El segundo libro es ya un clasico entre los que aprendimos Matlab hace algunos anos.Andabamos entonces en la busqueda de recursos en la web cuando nos encontramos conunos apuntes muy completos de libre divulgacion. Nos referimos al libro de Garcıa deJalon y sus colaboradores, Aprenda Matlab ?.? como si estuviera en primero. Diferentesversiones de estos apuntes llevan cubriendo de forma incansable la evolucion de Matlabdesde la version 4.0.

Por ultimo, aunque no es un texto propiamente, la enciclopedia libre on line Wikipedia2

ha sido utilizada profusamente para obtener datos y fuentes utilizadas en la redaccion deeste texto. Debemos senalar que estas informaciones han sido debidamente contrastadas.A pesar de algunos problemas iniciales, es seguro que la influencia de esta enciclopedialibre crecera exponencialmente en el futuro.

Finalmente, queremos dejar patente nuestro agradecimiento al Profesor Javier Sayasque se ofrecio muy generosamente a revisar este libro. Sus numerosas y acertadas indica-ciones y sugerencias han contribuido, y mucho, en la redaccion final de este texto.

Pamplona, Febrero de 2006 Vıctor Domınguez BaguenaMa Luisa Rapun Banzo

2http://www.wikipedia.org

ii

Page 5: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorA Javier

Amigo y maestro.

Page 6: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador

Page 7: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorCapıtulo 1

Introduccion

... and the first lesson of all was the basic trust that hecould learn. It is shocking to find how many people donot believe they can learn, and how many more believelearning to be difficult.

DuneFrank Herbert

1.1. ¿Que es?

Matlab es un entorno de trabajo para el calculo cientıfico. Programado originalmentepor Cleve Moler a finales de los anos 70, su finalidad original era proporcionar una formasencilla de acceder a las librerıas LINPACK y EISPACK donde estan implementadas de unaforma altamente eficiente los algoritmos clave del analisis matricial1. De hecho, Matlab esuna abreviatura de Matrix Laboratory

Su primera implementacion se hizo en Fortran que era, y en buena medida aun siguesiendolo, el lenguaje estandar en la implementacion de metodos numericos2. 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 cientıficoy de las ciencias aplicadas en general, dotandole de una gran popularidad en ambientescientıficos (especialmente en Ingenierıa). Dichas extensiones se consiguieron en gran partemediante la implementacion de toolboxes, librerıas escritas en el lenguaje de programacionpropio de Matlab y que ampliaban el rango de problemas que podıan resolverse.

Sin miedo a equivocarse, se pueden enunciar las siguientes areas donde Matlab muestraun gran potencial:

algebra lineal numerica;

procesamiento de senales (analisis, compresion de datos,..);

1por ejemplo, el metodo de Gauss, el calculo de las descomposiciones mas habituales del algebramatricial numerica (LU , LL>, QR), metodos iterativos,...

2Fortran significa Formula translation. Desarrollado por IBM en 1954, es considerado como el primerlenguaje de alto nivel. Las ultimas actualizaciones (Fortran 95 y Fortran 2003) han dado nuevo vigor aeste veterano lenguaje de programacion.

1

Page 8: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borradordiseno de sistemas de control;

salidas graficas;

estadıstica;

simulacion de sistemas dinamicos.

La extensa gama de problemas que cubre hace de Matlab un lenguaje difıcil de entendery manejar en su completitud. Esto no quiere decir que sea inarbodable: el conocimientobase que permite empezar a trabajar es muy sencillo. No obstante el elevado numero decomandos que se encuentra a disposicion del usuario3 provoca que en ocasiones existanproblemas no solo para encontrar los comandos adecuados sino tambien para tener unaidea 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 flexible que el de los lenguajestradicionales. No es preciso la declaracion inicial de variables, estas se pueden introduciren el momento que se necesiten, y por ejemplo, vectores y matrices pueden declararsesin especificar sus dimensiones e incluso cambiar sus tamanos sobre la marcha. Ello per-mite una programacion algo mas desordenada, aunque debe tenerse bien claro que unaprogramacion clasica, mas al uso, suele generar codigo mas eficiente.

Por otro lado, una gran cantidad de metodos numericos se encuentran implementadosde una forma muy eficiente 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 sinque 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 paraası ser conscientes de en que condiciones van a funcionar, cual es en cada caso el meto-do adecuado, y especialmente el significado de los, posiblemente, numerosos argumentosopcionales 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 sepueden citar

operaciones fundamentales +, *,. . . .

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

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

salidas graficas (plot, surf,...)

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

2

Page 9: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLas funciones no compiladas estan escritas siguiendo el lenguaje de programacion

propio de Matlab. Estos comandos se guardan en ficheros *.m que es la extension estandarde los ficheros de Matlab4.

Originalmente, Matlab funcionaba como un interprete. Es decir, cada lınea de codigoera traducido antes de su ejecucion. Ello hacıa que una programacion similar a lenguajesclasicos de programacion diera lugar a codigo poco eficiente.

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 tıpica en los lenguajes deprogramacion: el comando for. Su significado es claro: las lıneas comprendidas entre el fory end se repiten 1000 veces con la variable i tomando valores de 0 a 999. El resultado finales el vector fila y que recoge el valor del seno en 1000 puntos uniformemente espaciadosen [0, 2π].

Por otro lado, el comando linspace devuelve un array que contiene 1000 puntosequidistantes entre 0 y 2π. La funcion seno es aplicada sobre todo el array devolviendoun vector con estos valores que se guarda en y. La diferencia entre ambas formas deprogramar es ahora patente. Mientras que en la primera realizamos 1000 llamadas a lafuncion seno con un argumento por llamada, en la segunda hay una unica llamada dondese requiere el calculo del seno en 1000 puntos, y el resultado se devuelve en un vector conestos valores (y por tanto tambien de longitud 1000).

Desde el punto de vista de Matlab el segundo codigo es mas eficiente. Habitualmente,la vectorizacion lleva consigo una reduccion del codigo a la vez que se incrementan lasnecesidades 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 Pascal5. En cualquier caso,la posibilidad de ejecutar instrucciones en bloque sobre vectores o matrices, en contrastecon operaciones elemento a elemento como en los lenguajes tradicionales, es algo queconviene explotar por las importantes ventajas que proporciona.

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

expuestos.

3

Page 10: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador1.3. ¿Como aprenderemos?

Como ya hemos senalado anteriormente, aprender a manejar Matlab en su totalidadesta fuera de los contenidos de un curso introductorio como este. No ası aprender losfundamentos y preparar el terreno para un autoaprendizaje de las partes en las que cadauno este interesado. Encontramos en este punto dos dificultades que salvar: saber de laexistencia del comando adecuado y aprender a utilizarlo. En no pocas ocasiones, la primeraes la mayor dificultad. No obstante los comandos llevan siempre nombres nemotecnicospara facilitar su memorizacion. Las funciones de ayuda tambien echan una mano.

Como a programar se aprende programando, comenzaremos escribiendo codigo desdelos primeros pasos. Los esquemas numericos que implementaremos se encuentran practi-camente en cualquier curso introductorio de Analisis Numerico. En cada leccion imple-mentaremos dichos algoritmos, introduciendo ordenes, estructuras de decision, datos,...segun sea necesario.

En los apuntes se incluyen multiples ejercicios cuya realizacion ayudara al aprendizajede la asignatura. Estos apuntes no deben tomarse como un manual en el estilo usual, sinocomo una forma de aprender Matlab y repasar o aprender el Analisis Numerico basico.Ya existen manuales extensos y concienzudos, en la bibliografıa citamos algunos de ellos,que pueden servir para ese fin.

4

Page 11: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLeccion I

Primeros pasos en Matlab.Metodos directos para sistemas de ecuaciones

lineales

5

Page 12: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador

Page 13: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorIntroduccion

When asked whether a programming language supportsmatrices, many people will think of two-dimensionalarrays and respond, “Yes.” Yet matrices are more thantwo-dimensional arrays -they are arrays with operations.It is the operations that cause matrices to feature soprominently 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 segundolugar entraremos en uno de los detalles fuertes de Matlab, la manipulacion de vectores ymatrices.

En la parte matematica estudiaremos metodos directos para la resolucion de sis-temas de ecuaciones lineales. En la implementacion de estos algoritmos repasaremos losconocimientos de Matlab expuestos en la primera parte.

7

Page 14: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador

Page 15: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorCapıtulo 2

Matlab: Primeros pasos

2.1. Entorno de trabajo

En las primeras secciones comenzaremos explorando Matlab de la forma mas simple, enmodo comando: el usuario pregunta y Matlab responde. El interfaz de Matlab es bastantepobre, con un aspecto estetico que en modo alguno es comparable al de programas comoMaple o Mathematica. El modo interactivo de trabajar es sencillo aunque algo incomodo. Amodo de ejemplo, requiere algo de esfuerzo editar instrucciones ejecutadas con anterioridady manejarse con bloques de comandos es muy engorroso. Este y otros problemas del modointeractivo se subsanan en gran medida empaquetando instrucciones con ficheros scripty/o programando en funciones (subrutinas) que es la forma natural de trabajar en Matlab.En un segundo paso, se puede implementar un interfaz grafica, las guides de Matlab, quehacen mas amigable la comunicacion con el usuario.

En la Figura 2.1 podemos ver el aspecto inicial de Matlab. Distinguimos las siguientesventanas

Command window: ventana donde podemos ejecutar los comandos;

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

Ventana de ayuda: en una ventana independiente proporciona un acceso completoa las funciones de ayuda de Matlab, incluyendo busquedas, demostraciones, etc.

Estas son las caracterısticas 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 flechas ↑ y ↓.

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

Se distinguen mayusculas y minusculas.

9

Page 16: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.1 Entorno de trabajo LECCION I

Figura 2.1: Pantalla Principal.

Todos los comandos de Matlab se escriben en minusculas y los argumentos se envıanentre parentesis separados por comas.

El caracter % se utiliza para insertar comentarios. Todo lo que sigue (en la mismalınea) es ignorado por Matlab.

Si se teclea al final de una instruccion ’;’ esta se ejecuta pero el resultado no sevisualiza por pantalla.

Dos comandos se pueden insertar en la misma lınea separados por “,” o por “;”. Ladiferencia entre los dos es que con “,” se muestran los resultados de las operacionesmientras 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

Page 17: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION I Capıtulo 2. Matlab: Primeros pasos

y observa la salida.

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

>> 3^5

ans=

243

El termino ans es la primera variable que vemos de Matlab. Concretamente, guarda laultima salida dada por Matlab (answer):

>> 4+6

ans =

10

>> ans*2

ans =

20

>> ans*2

ans =

40

La raız 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: primerose calcula la potenciacion ^, posteriormente los productos y divisiones *, / y en ultimolugar, 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 dentrode cada parentesis. Esta regla es recursiva, es decir, si dentro de un parentesis hay otrosparentesis, para evaluar el primero se empezara con los parentesis interiores. �

Los numeros reales se pueden insertar tambien en notacion cientıfica, muy adecuada sise trata de numeros grandes o muy pequenos (en valor absoluto). Ası, se tiene la siguienteregla de construccion:

m · 10r m er

11

Page 18: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.1 Entorno de trabajo LECCION I

Por ejemplo

0.005 5e− 3 115 · 1012 115e12

−1201200000 −1.2012e009 0.00031415 3.1415e− 004

Existen ademas dos numeros especiales: inf y NaN. El primer signo representa la can-tidad infinita (∞). El segundo es una abreviatura de “no es un numero” (Not a Number)y es el resultado que se devuelve ante una operacion indefinida como 0/0. Este sımbolose puede utilizar en ambitos, en principio tan extranos, como en el dibujo de superficies(ver la Leccion V).

En general los resultados numericos se presentan con cuatro cifras decimales correctas,aunque todas las operaciones se ejecutan en doble precision1. Si se desean las salidas contoda la precision disponible se debe insertar la instruccion

>> format long

A partir de este punto, el resultado de cualquier operacion se mostrara con 16 cifrassignificativas. La instruccion

>> format short

devuelve a la forma estandar con cuatro cifras decimales. Existen mas opciones con format.Las siguiente lıneas 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

1Aproximadamente 16 cifras decimales correctas. En el momento de redactar estas lıneas, los proce-sadores de 32 bits dominan todavıa el parque de ordenadores. Las nuevas generaciones, con procesadorescon 64 bits, duplican la precision de trabajo.

12

Page 19: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

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

Numeros complejos

La aritmetica compleja se encuentra tambien integrada en Matlab. La unidad imagi-naria (

√−1) se representa en Matlab con i o j:

>> clear i j % borramos posibles valores de i y j

>> i^2

ans=

-1

>> j^2

ans=

-1

El signo i suele ser habitual en Matematicas mientras que en diversas ramas de la Fısicay en Ingenierıa de Telecomunicaciones o Electrica se prefiere el sımbolo j (en este casopara no confundir con la intensidad de corriente electrica). De ahı que Matlab permitaambas 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

Page 20: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.2 Comandos de ayuda LECCION 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 siempredispuestos 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 lınea de todos los ficheros deayuda.

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

Page 21: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 completadonde se muestran ejemplos y detalles sobre la implementacion del comando (ver la Figura2.42).

Ejercicio 2.3 Utilizando las funciones de ayuda, obtener informacion de alguna de estasfunciones 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 instruccion2Para 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 laslibrerıas habituales y el segundo con la documentacion de la ayuda.

15

Page 22: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.3 Variables LECCION I

Figura 2.3: Ayuda con helpwin. Comprueba si aparece la opcion Go to online doc...

>> help +

se pueden ademas visualizar las operaciones “elementales” segun Matlab.

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

Page 23: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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, mientrasque 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

Page 24: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.3 Variables LECCION 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 tenıa comofuncion seno. Para recuperar el valor original basta ejecutar

>> clear sin

Almacenamiento de variables en ficheros

Matlab ofrece la posibilidad de grabar las variables que deseemos en un fichero. De estaforma, podemos recuperarlas mas adelante, ya sea en la misma sesion o en otra diferente3.Por ejemplo

>> a=4+i;% numero complejo

>> b1=cos(2);

>> b2=sin(2);

>> save datos a b1 b2

graba dentro del directorio de trabajo, en un fichero de nombre datos.mat, las variablesindicadas. Para recuperar, basta ejecutar

>> load datos

3Se entiende por sesion el tiempo que transcurre entre que se abre y se cierra Matlab. Al cerrar elprograma, todas las variables locales se pierden.

18

Page 25: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION I Capıtulo 2. Matlab: Primeros pasos

2.4. Ficheros script y funciones

La forma mas eficiente de empaquetar series de instrucciones simples y mecanicas esutilizando ficheros script. Tareas mas elaboradas, con, por ejemplo, variables de entraday salida, requieren del uso de funciones.

2.4.1. Ficheros script

Un fichero script es un simple documento de texto que contiene una sucesion de co-mandos de Matlab. Esencialmente es equivalente a teclear estas instrucciones directamenteen la ventana de comandos.

Describiremos el manejo de este tipo de ficheros mediante un sencillo ejemplo. Comen-zamos creando un fichero tecleando en modo comando la orden4

>> edit prueba

Se despliega ası en una ventana aparte el editor de Matlab con el fichero prueba.m (“.m”esla extension estandar de Matlab). Es importante saber cual es el directorio de trabajo5,pues es donde se guardara por defecto el fichero.

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 quepara Matlab un cadena de caracteres es simplemente un vector de caracteres, se consiguecon ello mostrar por pantalla mensajes de forma concisa.

Una vez que el documento esta grabado, para ejecutar las ordenes que contiene bastateclear el nombre del fichero en la ventana de comandos:

>> prueba

Se puede modificar las veces que se precise las variables a y b en el fichero script sin tenerque teclear de nuevo todas las instrucciones.

2.4.2. Funciones

En principio existen dos tipos de funciones: las funciones inline, que se insertan enla lınea de comandos y las que se escriben en un documento de texto externo. Esta ultimaforma, que es la evolucion natural de los ficheros script, es mas flexible y es en la que noscentraremos a continuacion. Dejaremos pendiente para la Leccion III la descripcion de lasfunciones inline.

Como antes, para crear un fichero que contenga a una funcion se puede teclear:

4Tambien es posible crear este fichero a golpe de raton.5Por defecto es C:\MATLAB6p5\work.

19

Page 26: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.4 Ficheros script y funciones LECCION 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 variablede salida y. Se termina la ejecucion de la funcion cuando se ejecuta un return o bien sellega al final de la funcion6.

Ahora, para calcular el valor de π2 − cos(π) podemos ejecutar la orden:

>> mifuncion(pi)

ans =

10.8696

Nota. Los numeros correlativos situados a la izquierda no forman parte del codigode la funcion. Han sido insertados con el fin de numerar las lıneas y ası facilitar loscomentarios 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

6En este sentido, el return del ejemplo anterior es superfluo.

20

Page 27: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION I Capıtulo 2. Matlab: Primeros pasos

o bien devolver multiples 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 lıneasanteriores a la declaracion de la funcion y precedidas con “%”, constituyen la ayuda de lafuncion:

>> help mifuncion2

MIFUNCION2

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

Y1=X1+X2+X3;

Y2=X1-X2+X3;

21

Page 28: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.5 Vectores y matrices LECCION I

Aunque muy recomendables7, su inclusion en una funcion es opcional. La ayuda puedeestar antes o despues de la declaracion de la funcion. En cualquiera de los dos casos,Matlab despliega como ayuda todas las lıneas que esten precedidas con % hasta que seencuentra con la primera lınea no comentada.

Nota. Para ser consecuentes, lo correcto es denominar de igual modo a la funcion yal archivo que la contiene. Sin embargo esto no es obligatorio, es decir, se pueden darnombres distintos, pero en este caso Matlab da preferencia al nombre del archivo.

Aunque Matlab distingue entre mayusculas y minusculas en sus comandos, esto no esextensible para funciones programadas en m-files, al menos en Windows. Es decir, paraejecutar una funcion en un archivo, digamos, operaciones, se puede utilizar OPERACIONES,Operaciones y cualquier combinacion con mayusculas y minusculas. Esto es debido a queel sistema de archivos de Windows tampoco hace esa distincion8. Versiones mas avanzadasde Matlab, 7.0 en adelante, muestran sin embargo un aviso si no existe una concordanciaexacta minusculas-mayusculas entre el nombre del fichero y el comando utilizado parallamarlo.

Todas las variables se envıan por valor, no por referencia. Es decir, si una funcionmodifica una variable de entrada, esta modificacion se pierde cuando finalice su ejecucion,recuperando el valor original.

Por ultimo, en un fichero se pueden incluir varias funciones. En este caso solo la primerafuncion es accesible desde el exterior (lınea de comandos, otras funciones,...) mientras queel resto de funciones presentes en ese fichero son internas, es decir, utilizables unicamentepor las funciones presentes en el archivo. Esto es importante a la hora de realizar unaprogramacion modular. Si un conjunto de funciones son solo utilizadas por una funcionprincipal, se pueden insertar en el mismo fichero que esta. Evitamos ası llenar la carpetade trabajo, o de nuestro proyecto, con ficheros y mas ficheros. �

2.5. Vectores y matrices

Dado que principalmente trabajaremos solo con arrays de una y dos dimensioneshablaremos 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 porsimplificar, 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. Definicion de matrices y vectores

Un vector o una matriz se puede definir dando sus elementos entre corchetes y sepa-rando filas mediante “;”. Por ejemplo, las instrucciones

7No hay que subestimar nunca la capacidad de olvido de uno mismo: el codigo claro y legible de hoyes ilegible semanas despues. Las ayudas facilitan la edicion de los programas no solo para un usuarioexterno sino para el propio programador.

8Es decir, si existe un fichero llamado operaciones.m no es posible crear otro con nombreOperaciones.m

22

Page 29: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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];

definen las matrices y vectores

a =

1 3 −12 3 44 5 1

, a2 =

1 2 4−1 0 12 1 5

, b =

131

, b2 =[−1 1 −2 2

].

Matlab distingue entre vectores fila y columna por lo que habra que tenerlo en cuenta porejemplo cuando se desee hacer operaciones como sumas o productos.

Desde una vertiente practica, si se va a trabajar con una matriz grande, por ejemplode tamano 20× 10, y sus valores se van a introducir mas adelante, se puede empezar con

>> a=zeros(20,10);

A partir de este instante se pueden insertar los elementos, accediendo a cada posicionmediante 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 definida de lamatriz, Matlab ira adaptando el tamano segun juzgue apropiado9, y no dara ningunerror. El siguiente ejemplo ilustra esta caracterıstica

>> 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 flexible y descuidada, debe uti-lizarse con mesura dado que puede provocar errores de ejecucion muy difıciles de detectar.

9Ello obliga a que haya que redimensionar constantemente la memoria otorgada a la variable a. Estosupone un costo adicional, inapreciable con ejemplos pequenos, pero importante para grandes cantidadesde memoria. Por tanto es mejor declarar primero las dimensiones de la matriz e informar ası a Matlab decuanta memoria tiene que reservar.

23

Page 30: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.5 Vectores y matrices LECCION I

2.5.2. Operaciones

Todas las operaciones habituales entre matrices, tales como la suma, producto, poten-ciacion, calculo de determinantes, inversas..., estan ya implementadas en Matlab. No haypor tanto necesidad de programarse estas tareas. Por ejemplo, si a y a2 son matrices detamanos 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 dea y a2.

Es importante observar la diferencia con estas lıneas

a.*a2 a.^2

En el primer caso, se devuelve la matriz resultado de multiplicar elemento a elementoa y a2 (por tanto deben tener el mismo tamano) y en el segundo, una matriz cuyasentradas 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 aelemento, mientras que en caso contrario se calcula la operacion matematica, en estecaso el producto matricial.

Ejercicio 2.4 Introduce en a y a2 dos matrices de igual tamano. Observa el resultado deejecutar

a+a2 a*a2 a.*a2

Define un vector b fila o columna y ejecuta

b.^3 b’

Comprueba si estas operaciones estan bien definidas

a*2 a+1

¿Que hacen exactamente? ¿Por que crees que no es necesario “.” en la primera instruccion?.

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, aplicadosobre matrices procede a realizar los cocientes elemento a elemento. Requiere por tantoque ambas matrices tengan el mismo tamano.

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

Page 31: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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−1b.

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 poralguna variante del metodo de Gauss. Se puede utilizar helpwin mldivide (o helpwin

mrdivide para /) para leer en detalle como procede este comando. �Las funciones propias de Matlab trabajan de forma natural sobre vectores y matrices.

El resultado final es equivalente a aplicar el comando elemento a elemento. Por ejemplo,

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

>> cos(a)

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

Page 32: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.5 Vectores y matrices LECCION 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 tamano 2×1 con el numero de filas y columnasdel vector/matriz. El resultado es diferente segun se aplique a vectores fila o columna. Laorden length devuelve la longitud de una matriz o vector. Su significado en el caso de unvector esta clara mientras que para matrices devuelve el maximo entre el numero de filasy el numero de columnas.

Matrices especiales

Matlab dispone de una serie de comandos que permiten construir matrices con unaestructura particular. Cabe senalar 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

Page 33: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 esel mayor numero natural que cumple a+k*b≤ c. La instruccion a:c toma b = 1.

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

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 especifica el formato,devuelve una fila. �

2.5.4. Acceso a partes de matrices

El manejo de partes de vectores y matrices, ası como la eliminacion de filas o columnas,cambios de tamano, etc, se hace vıa instrucciones muy simples en Matlab. Aunque puedaresultar algo extrano al principio, un poco de practica es suficiente para que el usuario se

27

Page 34: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.5 Vectores y matrices LECCION I

adapte a la nueva sintaxis, tan diferentes a la de un lenguaje tradicional, y pueda utilizarloen 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 fila 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

Page 35: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 numeros enteros, v(p) devuelve [v(p(1)), v(p(2)),

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

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

>> v(4:-1:2)

ans=

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 lıneas

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

Page 36: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.6 Bucles y estructuras de decision LECCION I

1 2 3 4

5 6 7 8

1 -1 2 4

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

a =

1 2 3 4 0

5 6 7 8 2

1 -1 2 4 4

Si se desea eliminar una fila o columna se puede utilizar el sımbolo vacıo []. Porejemplo,

>> 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 terminoindependiente 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 entrelas 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 lıneas 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

Page 37: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 lıneas 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 ycontinue. 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

n12

13· · · · · · 1

n+1

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

...1n

12n−2

12n−1

Construye la matriz anterior mediante un fichero 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

Page 38: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.6 Bucles y estructuras de decision LECCION 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 ultimainstruccion10. Cuando se aplica a un vector, devuelve un vector de verdadero/falso de lamisma 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, podemosaislar los elementos mayores o iguales que 1 simplemente con

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

32

Page 39: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 logicasa partir de vectores de numeros enteros:

>> b=[2 4 6 8 10]; p=[1 0 0 1 1];

>> b(p) % Dara error

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

>> p=logical(p);

>> b(p)

ans =

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 lıneas decodigo 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 lıneas, comprendidasentre else y end son ejecutadas en caso de que la operacion logica efectuada en elif 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

Page 40: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.6 Bucles y estructuras de decision LECCION I

if de decision multiple:

if (x<0)

f=x.^2;

disp(’x menor que cero’)

elseif (x<sqrt(pi))

f=sin(x^2);

disp(’x en [0,sqrt(pi))’)

elseif (x<2*sqrt(pi))

f=(x-sqrt(pi))^2;

disp(’x en [sqrt(pi),2*sqrt(pi))’)

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 quees esencialmente equivalente a un if anidado.

Esta disponible tambien el bucle while que procede a ejecutar un bucle (que se cierratambien con un end) mientras una condicion sea verdadera. Por tanto, es algo mas flexibleque un for.

En general todos los bucles y estructuras que requieran cerrarse, lo hacen con end. Eluso de break y continue es exactamente el mismo.

34

Page 41: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 fila o columna de una matriz. Por ejemplob(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 switchy while.

Ejercicio 2.12 (Un poco de todo) Implementa una funcion de nombre findnonzeros

que dado un vector de entrada devuelva el numero de elementos no nulos y un vector quecontenga 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

Page 42: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador2.6 Bucles y estructuras de decision LECCION 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 suficiente practica,esta version se ve mas clara y natural que la anterior. Observa como se toman los elementosno nulos del vector x (lınea 10).

36

Page 43: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorCapıtulo 3

Metodos directos para sistemas deecuaciones lineales

3.1. Metodo de Gauss

El metodo de Gauss, tambien conocido como eliminacion gaussiana, es el algoritmomas sencillo para la resolucion de sistemas de ecuaciones lineales. Consta de dos partesbien 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 vıa dos operaciones elementales:

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

(b) Intercambiar dos ecuaciones.

Si solo utilizamos la operacion (a) hablaremos del metodo de Gauss sin pivotaje, ycon pivotaje parcial si tambien realizamos las operaciones (b)1 cuando la eleccion delas filas que se conmutan sea una muy particular.

Representando el sistema de ecuaciones en la forma matricial, todo lo anterior sereescribe en terminos de operaciones matriciales (sumar a una fila otra fila e intercambiarfilas2). En lo que sigue expresaremos el sistema en la forma

Ax = b, A ∈ Rn×n, x,b ∈ Rn,

donde A es la matriz de coeficientes, b el termino independiente y x el vector de soluciones.Los elementos de A se denotaran por aij, y con bi los de b.

1Existe una tercera operacion (c), que consiste simplemente en multiplicar filas por constantes nonulas. Esta operacion recibe el nombre de reescalado (de filas) y en problemas practicos se suele utilizarcon el fin de mejorar la estabilidad del sistema frente a errores de redondeo.

2Otra posibilidad es intercambiar columnas, que se corresponde con reordenar las incognitas). En estecaso se habla de pivotaje total.

37

Page 44: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador3.1 Metodo de Gauss LECCION I

3.1.1. Metodo de Gauss sin pivotaje

El pseudocodigo se expone a continuacion

Metodo de Gauss

01 for i = 1 : n− 102 for k = i + 1 : n03 `ki = aki/aii

04 for j = i + 1 : n05 akj = akj − `kiaij

06 end

07 bk = bk − `kibi

08 end

09 end

10

11 xn = bn/ann

12 for i = n− 1 : −1 : 1

13 xi =(bi −

n∑j=i+1

aijxj

)/aii

15 end

Las lıneas 01--09 se corresponden con la reduccion a la forma triangular de la matrizy las lıneas 11--15 con la resolucion del sistema triangular resultante. El elemento aii sedenomina pivote y debe ser distinto de cero para que el algoritmo funcione, dado que encaso contrario la operacion en 03 esta mal definida.

El algoritmo efectua O(n3/3) productos3 y otras tantas sumas para la reduccion a laforma triangular y O(n2/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 dimensiondel sistema exige multiplicar por ocho el tiempo de calculo (y por cuatro el costo enmemoria).

Ejercicio 3.1 Implementa una funcion cuyas entradas sean la matriz de coeficientes y eltermino 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

3es decir, el numero de multiplicaciones es n3/3 + αn2 + βn + γ, donde α, β y γ son constantesadecuadas. Con n creciente, el primer termino es el dominante.

38

Page 45: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 usarıamos en una

programacion en un lenguaje tradicional como C o Pascal. Sin embargo desde el punto devista de Matlab es claramente redundante y muy mejorable. Los siguientes ejerciciosahondan en estos aspectos por lo que resolverlos es muy recomendable.

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

Solucion. Las filas 14-16 del programa (04--06 del algoritmo) se pueden implementarcomo una diferencia de dos vectores, a(k,i+1:n) y a(i,i+1:n), con cualquiera de estasdos 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 numero de operacionesen la ejecucion del metodo4.

4¿Por que?.

39

Page 46: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador3.1 Metodo de Gauss LECCION I

De forma analoga, el sumatorio de las lıneas 25-29 del codigo (13 del algoritmo delmetodo de Gauss) es simplemente el producto escalar, y de hecho tambien matricial, dedos vectores, el vector fila a(i,i+1:n) y el vector columna x(i+1:n). Esto es el codigode las lıneas 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 aun mas hacia la consecucion de algoritmosmatriciales. Consideremos la particion de A

A =

[a11 c>1d1 A11

], b =

[b1

b1

]donde c1,d1 son vectores (n− 1)×1 y A11 una matriz (n− 1)× (n− 1). Entonces, el primerpaso del metodo de Gauss se puede escribir[

a11 c>10 A11 − (a11)

−1c>1 d1

], b =

[b1

b1 − a−111 b1d1.

]︸ ︷︷ ︸

A(1)

︸ ︷︷ ︸b(1)

El segundo paso del metodo de Gauss se aplica ahora sobre la matriz A(1) (de tamano (n−1)×(n− 1)) y el vector b(1) (de tamano (n− 1)× 1) y ası se procede sucesivamente. Implementaesta 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 objetivoque se persigue es que las todas las operaciones se reduzcan a operaciones matematicassencillas, como productos escalares, productos matriciales, busqueda de maximos y mıni-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 comoen hardware. Este conjunto de instrucciones se conocen como BLAS (basic linear algebrasubprograms). Se distinguen tres niveles. El nivel uno esta formada por operaciones entrevectores, tales como la suma o el producto escalar de dos vectores, de O(n) operaciones, elnivel dos se ocupa de operaciones matriz-vector con O(n2) operaciones y el nivel tres sonoperaciones entre matrices, O(n3) operaciones. En maquinas con multiples procesadoresestos subprogramas deben adaptarse a dividir la tarea entre los procesadores disponiblesde forma optima y a buscar algoritmos que soporten este tipo de trabajo5.

5Se deben buscar en primer lugar algoritmos que permitan dividir la tarea principal en subtareasequiparables, y de forma que finalicen en tiempos similares puesto que basta con que una de las subtareasse retrase respecto a las demas para que el conjunto de procesadores deba parar a esperar al rezagadocon la consiguiente perdida de tiempo (y dinero).

40

Page 47: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 filas,como hace C,

A =

[a11 a12 a13

a21 a22 a23

]⇒ a11 → a12 → a13 → a21 → a22 → a23

donde con la notacion anterior queremos decir que aij y aij+1 ocupan posiciones consec-utivas en memoria.

Sin embargo Fortran o Matlab proceden por columnas

A =

[a11 a12 a13

a21 a22 a23

]⇒ a11 → a21 → a12 → a22 → a13 → a23.

Segun sea el caso se trata de primar algoritmos que accedan a la matriz por filas o porcolumnas para que el procesador trabaje con posiciones consecutivas de memoria6. En estadinamica, la resolucion del sistema triangular segun el algoritmo expuesto en el Ejercicio3.3 esta mejor adaptado a la arquitectura de Matlab puesto que todas las operaciones sehacen 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 ique el elemento aii es nulo (lınea 03 del algoritmo), se introduce la nocion de pivotaje. Laidea es muy sencilla: en el caso de que en el i–esimo paso el pivote sea nulo, se procede aintercambiar la fila i por una fila k tal que aki 6= 0 para cierto k > i. Si esto no es posible,el sistema no es compatible determinado, es decir, o no tiene solucion o tiene infinitassoluciones.

Desde un punto de vista practico, el metodo de Gauss con pivotaje procede a inter-cambiar siempre filas de forma que en cada paso

|aki| = max`=i,...,n

|a`i|,

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

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

41

Page 48: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador3.1 Metodo de Gauss LECCION I

Metodo de Gauss con pivotaje parcial

01 for i = 1 : n− 102

03 Encontrar k ∈ {i, . . . , n} tal que |aki| = maxj=`,...,n

|a`i|04 for j = i : n05 aij ↔ akj %intercambio filas y termino independiente08 end

07 bi ↔ bk

08

09 for k = i + 1 : n10 `ki = aki/aii

11 for j = i + 1 : n12 akj = akj − `kiaij

13 end

14 bk = bk − `kibi

15 end

16 end

Ejercicio 3.4 Implementa una funcion con el metodo de Gauss con pivotaje a partir de lafuncion definida en el Ejercicio 3.2.

Para este fin la instruccion max te puede resultar util. Especıficamente,

>> [m,i]=max(v)

devuelve en m el mayor valor del vector v y en i su posicion, esto es, m = v(i). Anade tambienun control sobre el tamano de a(i, i) de forma que si este es proximo a cero7 se termine laejecucion 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 maximoen el vector columna abs(a(i:n,i)). Por tanto, la fila en la matriz a con el mayor valor en lacolumna i es i+r-1.)

El intercambio de filas de las lıneas 04--08 se puede implementar de varias formas.La primera es simplemente con un bucle que recorra las filas y proceda a intercambiar losvalores elemento a elemento. En la segunda forma se hace de forma global mediante

aux=a(i,i:n); a(i,i:n)=a(k,i:n); a(k,i:n)=aux;

La tercera forma probablemente sera la que resulte mas extrana pero vuelve a ser naturalen Matlab. Basta hacer

a([i,k],i:n)=a([k,i],i:n)

Fıjate que tiene perfecto sentido sintactico de acuerdo a las reglas de manipulacion devectores y matrices expuestas en la primera parte de esta leccion.

7¿Cuando se decide que un numero es cero? En la practica depende de los tamanos del resto deelementos de la matriz.

42

Page 49: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION I Capıtulo 3. Metodos directos para sistemas de ecuaciones lineales

3.1.3. Metodo de Gauss con pivotaje parcial ficticio

Desde un punto de vista practico no hace falta intercambiar fısicamente las filas de lamatriz. En lugar de ello se puede utilizar un vector de ındices p de forma que p(i) sea laposicion fısica en memoria de la fila i.

Inicialmente, las filas estan sin reordenar, es decir, se empieza declarando

p=1:n;

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

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

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

a(p(i),:)

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

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

La fila con el maximo elemento en valor absoluto es la p(r).Para la resolucion del sistema triangular despejamos igual que en el metodo de Gauss,

desde la n-esima incognita a la primera, con

22 x(p(n))=b(p(n))/a(p(n),n);

23 for i=n-1:-1:1

24 x(p(i))=(b(p(i))-a(p(i),i+1:n)*x(i+1:n))/a(p(i),i);

25 end

Desde un punto de vista estrictamente matematico se trata de llevar la matriz a unaforma que, si bien no es triangular, una reordenacion adecuada de las filas la transformaen triangular. El vector p recoge en que orden se deben despejar las incognitas a la horade resolver el sistema reducido. En concreto el orden viene dado por p(n), p(n-1),. . . ,p(1). En cualquier caso, a(p,:) es una matriz triangular8.

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

Ejercicio 3.6 Las lıneas 22–25 proceden a resolver el sistema triangular accediendo a loselementos por filas. Adapta el algoritmo para la resolucion de este sistema por columnas, talcomo se hizo en el Ejercicio 3.3.

Ejercicio 3.7 Sea A una matriz inversible de tamano n × n y A−1 su inversa. Si ai es lacolumna i−esima de A−1, esto es,

A−1 = [a1|a2| · · · |an],

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

43

Page 50: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador3.2 Descomposiciones matriciales LECCION I

entonces

Aai = ei =

0...1...0

→ i.

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

3.2. Descomposiciones matriciales

Uno de los aspectos que mejores resultados dio a lo largo del siglo XX, en los albores delAnalisis Numerica, fue la constatacion de que numerosos algoritmos del Algebra Lineal,podıan reescribirse como factorizaciones de matrices en producto de otras matrices concaracterısticas muy particulares. Este es el caso del algoritmo de Gram-Schmidt, la matrizoriginal escrita como el producto de una ortogonal por una triangular, o el caso que nosocupa, el metodo de Gauss, visto como la busqueda de la factorizacion de A como elproducto 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 laactualidad es profuso.

Estudiaremos en lo que sigue la factorizacion LU y variantes y dejaremos para masadelante (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, laresolucion del sistema lineal Ax = b es equivalente a resolver dos sistemas de ecuacionestriangulares

Ly = b, Ux = y.

el primero triangular superior y el segundo triangular inferior. Puesto que el costo deresolucion de cada sistema es O(n2) operaciones (total de sumas y productos) obtenemosuna ventaja decisiva en la resolucion del sistema.

Ejercicio 3.8 Implementa la resolucion de un sistema de ecuaciones Lx = b donde L estriangular inferior con 1s en la diagonal.

Si abordamos directamente la resolucion de la ecuacion A = LU , nos encontramoscon un sistema no lineal con n2 + n incognitas (las entradas de L y U) y n2 ecuaciones(una por cada elemento de a). Por tanto, el sistema resultante no deberıa admitir solucion

44

Page 51: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION I Capıtulo 3. Metodos directos para sistemas de ecuaciones lineales

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

L =

1

`21 1...

.... . .

`n1 `n2 · · · 1

, U =

u11 u12 · · · u1n

u22 · · · u2n

. . ....

unn

,

y tales que A = LU.El calculo de esta descomposicion se puede llevar a cabo sin mas que exigir que el

producto LU sea igual al de A. Ası empezamos despejando la primera fila de U (que esigual que la de A por ser `11 = 1). Una vez conocida esa fila, se puede despejar la primeracolumna de L, utilizando que el producto de L por la primera columna de U (que constade un unico elemento no nulo y ya es conocido del paso anterior) da la primera columna deA. Procedemos sucesivamente de esta forma, construyendo U por filas y L por columnas.

Descomposicion LU (Metodo de Doolittle)

01 for k = 1 : n02 for j = k : n

03 ukj = akj −k−1∑p=1

`kpupj

04 end

05 `kk = 106 for i = k + 1:n

07 `ik =(aik −

k−1∑p=1

`ipupk

)/ukk

08 end

09 end

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

Ejercicio 3.9 Implementar la descomposicion LU en Matlab mediante una funcion cuyaentrada sea una matriz cuadrada y su salida sean las matrices L y U correspondientes.(Ayuda: la funcion por tanto devuelve dos valores.)

45

Page 52: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador3.2 Descomposiciones matriciales LECCION I

Al observar el algoritmo del metodo, las operaciones recuerdan a las efectuadas por elmetodo de Gauss. Esto no es tan sorprendente cuando se analizan con detenimiento loscalculados realizados. Se puede ver entonces que en el calculo de la descomposicion LU seestan haciendo exactamente las mismas operaciones que al aplicar el metodo de Gauss.En efecto, definamos{

a(1)ij = aij i, j = 1, . . . , n

a(k+1)ij = a

(k)ij − `ika

(k)kj , k ≥ 1, 1 ≤ i, j ≤ n− k

donde `ki viene dada por el algoritmo de Doolitle (lınea 07).Entonces, de acuerdo con el algoritmo de la factorizacion LU , los elementos de la

primera fila de U y de la primera columna de L vienen dados por

u1j = a(1)1j , `i1 =

a(1)i1

a(1)11

.

En el siguiente paso, se observa que

u2j = a2j − `21u1j = a(1)2j − `21a

(1)1j = a

(2)2j

`i2 =ai2 − `i1u12

u22

=a

(1)i2 − `i1a

(1)12

a(2)22

=a

(2)i2

a(2)22

.

Reiterando el mismo razonamiento concluimos que

uij = 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 Gaussmientras que L esta formada por los elementos que se han utilizado para hacer ceros enel proceso. Esto es, el elemento i, j de L, denotado por `ij, coincide con la constante `ij

calculado en la lınea 03 del metodo de Gauss y por tanto no hay una contradiccion denotaciones.

En particular, la propiedad anterior propone una forma alternativa de calcular la de-scomposicion LU de una matriz es la siguiente modificacion del programa del Ejercicio 3.1:

11 for i=1:n-1}

12 a(i,i+1:n)=0; %hacemos cero la columna i

13 for k=i+1:n}

14 l(k,i)=a(k,i)/a(i,i);

15 a(k,i+1:n)=a(k,i+1:n)-l(k,i)*a(i,i+1:n);

16 end

17 end

La matriz U estarıa entonces almacenada en a.

Ejercicio 3.10 Una forma compacta de devolver la descomposicion LU es insertar L en laparte triangular inferior de a. De esta forma, tras aplicar el metodo, a tiene en la parte superiorla matriz U , mientras que por debajo de la diagonal encontramos L (exceptuando su diagonalde 1s). Implementa esta modificacion.

46

Page 53: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 definidaspositivas. Este tipo de matrices puede descomponerse en la forma

A = LL>

donde

L =

`11

`21 `22...

.... . .

`n1 `n2 · · · `nn

.

Gracias a la simetrıa de la matriz, tanto el numero de operaciones como de posicionesde memoria requeridos pueden reducirse a la mitad. El algoritmo resultante es conocidocomo el metodo de Cholesky.

Metodo de Cholesky

01 for k = 1:n

02 `kk =

√√√√akk −k−1∑r=1

`2kr

03 for j = k + 1:n

04 `jk =(ajk −

k−1∑r=1

`jr`kr

)/`kk

05 end

06 end

Ejercicio 3.11 Implementa una funcion que tenga como entrada una matriz A y devuelvala 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 triangulary 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

Page 54: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador3.2 Descomposiciones matriciales LECCION I

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

A = LU

donde L = P−1L, de forma que L es una permutacion de la matriz triangular inferior9.

La siguiente subrutina devuelve esa descomposicion.

01 % LUPERMUTACION

02 %

03 % [L,U]=LUPERMUTACION(A)

04 %

05 % devuelve U triangular superior, L permutacion

06 % por filas de una matriz triangular inferior con

07 % 1s en la diagonal de forma que A=L*U

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, implementadasen Matlab. Algunos de los comandos relacionados son

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

48

Page 55: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION I Capıtulo 3. Metodos directos para sistemas de ecuaciones lineales

[l,u]=lu(a) devuelve u triangular superior, l permutacion de una triangular inferiorcon 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 diagonaly 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 conlas notaciones introducidas r es precisamente la traspuesta de la matrizL, expuesta en nuestro algoritmo. El comando asume que la matriz essimetrica por lo que solo trabaja con la parte superior de la matriz.

Otra descomposicion habitual10 es la denominada QR que devuelve Q ortogonal (es decir,Q>Q = In) y R triangular superior de forma que A = QR. El comando encargado de estatarea es qr.

Con estas instrucciones la solucion de un sistema utilizando la descomposicion LU seejecuta con las siguientes lıneas

[l,u]=lu(a); x=u\(l\b);

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

Nota historica11

Ideas similares a la eliminacion gaussiana pueden encontrarse muchos siglos atras, conreferencias que se remontan a las matematicas babilonicas y chinas. Carl Friedreich Gaussintrodujo el metodo que lleva su nombre entorno a 1800 cuando trataba de resolver unproblema de ajuste por mınimos cuadrados relacionado con el calculo de la orbita delasteroide Palas. Parece ser que Joseph Louis Lagrange habıa utilizado ideas similares 50anos antes para dilucidar si una forma cuadratica (hoy dirıamos matriz) era definida pos-itiva. El matematico aleman Carl Gustav Jacob Jacobi extendio la idea de la eliminaciongaussiana a matrices arbitrarias.

Es resenable que la nocion de matriz tal como la conocemos ahora era desconocidapara Gauss y Lagrange. El concepto de matriz, y el algebra asociada (esto es, las opera-ciones) habrıan de esperar a los trabajos de James J. Sylvester (que en 1848 introdujo eltermino matriz) y de Arthur Cayley (que siete anos despues definio el producto matricialidentificandolo con el calculo de la composicion de aplicaciones lineales y definio la in-versa de una matriz). Importantes fueron tambien las contribuciones del fısico Hermann

10Veremos dos algoritmos para obtener esta descomposicion en la Leccion IV. Aunque para la resolucionde sistemas de ecuaciones lineales la descomposicion QR es mas estable numericamente que la LU, sesuele optar por esta ultima por tener un menor coste computacional (aproximadamente la mitad).

11Las 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; “Computersolutions of large system of equations”, G. Merant y “An introduction to Numerical Analysis”, E. Suli yD. Mayers. Estas referencias estan completamente detalladas en la bibliografıa.

49

Page 56: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador3.2 Descomposiciones matriciales LECCION I

Grassmann (introdujo la primera algebra vectorial no conmutativa, basada en el productovectorial de dos vectores; considero tambien el producto de un vector fila por un vectorcolumna 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 fueprobada por primera vez por Paul S. Dwyer en 1944. Curiosamente, la descomposicionde Cholesky es anterior. Publicado postumamente en 1924 en una revista de Geodesia(Andre-Louis Cholesky murio en 1918). El trabajo original trataba sobre la resolucionde un problema de ajuste por mınimos cuadrados y paso desapercibido hasta que fuerescatado por John Todd a finales de los anos 1940.

Los primeros analisis sobre la estabilidad numerica de la eliminacion gaussiana, esdecir la viabilidad de su programacion, se remontan a los trabajos de Harold Hotelling,Alan Turing12, John von Neumann y Herman Heine Goldstine. Los resultados inicialeseran descorazonadores. Harold Hotelling probo en torno a 1940 que el error de redondeopodrıa crecer como 4n donde n era el orden de la matriz. Este resultado colocaba al metodode Gauss como un metodo inviable para la resolucion de grandes sistemas lineales. Turingllego a resultados similares de manera informal. El analisis de Neumann y Goldstine yaprobaba que el metodo era estable para matrices definidas positivas13. James H. Wilkinson,reconocido universalmente como el padre del analisis moderno de estabilidad (frente a loserrores de redondeo), extendio el analisis a matrices generales y mostro que el pivotajemejoraba enormemente la estabilidad del metodo. Lo mas curioso es que el analisis inicialestaba enfocado mas hacia el calculo de la inversa de la matriz que al metodo de Gauss.

Como curiosidad final, Cleve Moler, programador original de Matlab, cita14 a Wilkinsony Todd entre las personas que tuvieron una gran influencia en su formacion y por endeen los orıgenes de Matlab.

12La 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 segundaguerra mundial en Bletchley Park en el descifrado de los codigos alemanes encriptados con la maquinaEnigma mediante la utilizacion del primer ordenador electronico en el mundo (Colossus). El papel queeste trabajo anonimo tuvo en la victoria aliada, los alemanes siempre estuvieron seguros de que su codigoera indescifrable, solo ha empezado a reconocerse en fechas recientes. La presion y aislamiento a la queTuring fue sometido por su homosexualidad, llegando incluso a ser detenido por ello, le llevo al suicidioen 1954 despues de haberse sometido a un tratamiento con bromuro para curarle de su enfermedad.

13En los primeros anos se sugirio incluso resolucion de un sistema Ax = b mediante las ecuacionesnormales A>Ax = A>b (A>A es simetrica y definida positiva).

14 http://www.mathworks.com/company/newsletters/news notes/clevescorner/dec04.html

50

Page 57: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLeccion II

Programacion avanzada en Matlab.Metodos iterativos para sistemas de

ecuaciones lineales

51

Page 58: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador

Page 59: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorIntroduccion

Homer: Marge? Since I’m not talking to Lisa, would youplease 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 won’t beused 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 ofsyrup like I do every morning.Marge: Tell him yourself, you’re ignoring Lisa, not Bart.Homer: Bart, thank your mother for pointing that out.Marge: Homer, you’re not not-talking to me and secondly Iheard what you said.Homer: Lisa, tell your mother to get off my case.Bart: Uhhh, dad, Lisa’s the one you’re 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 devectores y matrices en Matlab, haciendo hincapie especial en la manipulacion de matricessparse. Veremos tambien como se pueden implementar funciones donde el numero deargumentos de entrada y salida son variables.

En la parte matematica, tocaremos la teorıa basica de metodos iterativos para sistemasde ecuaciones lineales. Empezaremos con los metodos clasicos: Jacobi, Gauss–Seidel yrelajacion de Young, para pasar luego a metodos mas modernos y elaborados: el metododel Gradiente y especialmente, el metodo del Gradiente Conjugado.

En esta leccion nos permitiremos hacer algo de Matematicas. Animamos a que el lectorno se asuste por ello y a que trate de entender los enunciados y las demostraciones que seofrecen. Para ello se asumen unos conocimientos mınimos en Algebra Lineal.

53

Page 60: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador

Page 61: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorCapıtulo 4

Matlab: programacion avanzada

4.1. Retorno a las matrices

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

4.1.1. Acceso a partes estructuradas de una matriz

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

diag triu tril

La primera toma la diagonal de una matriz mientras que la segunda y tercera tomanla parte triangular superior (upper) e inferior (lower) respectivamente. Ademas estos co-mandos son algo mas flexibles de lo que pueda parecer a simple vista como veremos acontinuacion.

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

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

55

Page 62: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador4.1 Retorno a las matrices LECCION 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 especificar que diagonal se escoge, o a partir de que diagonal se tomala matriz triangular. La diagonal principal es la cero y las subdiagonales inferiores (respec-tivamente superiores) estan numeradas consecutivamente con numeros enteros negativos(respectivamente positivos). El siguiente ejemplo ilustra estas caracterısticas.

>> 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 loselementos de la diagonal, una matriz triangular superior u con todos los elementos de a situados

56

Page 63: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 4. Matlab: programacion avanzada

encima de la diagonal superior y l una matriz triangular inferior con todas las entradas dedebajo 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 utilizarıas el comando diag para generar una matriz con la diagonalde 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 intercambiarlas filas con las columnas de A. Esto es, las filas de A pasan a ser las columnas de A>.Esta operacion se denota en Matlab con “ ’ ” :

>> a=[1 2 3; 0 2 4];

>> a’

ans =

57

Page 64: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador4.1 Retorno a las matrices LECCION 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: Matlabdistingue entre vectores filas y columnas, y esta diferencia se hace especialmente palpable(y en ocasiones molesta) a la hora de realizar operaciones como productos matriz-vector.

Nota. En Matlab existe tambien el operador “.’”. Sobre matrices reales funciona exac-tamente igual que el comando anterior, pero no ası sobre numeros complejos. Ademas detrasponer, “’”, conjuga todas las entradas. Es decir, cambia el signo a la parte imaginariade cada elemento. Matematicamente hablando, este es el operador de trasposicion o con-jugacion, denotado habitualmente en matematicas con “A∗”. Por contra, “.’” se limita aintercambiar filas por columnas en la matriz:

>> clear i % i es ahora la unidad imaginaria

>> a=[i 1-2i; 1 0.3+4i];

>> a.’

ans =

0 + 1.0000i 1.0000

1.0000 - 2.0000i 0.3000 + 4.0000i

>> a’

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 lamatriz tal como se guarda en memoria. Por ejemplo,

58

Page 65: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 fila ocolumna.

La instruccion

>> b=b(:);

hara de b un vector columna, sea cual sea su formato inicial. Si lo que se desea esun vector fila, 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 modode ejemplo,

>> a=zeros(4,3);

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

a =

59

Page 66: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador4.1 Retorno a las matrices LECCION 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 modificar las dimensiones de una matriz (o arrayen general). Es mas flexible que el comando “:”. �

4.1.2. Mas operaciones sobre matrices

Hasta ahora las operaciones matriciales que han centrado nuestra atencion son las fun-damentales: suma y producto. En Matlab estan tambien implementadas otras operacionescomunes 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 vectoresfilas y columnas, y es aplicable siempre que tengan la misma longitud.

La funcion se puede aplicar a matrices bien por columnas, esta es la forma estandar2,o por filas.

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

>> dot(a,a2) % producto por columnas

ans =

5 7 9

2Recuerda la predileccion de Matlab por las columnas.

60

Page 67: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 elsentido 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. Aplicadosobre matrices funciona de la misma forma que dot o sum. Esto es, devuelve elmaximo de cada columna por defecto, o de cada fila si ası se le indica

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

>> max(v)

ans=

-2

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

61

Page 68: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador4.1 Retorno a las matrices LECCION 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 lınea anterior es que esta instruccion tambiense puede utilizar para comparar dos arrays del mismo tamano

>> 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 vacıo indicamos a Matlab que no existe un segundo vector y que debeproceder a buscar el maximo de a en su segunda dimension, esto es, el maximo porfilas.

min: Calcula el mınimo 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

Page 69: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 definicion de estas normas.

rank: rango numerico de una matriz. Esto es, el numero maximo de filas o columnaslinealmente independientes3.

cond: Calcula norm(a)*norm(inv(a)), el condicionamiento de una matriz4. El condi-cionamiento da una medida de la sensibilidad del sistema a perturbaciones en eltermino independiente.

rcond: estimador del inverso del condicionamiento de una matriz. Es sensiblemente maseconomico de calcular que cond.

Nota. Cuando el comando dot se aplica a dos vectores complejos, procede siempre aconjugar el primer vector. Es decir, matematicamente

dot(u, v) n∑

i=1

uivi.

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 sumarıas los elementos de una matriz?. ¿Como encontrarıas el mınimoy el maximo?. ¿Y su posicion?

3Una matriz tiene, en general, rango maximo por los errores de precision de la maquina. Este comandohace una estimacion del rango, eliminando este factor.

4En realidad no construye la inversa de la matriz por ser costoso.

63

Page 70: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador4.1 Retorno a las matrices LECCION II

4.1.3. Matrices sparse

Las matrices sparse son una importante clase de matrices que surge en diferentesambitos del Analisis Numerico y de las Matematicas y ciencias en general (elementosfinitos, teorıa de grafos,...).

En la Figura 4.1 se puede ver un ejemplo de una matriz sparse simetrica donde lospuntos indican las entradas diferentes de cero. Desde una optica puramente computacionalhace falta desarrollar sistemas de almacenamiento especiales dado que la inmensa mayorıade 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 100×100 y un vector columna b de 100 elemen-tos. Todas las entradas son inicialmente ceros, pero se guarda la estructura basica paraintroducir 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

Page 71: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 utilizartambien 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 matrizllena,

>> 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 sabeel numero de elementos no nulos que tendra dicha matriz. Concretamente

>> a=spalloc(8,7,12)

declara una matriz 8 × 7 con a lo sumo 12 elementos no nulos. Al informar de cuantoselementos no nulos se esperan Matlab hace una gestion mas eficiente de la memoria.

El comando nnz (Non zeros) nos informa del numero de elementos no nulos de unamatriz, mientras que su esquema (pattern), como el que aparece en la Figura 4.1, se obtienecon 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

Page 72: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador4.2 Argumentos de funciones LECCION II

4

>> spy(a)

La grafica se despliega en una ventana separada.Todas las operaciones que hemos visto estan adaptadas al nuevo entorno. Ası, los

operadores

: triu tril diag

devuelven vectores/matrices sparse. Las operaciones

* + .* dot ’

estan asimismo optimizadas. El problema de generar codigo eficiente no es tan simplecomo pudiera parecer. Por ejemplo, si se aplica la funcion dot a dos vectores sparse espreciso saber antes que entradas hay que multiplicar. De otra forma podrıamos estardedicando un alto porcentaje de nuestro esfuerzo en simplemente calcular productos porcero. 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 arand);

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

4.2. Argumentos de funciones

Veremos a continuacion como se pueden programar funciones en las que tanto elnumero de argumentos de entrada como de salida sean variables. Esta caracterıstica dotade una mayor flexibilidad a la programacion en Matlab.

Los comandos esenciales que precisamos son

varargin nargin varargout nargout

La instrucciones nargin y nargout informan respectivamente sobre el numero de variablesde entrada y el numero de variables de salida (number of input arguments y number ofoutput arguments).

Una funcion puede aceptar una serie de argumentos fijos, al estilo de las funciones queprogramamos en la leccion anterior, y un conjunto de argumentos opcionales, que pueden

66

Page 73: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 4. Matlab: programacion avanzada

ser o no especificados por el usuario. Para su acceso se utilizan respectivamente varargin(variable input argument) y varargout (variable output argument) mediante llaves ({})5.

Mostramos a continuacion un ejemplo de utilizacion conjunta de estas nuevas instruc-ciones. En la cabecera se informa de que hace la funcion, dependiendo de los argumentosde 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 matriza, uno opcional, el termino independiente, y devuelve dos o tres argumentos segun serequiera. 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 =

5Las variables varargin y varargout son de un tipo especial denominado cell array. En la LeccionIV estudiaremos su funcionamiento con mas detalle.

67

Page 74: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador4.2 Argumentos de funciones LECCION 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 segun la“siguiente cabecera”

% DESCOMPOSICIONLU2

%

% R = DESCOMPOSICIONLU2(A)

% Si A es simetrica definida positiva devuelve

% R triang superior tal que A=R’R

% [R,X] = DESCOMPOSICIONLU2(A,B)

% Si A es simetrica definida positiva devuelve

% R triang superior tal que A=R’R 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

Page 75: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 estacomparacion? ¿Como se puede utilizar para comprobar si efectivamente la matriz es simetrica?¿Y para ver que es definida positiva?.

69

Page 76: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador4.2 Argumentos de funciones LECCION II

70

Page 77: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorCapıtulo 5

Matrices sparse en Matematicas.Metodos iterativos para sistemas deecuaciones lineales

5.1. Metodo de Gauss para matrices sparse

Esta seccion se centra en el estudio del metodo de Gauss para matrices sparse. Mostraremoslos 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 estosefectos adversos. Sirve asimismo para ahondar en la problematica de los metodos directosy 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 desi es adecuado utilizar “\” para matrices con formas especiales como por ejemplo matricestriangulares o permutaciones de estas, para las que la eliminacion gaussiana no es nece-saria puesto que las variables se pueden despejar de forma progresiva. AfortunadamenteMatlab detecta estas estructuras basicas y resuelve de una manera optima el sistema. Sise consulta la ayuda para este comando se puede leer que se reconoce si una matriz es,por ejemplo, sparse o llena, simetrica o no simetrica, triangular o permutacion de esta,bandeada (los elementos concentrados en torno a la diagonal), de Hessenberg1 (con todoslos 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 tiposse puede realizar en un numero de operaciones despreciable respecto a las del metodo deGauss.

Hemos visto al final de la Leccion I que el metodo de Gauss es matematicamenteequivalente a calcular dos matrices L y U triangular inferior y superior respectivamentecon 1s en la diagonal de L de forma que

A = LU.

1Ver Leccion IV

71

Page 78: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.1 Metodo de Gauss para matrices sparse LECCION II

Si se dispone de esta descomposicion, la resolucion del sistema de ecuaciones se reduce ala resolucion de dos sistemas triangulares,

Ax = b, Ly = b, Ux = y,

o en codigo de Matlab2

[l,u]=lu(a); x=u\(l\b);

Una caracterıstica muy habitual del metodo de Gauss para matrices sparse es el efectorelleno (en ingles fill in), esto es, la insercion de nuevos elementos en el proceso. Porejemplo, tras un unico paso del metodo de Gauss

x x x x x xx xx xx xx xx x

x x x x x xx x x x xx x x x xx x x x xx x x x xx x x x x

y la matriz es ahora llena. Sin llegar a esos extremos, es habitual que las necesidadesde memoria se multipliquen al aplicar la eliminacion gaussiana. En la descomposicionLU esto se refleja en un incremento en el numero de entradas no nulas de la matriz conlos problemas que ello lleva consigo (mayores requerimientos de memoria, mayor costocomputacional,...).

Vamos a ver como podemos reducir este molesto comportamiento con un reorde-namiento adecuado de filas (ecuaciones) y columnas (incognitas). Dado que en aplica-ciones practicas las matrices simetricas son muy comunes3 nos restringiremos en lo quesigue a esta familia de matrices. Con el fin de preservar la simetrıa, cualquier intercambiode filas debe ser seguido por el intercambio de columnas correspondientes:

x 0 0 x x0 x x 0 00 x x 0 xx 0 0 x 0x 0 x 0 x

1↔ 3−→

x x 0 0 xx x 0 0 00 0 x x x0 0 x x 0x 0 x 0 x

En los comandos

symrcm symmmd

estan implementados dos algoritmos de reordenacion muy populares: el algoritmo deCuthill-McKee inverso y el algoritmo de mınimo grado. El primero reordena de formaque los terminos no nulos de la matriz tienden a estar concentrados cerca de la diagonal.El algoritmo de mınimo grado por su parte tiende a mover los elementos no nulos hacia elfinal de la matriz de forma que la estructura inicial de la matriz es esencialmente diagonaly el efecto relleno surge cuando el metodo de Gauss esta ya muy avanzado.

2Recuerda la colocacion de los parantesis.3O al menos matrices con estructura simetrica, esto es, a(i, j) 6= 0 ⇔ a(j, i) 6= 0. Todo lo que sigue es

igualmente valido para este tipo de matrices.

72

Page 79: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

Figura 5.1: Resultado de reordenar las filas y columnas con symrcm y symmmd.

Este tipo de tecnicas tuvieron su origen en la resolucion de ecuaciones en derivadasparciales mediante metodos numericos. Un buen ejemplo lo encontramos en la Figura 5.1obtenido al aplicar estas dos reordenaciones a una matriz proveniente de la resolucion de laecuacion de Laplace por elementos finitos. Observa como se reduce el numero de entradasen las matrices L y U cuando se aplica alguno de los algoritmos anteriores (referido en lafigura 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 introducidocon los algoritmos de reordenamiento anteriores. Para ello se debe utilizar el comando

>> [l,u]=lu(a,0);

El segundo argumento, que solo esta disponible si la matriz a es sparse, fija un umbralpara la realizacion del pivotaje parcial. El valor 1 es el de defecto. De esta forma, valoresproximos a cero obligan a que el pivotaje se produzca solo cuando el desequilibrio entre

73

Page 80: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.1 Metodo de Gauss para matrices sparse LECCION II

el pivote y el resto de elementos de la columna sea muy acusado. Surge seguidamente lacuestion de estabilidad del metodo sin pivotaje. Afortunadamente para matrices definidaspositivas 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 lınea 01, el vector p recoge una permutacion de 1:n (n es el numero de filas ycolumnas de a) que reduce el efecto relleno de L y U . La matriz a(p,p) es el resultadode reordenar ecuaciones e incognitas. La lınea 04 reordena las incognitas para recuper-arlas en su orden original. Observa que la lınea 03 podrıa sustituirse simplemente porx=u\(l\b(p));

Nota. A partir de la version 7.0, el comando symmmd que contiene el algoritmo de mınimogrado se ha declarado obsoleto y sera eliminado en futuras versiones. Se recomiendautilizar symamd. �

Comentarios finales

Si la matriz es ademas simetrica definida positiva podemos utilizar la descomposicionde 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, conreordenacion 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

Page 81: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

x x 0 x 0x x x 0 x0 x x 0 0x 0 0 x 0 0 x 0 0 x

1

2

3

4

5

x x 0 x 00 x x x x0 x x 0 00 x 0 x 0 0 x 0 0 x

x x 0 x 00 x x x x0 0 x x x0 0 x x x 0 0 x x x

x x 0 x 00 x x x x0 0 x x x0 0 0 x x 0 0 0 x x

x x 0 x 00 x x x x0 0 x x x0 0 0 x x 0 0 0 0 x

2

5

1

3

4

x 0 0 0 x0 x x 0 x0 0 x 0 x0 0 0 x x 0 0 x x x

x 0 0 0 x0 x x 0 x0 x x 0 00 0 0 x x x x 0 x x

x 0 0 0 x0 x x 0 x0 x x 0 00 0 0 x x 0 x 0 x x

x 0 0 0 x0 x x 0 x0 0 x 0 x0 0 0 x x 0 0 0 x x

x 0 0 0 x0 x x 0 x0 0 x 0 x0 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 reiteradamentesistemas de ecuaciones con la misma matriz de coeficientes 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 senalar no obstante que ambosse basan en identificar la estructura de una matriz con la de un grafo no dirigido,donde dos nodos i y j estan conectados si y solo si a(i,j)6=0. El proceso de elim-inacion gaussiana se ve como la eliminacion sistematica de nodos y la creacion denuevos enlaces entre los nodos restantes. Concretamente, si hacemos un cero con lafila i en la fila j, aparecen nuevos enlaces entre los nodos que estaban unidos con elnodo i y los conectados con j. El problema se reescribe ahora en terminos de retirarlos nodos en el orden adecuado de forma que se minimice el numero de nuevos ejescreados (Figura 5.2).

Los graficos de la Figura 5.1 han sido creados a traves del siguiente fichero 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

Page 82: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

[p,e,t]=refinemesh(’lshapeg’,p,e,t); % refinamiento

[a,b]=assempde(’lshapeb’,p,e,t,1,0,1);

% a es la matriz (sparse) y b el termino independiente

% Primera fila de dibujos

[l,u]=lu(a,0); % no pivotaje

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 tamano moderado4, casi nadie dudaen utilizar el metodo de Gauss en alguna de sus multiples variantes (incluidas las de-scomposiciones matriciales). Sin embargo, la utilizacion de metodos iterativos se tornaimprescindible en problemas con matrices grandes, especialmente si son sparse, donde elmetodo de Gauss presenta las siguientes dificultades:

Es caro: O(4n3/3) operaciones

Es destructivo: retoca la matriz del sistema, y esto puede tener consecuencias muypoco deseables, como hemos visto con matrices sparse. Ademas requieren en muchasocasiones guardar una copia de la matriz.

4Es difıcil definir que se entiende por tamano moderado. Ciertamente, tamanos enormes en la decadade los anos 70 son ahora perfectamente manejables en un pequeno PC.

76

Page 83: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

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

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

5.2.1. Definicion

Esencialmente, un metodo iterativo toma un sistema lineal

Ax = b

y construye una sucesion de vectores de forma que

xm → x, cuando m→∞.

La forma de construir esta sucesion depende, obviamente de la matriz A, del terminoindependiente y de como se arranque el metodo numerico (vector inicial).

Existen multitud de esquemas diferentes pero la mayorıa comparten las siguientesdesventajas:

No siempre convergen en un numero razonable de iteraciones, y en muchas ocasionesni siquiera convergen.

Los resultados teoricos sobre convergencia son a menudo pobres. Esto es, en generalexiste convergencia en situaciones mucho mas generales de lo que la teorıa predice.Ademas, chequear estas hipotesis puede resultar tan costoso como resolver el mismosistema.

El ultimo punto merece cierto comentario. Los sistemas lineales provienen en generalde problemas fısicos de los que se dispone de informacion a priori, entre las que se puedenencontrar las hipotesis que aseguran la convergencia de un metodo iterativo. Por ejemplo,se puede saber que una matriz es definida positiva, y no hay necesidad por tanto de haceresta comprobacion.

Por contra, los metodos iterativos tienen las siguientes e importantes ventajas:

Son metodos no destructivos. No modifican la matriz del sistema y, en general,precisan solo multiplicar por la matriz del sistema o por partes de ella.

Suelen ser mas estables frente a los errores de redondeo5.

Se dispone en cada paso de una aproximacion de la solucion.

5Carl Friedrich Gauss, que introdujo un metodo precursor del metodo conocido actualmente comometodo de Gauss–Seidel, comentaba en una carta a su colega Christian Ludwig que los calculos sepodıan realizar aun cuando “se estuviese medio dormido” o “pensando en cosas mas importantes”. Nohay que olvidar que en su epoca todos los calculos se hacıan a mano. En nuestros dıas, se plantea elmismo problema con los errores de redondeo.

77

Page 84: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

5.2.2. Detalles sobre la implementacion

En un metodo iterativo no podemos esperar calcular la solucion exacta, sino hallaruna aproximacion con una tolerancia prefijada. Por tanto debemos fijar un criterio deparada que de por terminado el metodo cuando la solucion se considere suficientementebuena. Esto no es grave. Los sistemas de ecuaciones lineales suelen provenir de metodosque calculan soluciones aproximadas de problemas fısicos e ingenieriles. No tiene puessentido obcecarse en calcular la solucion exacta de un problema aproximado.

Ası hemos de elegir un criterio de parada que termine la ejecucion cuando la soluciones suficientemente buena. Una posibilidad es medir la diferencia entre dos iteracionesconsecutivas

‖xm+1 − xm‖en alguna norma que queda a eleccion del programador o del usuario. Si la diferencia espequena, se considera que estamos cerca de la solucion y se finaliza el metodo.

De nuevo nos encontramos con el problema de definir pequeno. Por ejemplo, unadiferencia de 1.4 entre dos iteraciones puede ser grande si la solucion tiene un tamano‖x‖ ≈ 10−1 o pequena si ‖x‖ ≈ 1010.

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 fijar el criterio

01 aux=norm(x-y); % norma 2 entre x e y

02 if (aux<eps1+eps2*norm(x))

03 disp(’Convergencia alcanzada...’

04 ..........

05 end

En la lınea 02 tenemos en cuenta tanto el error absoluto (eps1) como el error relativo(eps2). Estos valores son parametros que fijan el criterio de parada y pueden ser dadospor el usuario.

Otros criterios se basan en calcular r = b−Ax y calcular el tamano. Es decir, medimoscuanto 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 relacionadocon su tamano relativo, con respecto al termino independiente, y otra absoluta. Ambosse 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 exprofeso. En muchos casos se toma simplemente eps1= 0.

Por otro lado, y desde un punto de vista computacional, debemos evitar que el metodoentre en un bucle infinito. Es decir, fijar un numero maximo de iteraciones de forma quesi se supera, se termine el metodo con un mensaje de error6. Que un residuo sea pequeno

6Existe otro problema: que la solucion crezca de forma que supere la cantidad maxima representableen coma flotante (overflow). Matlab devolverıa inf o -inf.

78

Page 85: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

o que dos iteraciones consecutivas cercanas indiquen proximidad a la solucion exacta nosiempre es cierto, pero suele ser muy buena senal.

5.2.3. Metodos iterativos clasicos

El estudio y desarrollo de los metodos iterativos clasicos, tambien denominados afinespor su forma de construccion, surgio con fuerza en los anos 50, aunque el origen de algunode ellos se remonta al siglo XIX. El desarrollo de estos metodos fue paralelo al desarrollode los ordenadores y vino muy condicionado por el tipo de problemas que se deseabanresolver. Estos problemas eran principalmente los provenientes de ecuaciones en derivadasparciales que daban lugar a matrices grandes y sparse. El uso de los metodos iterativosafines en nuestros dıas es menos habitual, habiendo sido superados por los metodos de tipoKrylov 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 precondicionadoresde los metodos mas modernos y potentes, es decir, como un preproceso que acelera laconvergencia de los mismos. Sin embargo su simplicidad y el modo que tienen de ilustrarel diseno y funcionamiento de un metodo iterativo fundamentan su exposicion en estosapuntes.

Conocimientos previos

Comenzaremos introduciendo algunas normas vectoriales que nos serviran para medirel tamano de los vectores y matrices. Dado un vector

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

consideramos las normas

‖x‖1 := |x1|+ |x2|+ . . . + |xn|, ‖x‖2 :=√

x21 + x2

2 + . . . + x2n,

‖x‖∞ := maxi=1,...,n

|xi|.

Es facil ver que efectivamente las tres expresiones definen una norma en Rn. Las relacionesentre 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 ellasestan implementadas en Matlab, como ya se vio en la Seccion 4.1.2.

Cada norma vectorial define a su vez una norma sobre las matrices

‖A‖ = sup‖x‖=1

‖Ax‖

denominada norma matricial inducida. En la expresion anterior sup es el supremosobre todos los vectores de norma 1, que es de hecho un maximo (el supremo se alcanza).Se puede comprobar que

‖A‖1 = maxj=1,...,n

n∑i=1

|aij|, ‖A‖∞ = maxi=1,...,n

n∑j=1

|aij|.

79

Page 86: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

La norma ‖ · ‖2 tiene una expresion mas complicada que dificulta su calculo practico. Enconcreto

‖A‖2 =√

ρ(A>A)

donde ρ(B), denominado radio espectral, denota el mayor de los valores absolutos delos 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 unvector medido en la norma ‖ · ‖.

Definicion y condiciones de convergencia

Los metodos iterativos lineales (o basados en iteraciones afines) 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 x0 una aproximacion de la solucion. Si no se conoce se puede tomar porejemplo el vector nulo.

Resolver en cada paso m

Mxm+1 = Nxm + b. (5.1)

Es facil ver que si la sucesion construida en (5.1) converge a algun x, entonces el vectores la solucion del sistema. Aun es mas, se comprueba facilmente que

xm+k+1 − x = (M−1N)(xm+k − x) = . . . = (M−1N)k(xm+1 − x).

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

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

80

Page 87: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

Observa que en el resultado anterior no se especifica la norma utilizada. Otro detalle alque a veces se presta poca atencion es que la convergencia del metodo ocurre sea cual seax0, es decir, independientemente de como se arranque el metodo y de cual sea el terminoindependiente. Claramente si se tiene una estimacion buena de la solucion el metodoconvergera en menos iteraciones, pero no es una condicion imprescindible para asegurarla convergencia7.

No es difıcil ver que

ρ(B) ≤ ‖B‖

para cualquier norma inducida, y por tanto8

ρ(B) = (ρ(Bk))1/k ≤ (‖Bk‖)1/k ∀k ∈ N.

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

lımk→∞‖Bk‖1/k = ρ(B)

Por tanto se concluye que una condicion equivalente de convergencia es que todoslos valores propios de B = M−1N 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

‖xm+1 − x‖ ≤ C(m)ρ(B)m‖x1 − x0‖

para todo m ≥ m0 y donde C(m) ≥ 1, con C(m)→ 1 cuando m→∞. La cantidad ρ(B)recibe en ocasiones el nombre de velocidad asintotica de convergencia. La estimacionanterior justifica esta denominacion dado que mide la reduccion media del error esperadaen 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 resolverdirectamente el sistema de ecuaciones.

En general, uno asegura la convergencia cuando M recoge la informacion mas impor-tante de A, de forma que N = M −A tenga un tamano pequeno comparado con M . Porotro lado, se debe tener en cuenta la definicion del metodo (5.1) y que por tanto en cadaiteracion hay que resolver un sistema de ecuaciones. Ası, interesa que M sea sencilla desdeel punto de vista de la resolucion del sistema lineal (por ejemplo, diagonal, triangular,...)y que simultaneamente recoja la mayor informacion posible de A. �

7Esta propiedad se pierde cuando se resuelven ecuaciones y sistemas no lineales. En este caso, losmetodos numericos convergen solo si se arranca suficientemente cerca de la solucion.

8Si λ es valor propio de B, λ2 lo es de A2.

81

Page 88: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

Metodos de Jacobi, de Gauss–Seidel y de relajacion de Young

Sea el sistema Ax = b donde

A =

a11 a12 . . . a1n

a21 a22 . . . a2n...

.... . .

...an1 an2 . . . ann

La familia de metodos que vamos a exponer se basa en considerar la siguiente descom-posicion de A

A = D − L− U

donde

D =

a11

a22

. . .

ann

, L =

0 0 · · · 0−a21 0 · · · 0

......

. . ....

−an1 −an2 · · · 0

, U =

0 −a12 · · · −a1n

0 0 · · · −a2n...

.... . .

...0 0 · · · 0

.

El metodo de Jacobi consiste en tomar en la definicion del metodo iterativo M = Dy N = L + U , es decir,

Dxm+1 = (L + U)xm + b.

Para calcular xm+1 hay que resolver por tanto un sistema diagonal cuyo coste es despre-ciable. Visto componente a componente, tenemos que si

xm =[x

(m)1 , x

(m)2 , . . . , x(m)

n

]>∈ Rn

entonces

x(m+1)i =

1

aii

[bi −

∑j 6=i

aijx(m)j

], i = 1, . . . , n.

Para algunos tipos especiales de matrices se sabe que el metodo converge e incluso sedispone de informacion sobre la velocidad de convergencia.

Una matriz es estrictamente diagonal dominante por filas si

|aii| >∑j 6=i

|aij|, ∀i

y por columnas si

|ajj| >∑i6=j

|aij|, ∀j.

Teorema 5.3 Si la matriz es estrictamente diagonal dominante por filas o columnas el meto-do de Jacobi converge.

Ejercicio 5.1 (matematico) Probar el teorema anterior. ¿Cuando convergera mas rapido?(Ayuda. Construir la matriz B = D−1(L + U). Probar que ‖B‖∞ < 1 si es dominante por filaso ‖B‖1 < 1 si es dominante por columnas. Aplicando el Teorema 5.2, se deduce el resultado.)

82

Page 89: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

Para dar una descripcion del metodo de Jacobi en pseudocodigo fijamos

x = aproximacion inicial, mmax = numero maximo de iteraciones,eps1 = tolerancia absoluta, eps2 = tolerancia relativa,

y tomamos como criterio de parada la norma euclıdea de la diferencia entre dos iteracionessucesivas del metodo. La eleccion de la norma es libre, queda a eleccion del programador(podıamos tomar por ejemplo la norma 2 o la norma infinito).

Una primera version de nuestro algoritmo es la siguiente

Jacobi

01 for m=1:mmax

02 error=0; y=x03 for i=1:n

04 xi =(bi −

n∑j=1j 6=i

aijyj

)/aii

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 fijando la cabecera que contendra la ayuda de la funcion. Nosva a servir de que estructura vamos a dar a la entrada y salida de datos. Dicho esto, laimplementacion 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

Page 90: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

13 %

14 %[X,IT]= JACOBI(A,B,ITMAX,...

15 % EPS1,EPS2,X0) arranca el metodo con X0

16 %

17 function [x, varargout]=jacobi(a,b,varargin)

18

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

Page 91: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

59 end

60 return

Recuerda que el comando break, utilizado en la lınea 48 provoca la salida automaticadel bucle, dando por finalizado la ejecucion del metodo y pasando a la parte del codigoencargada de devolver los resultados obtenidos.

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

Observa que el codigo realmente dedicado al metodo de Jacobi se reduce a apenas diezlıneas (39-50) con el resto de la subrutina dedicada al control del algoritmo y a la saliday entrada de datos. Se observa ademas que la lınea 43 permite implementar en una unicalınea (44) el producto de la lınea 04 del pseudocodigo.

El codigo anterior, sin embargo, es optimizable. El ejercicio siguiente ahonda en unaspecto en particular

Ejercicio 5.4 Otra forma alternativa de implementar el metodo es reemplazar las lıneas42-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 realizamosoperaciones de mas (multiplicamos por la diagonal para luego restar su contribucion), peroel costo es despreciable y la operacion es ahora puramente matricial. Implementa esta nuevaforma y comprueba el resultado. ¿Obtienes mejoras en el redimiento del metodo9?

El metodo de Gauss–Seidel10 consiste en tomar M = D − L y N = U , es decir

(D − L)xm+1 = Uxm + b. (5.2)

Para calcular xm+1 hay que resolver un sistema, en este caso triangular. Repasando concuidado las operaciones, observamos que

x(m+1)i =

1

aii

[bi −

i−1∑j=1

aijx(m+1)j −

n∑j=i+1

aijx(m)j

], i = 1, . . . , n.

9Deberas probar con matrices grandes. La orden rand te puede servir para ese fin. Una forma deasegurar la convergencia es generar matrices estrictamente diagonal dominantes. ¿Como se puede haceresto?.

10El nombre de este algorimo es muy curioso. Segun diversos autores (ej. George E. Forsythe o GerardMeurant), Carl Friedrich Gauss no diseno exactamente este metodo y Philipp Ludwig von Seidel, que loestudio a finales del siglo XIX, desaconsejaba su uso. Gauss desarrollo un metodo muy similar cuandotrataba de resolver un problema de geodesia que llevaba a un sistema lineal que no era compatibledeterminado.

85

Page 92: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

Escrito en forma algorıtmica,

Gauss–Seidel

01 for m=1:mmax

02 error=0; y=x03 for i=1:n

04 xi =(bi −

i−1∑j=1

aijxj −n∑

j=i+1

aijyj

)/aii

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 Gauss–Seidel procede autilizar la nueva componente calculada xi tan pronto es posible mientras que Jacobi solola utiliza en la nueva iteracion. Es por ello que Gauss–Seidel es (casi siempre) superior aJacobi. No hay razones matematicas que permitan apoyar esta impresion. De hecho existenmatrices para las que Jacobi converge y Gauss–Seidel diverge, aunque hace falta construirun ejemplo ad hoc, no es facil encontrar tal ejemplo, para comprobar esta afirmacion.Desde un punto de vista practico, si Jacobi converge es altamente probable que lo hagatambien Gauss–Seidel y generalmente, este lo hara en menos iteraciones.

Teorema 5.4 El metodo de Gauss–Seidel converge si

la matriz es estrictamente diagonal dominante por filas o columnas;

o

la matriz es simetrica definida positiva.

Ejercicio 5.5 Programa el metodo de Gauss–Seidel modificando de forma apropiada la fun-cion del Ejercicio 5.2.

Ejercicio 5.6 De manera similar a lo que se propuso en el Ejercicio 5.4, podemos implementarla parte central del metodo de Gauss–Seidel mediante

x=l\(b-u*y)

o bien con el doble numero de operaciones con

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

donde

86

Page 93: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 estasimplementaciones?.(Ayuda: recuerda los comandos diag, triu y tril de la Seccion 4.1.3)

Ejercicio 5.7 El metodo de Gauss–Seidel tiene una curiosa asimetrıa: la primera componentede cada xm+1 se calcula utilizando los valores de la anterior iteracion xm, mientras que la ultimacomponente utiliza todas las componentes de la nueva iteracion xm+1. Se puede plantear elmetodo de Gauss–Seidel inverso que es el que resulta de intercambiar los papeles de L y U en(5.2). Ahora la situacion es justamente la recıproca. ¿Mejora la velocidad de convergencia delmetodo?

Ejercicio 5.8 El metodo de Gauss–Seidel simetrizado o cıclico trata de solventar la asimetrıasenalada en el ejercicio anterior. Consiste en encajar dos iteraciones, una con Gauss–Seidel yotra con el metodo de Gauss–Seidel inverso. Es decir, dado xm, se aplica un paso del metodode Gauss–Seidel para obtener un nuevo vector xm+1/2. Seguidamente se calcula un paso delmetodo Gauss–Seidel inverso y asıse obtiene la nueva aproximacion xm+1.

Implementa este metodo. ¿Se reduce el numero de iteraciones necesarias para alcanzar laconvergencia? ¿Y el costo por iteracion? ¿Te parece rentable esta aproximacion?.

El ultimo representante de esta familia de metodos clasicos que estudiaremos es elmetodo de relajacion de Young. Introducido y estudiado independientemente porDavid M. Young (en su tesis doctoral) y Stanley P. Frankel sobre 1950, es una simplemodificacion del metodo de Gauss–Seidel que trataba, como buena parte de los metodospropuestos en estos anos, de acelerar la convergencia de los metodos de Gauss–Seidel yJacobi.

La modificacion propuesta consiste en realizar un promedio sobre la aproximacion queproporcionarıa Gauss–Seidel y la iteracion anterior.

Concretamente, la expresion es

x(m+1)i = (1− ω)x

(m)i +

ω

aii

[bi −

i−1∑j=1

aijx(m+1)j −

n∑j=i+1

aijx(m)j

], i = 1, . . . , n.

Si ω = 1 recuperamos el metodo de Gauss–Seidel. El objetivo es escoger ω adecuadamentepara acelerar la convergencia del metodo.

No es facil encontrar el valor optimo de ω, aunque necesariamente ω ∈ (0, 2) pues encaso contrario el metodo diverge.

Si la matriz es simetrica definida positiva o tridiagonal el metodo de relajacion convergepara cualquier ω ∈ (0, 2). Tambien converge si es estrictamente diagonal dominante (porfilas o columnas). Sin embargo, salvo para matrices tridiagonales, poco se puede deciracerca de la eleccion optima del parametro ω, y aun en este caso, la determinacion exactadel parametro optimo exige resolver un problema bastante complicado.

Desde un punto de vista practico, el parametro se estima mediante ensayo–error. Deforma algo sorprendente, en problemas practicos es muy habitual que ω > 1. De ahı elnombre que se le da a veces de Sobrerrelajacion (overrelaxed).

87

Page 94: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

Por ultimo, aunque no sea inmediato, se puede comprobar que este metodo encaja enel 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 defectopodrıa ser ω = 1 con lo que tendrıamos el metodo de Gauss–Seidel.

Ejercicio 5.10 De nuevo, la parte central del metodo de relajacion se puede implementaren 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 quefacilitaran la exposicion de los metodos de tipo gradiente.

Recordemos que todos los vectores se consideran como vectores columna. Dada A unamatriz simetrica definida positiva, la operacion que a cada par de vectores x, y leasigna el numero real

x>Ay

es un producto escalar, esto es, cumple las propiedades que definen un producto escalar11:

1. (αx + βy)>Az = αx>Az + βy>Az, ∀α, β ∈ R, ∀x,y, z ∈ Rn;

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

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

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

x>Iny = x>y

es simplemente el producto escalar habitual en Rn 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 extenderal producto definido por A, de forma que

x ⊥A y ⇐⇒ x>Ay = 0

y en este caso x e y se dicen A−ortogonales.

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

88

Page 95: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

La norma asociada al producto escalar anterior se conoce como norma de energıay su expresion viene dada, obviamente, por

‖x‖A :=√

x>Ax.

Todas las normas son equivalentes en Rn, pero para esta norma se tiene ademas la esti-macion

λn‖x‖2 ≤ ‖x‖A ≤ λ1‖x‖2donde λ1 ≥ λ2 ≥ .... ≥ λn > 0 son los valores propios, todos reales por ser A simetrica ypositivos por ser definida positiva. La cantidad

κ(A) =λ1

λn

,

que sera relevante en lo que sigue, es el condicionamiento de la matriz12. Obviamente,κ(A) ≥ 1.

Construimos la funcionF (x) = 1

2x>Ax− x>b

conocida como funcional de energıa. 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 lamatriz hessiana de F es la propia matriz A, que es definida positiva, este extremo sera unmınimo. Hemos llegado por tanto a la siguiente conclusion:

resolver Ax = b es equivalente a encontrar el mınimo de F

En esta observacion se basan los metodos de descenso: en lugar de resolver el sistema deecuaciones Ax = b, nos preocupamos en buscar el mınimo de F . Es esencial que A seadefinida 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 moviendoseen trayectorias zigzagueantes hasta alcanzar el mınimo. Concretamente, dada una aprox-imacion, fijamos 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 xm que deberıa converger a x, siguiendo estospasos.

Calcular una direccion de descenso dm.

Descender una cantidad ξm, tomando como nueva aproximacion

xm+1 = xm + ξmdm.

12El condicionamiento se define tambien para matrices arbitrarias reemplazando los valores propios porlos denominados valores singulares, o mas en general, definiendolo como el producto de la norma de Apor la norma de su inversa. En general el condicionamiento de la matriz mide la sensibilidad del sistemade ecuaciones lineales asociado a variaciones del termino independiente.

89

Page 96: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

Se procede ası hasta que hay convergencia.

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

F (xm+1) = mınα∈R

F (xm + αdm)

es decir, se trata de minimizar, una vez escogida la direccion de descenso dm, el funcionalde energıa. Definiendo

g(α) = F (xm + αdm)

podemos comprobar que

g′(α) = α d>mAdm − d>m (b− Axm)︸ ︷︷ ︸rm

y por tanto la cantidad de descenso viene dada por

ξm :=r>mdm

d>mAdm

, (5.3)

(obtenido al imponer g′(α) = 0). El vector rm = b − Axm es el residuo de xm, que yaha surgido en estas notas. Se puede probar facilmente que

rm+1 = b− Axm+1 = b− Axm − ξmAdm = rm − ξmAdm.

En consecuencia, el residuo en pasos sucesivos satisface una relacion similar a la quecumple xm. Sin embargo, este tipo de recurrencia puede verse afectada por errores deredondeo, por lo que en ocasiones el residuo se recalcula cada cierto numero de iteracionesde acuerdo a su definicion para cancelar cualquier error de redondeo.

El algoritmo resultante es el siguiente:

Metodo de descenso

01 x0 inicial, r0 = b0 − Ax0

02 for m=0:mmax

03 Escoger dm

04 ξm :=r>mdm

d>mAdm

05 xm+1 = xm + ξmdm

06 rm+1 = rm − ξmAdm

07 end

Claramente, la lınea 03 queda pendiente y en ultima medida define el metodo.

90

Page 97: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

Metodo del Gradiente

Dado que −∇F (xm) = b − Axm = rm, la direccion de maximo descenso es la delresiduo. Por tanto, esta parece una buena eleccion para dm. El metodo ası definido es elmetodo del gradiente.

Metodo del Gradiente

01 x0 inicial; r0 = b− Ax0;

02 for m=0:mmax

03 pm = Arm

04 ξm =r>mrm

r>mpm

05 xm+1 = xm + ξmrm

06 rm+1 = rm − ξmpm

07 if ‖rm+1‖ ≤ eps‖b‖08 break

09 end

10 end

En el paso 06 estamos calculando el residuo de la solucion. El criterio de parada setoma ahora a partir del residuo. En concreto hemos escogido el basado en el tamanorelativo del residuo (eps‖b‖). La norma que utilizamos es la euclıdea, que es connaturalal 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

Page 98: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

16

17 %[X,IT,R]= GRADIENTE(A,B,ITMAX) R es un historial del metodo:

18 % EPS,XO) R(i) es el residuo en el paso i

19

20 function [x,varargout]= gradiente(a,b,varargin);

21

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 comoha ido la convergencia.

Prueba el metodo con un sistema donde la matriz sea simetrica definida positiva (nota:para toda matriz B, B>B es simetrica (semi) definida positiva.)

92

Page 99: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

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

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

>> x=ones(n,1); b=a*x;

>> [x,it,r]=gradiente(a,b,100,1e-5);

>> semilogy(r)

Hemos utilizado una escala logarıtmica para medir la norma del residuo. Observa su fuertecomportamiento oscilatorio.

0 10 20 30 40 50 60 7010

−2

10−1

100

101

102

103

104 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 especificar el vector de arranque (x0 enla notacion del metodo) pero desea dejar el numero maximo de iteraciones y la toleranciapor defecto?. Como estandar en Matlab, se envıa vacıo ([ ]), de forma que los argumentosintermedios se ignoran. Por ejemplo,

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

especificarıa la tolerancia pero no el numero maximo de iteraciones. Implementa las modifi-caciones necesarias en el programa anterior para que la funcion soporte este estandar.(Ayuda: La funcion isempty puede resultarte util.)

Breves notas sobre el estudio del Metodo del Gradiente

La clave del analisis es la relacion

F (xm+1)− F (x) = 12(xm+1 − x)>A(xm+1 − x) = 1

2‖xm+1 − x︸ ︷︷ ︸

em+1

‖2A

93

Page 100: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

donde claramente em+1 es el error entre la solucion exacta y la numerica medido en lanorma de energıa de A. Por tanto, como F (xm+1) ≤ F (xm),

‖em+1‖A ≤ ‖em‖A

luego en cada iteracion hay una reduccion del error en la norma de energıa. Sin embargo,en ningun caso implica que el residuo se reduzca en cada iteracion, como bien podemoscomprobar en la Figura 5.3. Aun es mas, de la eleccion hecha de ξm se sigue que

F (xm+1) := mınα∈R

F (xm + α rm)

y por tanto

‖em+1‖A ≤ mınα∈R‖x− xm − α rm‖A = mın

α∈R‖em − αAem‖A ≤

[mınα∈R‖I − αA‖A

]‖em‖A.

Observa que hemos utilizado la cota ‖Mx‖A ≤ ‖M‖A‖x‖A, caracterıstica de toda normavectorial y su norma matricial inducida.

Proposicion 5.5 Sean λ1 y λn el mayor y menor valor propio de A. Entonces

mınα∈R‖I − αA‖A = mın

α∈R‖I − αA‖2 =

λ1 − λn

λ1 + λn

< 1.

La convergencia se escribe de forma muy comoda en terminos del condicionamientode la matriz κ(A) = λ1

λn, deduciendo la expresion

‖em+1‖A ≤κ(A)− 1

κ(A) + 1‖em‖A.

Es inmediato observar que

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

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

Ejercicio 5.13 (puramente matematico) Se puede probar que dada A simetrica definidapositiva existe B simetrica definida positiva tal que BB> = B2 = A, conocida como raızcuadrada 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

Page 101: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

Ejercicio 5.14 (demostracion de la Proposicion 5.5) Para toda matriz simetrica Cse cumple que

‖C‖2 = maxj|λj|

con λj el valor propio j−esimo. Por tanto

‖I − αA‖A = ‖I − αA‖2 = maxj|1− αλj|.

Define gc(α) = |1− c α| y traza la grafica de estas funciones para varios valores de c. Deduceque α = 2/(λ1 + λn) es el valor que hace mınimo ‖I − αA‖2 y que para este valor,

‖I − αA‖2 =λ1 − λn

λ1 + λn

.

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

0 1 2 3 4 50

0.5

1

α

¿Cuales son las graficas de los valores extremos?)

El Gradiente Conjugado

El metodo del Gradiente Conjugado trata de resolver alguna de las dificultades obser-vadas con el metodo del Gradiente, como por ejemplo el comportamiento oscilatorio delresiduo.

Observemos que en un metodo de descenso, y por la eleccion de ξm hecha en (5.3),

r>m+1dm = r>mdm − ξmd>mAdm = 0,

por lo que rm+1 ⊥ dm. Esto es, en un metodo de descenso el residuo del paso m + 1 esortogonal a la direccion de descenso anterior.

Sin embargo, en general ya no es cierto que

rm+1 ⊥ dm−1 (5.4)

y por tanto se pierde esta propiedad de ortogonalidad.

95

Page 102: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

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

rm+1 = rm − ξmAdm,

y concluimos que

d>m−1rm+1 = 0 ⇐⇒ dm−1 ⊥ Adm ⇐⇒ dm−1 ⊥A dm.

En vista de lo anterior optamos por tomar como direccion de descenso una perturbacionde la direccion natural rm (el residuo) en la direccion del descenso anterior (dm−1) quesatisfaga la propiedad de ortogonalidad anterior. Es decir, tomamos

dm = rm + τmdm−1

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

dm ⊥A dm−1 ⇐⇒ r>mAdm−1 + τmd>m−1Adm−1 = 0 ⇐⇒ τm = − r>mAdm−1

d>m−1Adm−1

.

Como eleccion inicial de la direccion de descenso tomamos simplemente r0, el residuode la aproximacion inicial. Con todo esto, la primera version del metodo del GradienteConjugado es la que sigue

Gradiente Conjugado - Primera version

01 x0 inicial; r0 = b− Ax0; d0 = r0;

02 for m=0:mmax

03 pm = Adm

04 ξm =r>mdm

d>mpm

05 xm+1 = xm + ξmdm

06 rm+1 = rm − ξmpm

07 if ‖rm+1‖ ≤ eps‖b‖08 break

09 end

10 τm+1 = −r>m+1pm

d>mpm

11 dm+1 = rm+1 + τm+1dm

12 end

13 disp(’Numero maximo de iteraciones alcanzado’)

Como puede verse, las modificaciones sobre el metodo del Gradiente son mınimasy estan concentradas en las lıneas 04, 10 y 11. En cuanto al numero de operaciones,

96

Page 103: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

coincide con las del metodo del Gradiente: en cada paso es necesario calcular un productomatriz–vector (lınea 03) y tres productos escalares (04 y 10).

Listaremos a continuacion algunas propiedades entre los residuos y las direcciones dedescenso que permiten dar una expresion distinta del metodo, y deducir alguna de laspropiedades de convergencia.

Lema 5.6 Para todo m ≥ 0r>mdm = r>mrm.

Por tanto

ξm =r>mrm

d>mAdm

.

Demostracion. Como rm ⊥ dm−1,

r>mdm = r>mrm + τm r>mdm−1︸ ︷︷ ︸=0

. (5.5)

El segundo resultado es inmediato de la definicion de ξm. �

Lema 5.7 Para todo m ≥ 0 se satisfacen las siguientes relaciones

i) dm+1 ⊥A dm.

ii) rm+1 ⊥ dm, rm+1 ⊥ dm−1.

iii) rm+1 ⊥ rm.

Demostracion. Los puntos i) y ii) ya se han probado. Para probar iii) basta comprobarque

r>m+1rm = r>mrm − ξmd>mArm = r>mrm − ξmd>mAdm + ξmτm d>mAdm−1︸ ︷︷ ︸=0

= r>mrm − ξmd>mAdm.

El resultado es ahora una consecuencia del Lema 5.6. �

Lema 5.8 Para todo m ≥ 0

τm+1 :=r>m+1rm+1

r>mrm

.

Demostracion. Como

−Adm =1

ξm

(rm+1 − rm),

se tiene

τm+1 = −r>m+1Adm

d>mAdm

=1

ξm

r>m+1(rm+1 − rm)

d>mAdm

=1

ξm

r>m+1rm+1

d>mAdm

=r>m+1rm+1

r>mrm

donde hemos utilizado que rm+1 ⊥ rm, y en el ultimo paso, la expresion alternativa deξm. �

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

97

Page 104: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

Ejercicio 5.15 Modifica el algoritmo del Gradiente Conjugado con las nuevas expresionesde ξ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 conjuntode residuos y direcciones generados en los pasos anteriores.

Lema 5.9 Para todo m ≤ n

i) dm ⊥A d`, ∀` ≤ m− 1;

ii) rm+1 ⊥ d`, ∀` ≤ m;

iii) rm+1 ⊥ r`, ` ≤ m.

La tercera propiedad implica en particular la convergencia del Gradiente Conjugado enaritmetica exacta en a lo sumo n pasos dado que no puede haber n+1 vectores ortogonalesen Rn y por tanto rn+1 = 0. Sin embargo, en aplicaciones practicas puede requerir masde n iteraciones por los errores introducidos por la precision de la maquina.

Ejercicio 5.16 Modifica el programa gradiente para implementar en una funcion de nom-bre gradconjugado el metodo del Gradiente Conjugado.

Hemos ejecutado como antes

>> n=40;a=rand(n,n); a=a*a’; x=ones(n,1); b=a*x;

>> [x,it,r]=gradconjugado(a,b,100,1e-5);

>> semilogy(r)

y hemos desplegado en la Figura 5.4 las normas de los residuos en cada paso. Como se

0 2 4 6 8 10 12 1410

−2

10−1

100

101

102

103

104

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 molestocomportamiento oscilatorio del residuo.

98

Page 105: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 implementaciondel metodo puede saltar esta seccion sin mayor problema. Animamos, no obstante, asu lectura pues ilustra un conjunto de tecnicas habituales en otras familias de metodositerativos. Ademas sirve de ejemplo que demostrar el buen funcionamiento de un esquemanumerico mas elaborado, generalmente obtenido mediante modificaciones intuitivas dealgoritmos mas simples, puede requerir un analisis nada trivial. Tampoco es extrana lasituacion contraria: un metodo puede fallar por razones no inmediatamente comprensibles.

En la demostracion juega un papel muy importante el subespacio

Km(A, r0) := R〈r0, Ar0, . . . , Amr0〉

esto es, el subespacio formado por todas las combinaciones lineales

α0r0 + α1Ar1 + . . . + αmAmr0, αi ∈ R.

Estos subespacios reciben el nombre de subespacios de Krylov y son clave en multitudde metodos numericos para la resolucion de sistemas lineales. Antes de proseguir haremosunos simples comentarios:

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

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

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

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

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

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

ii) rm+1 ⊥ d`, ∀` ≤ m.

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

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

i) dm+1 ⊥A d`, ∀` ≤ m:

99

Page 106: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

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

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

Por tanto, basta probar que

rm+1 ⊥A r`, dm ⊥A d`.

El segundo es ya conocido (hipotesis de induccion). Por otro lado

rm+1 ⊥A r` ⇐⇒ rm+1 ⊥ Ar`.

Como Ar` ∈ K`+1(A, r0) y una base de este subespacio es {r0, r1, . . . , r`+1} ⊂,concluimos que

Ar` = α0r0 + α1r1 + . . . + α`+1r`+1

con αj ∈ R adecuados. El resultado se sigue ahora de iii) puesto que rm+1 ⊥ rk,para todo k ≤ m.Por ultimo si dm+1 6= 0 entonces {d0, . . . ,dm+1} es una base de Km+1(A, r0) porser A−ortogonales y por tanto linealmente independientes. �

ii) rm+2 ⊥ d`, ∀` ≤ m + 1

Para ` = m, m + 1 es cierto por construccion (vease Lema 5.7). Para el resto devalores ` ≤ m− 1, utilizamos

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

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

(Adm+1) ⊥ d` ⇐⇒ dm+1 ⊥A d`,

y esto es lo que acabamos de probar en el apartado anterior. �

iii) rm+2 ⊥ r`, ∀` ≤ m + 1.

Tomemos ` ≤ m. Entonces

rm+2 ⊥ r` ⇐⇒ (rm+1 − ξm+1Adm+1) ⊥ r` ⇐⇒ (Adm+1) ⊥ r`

⇐⇒ (dm+1) ⊥A r`.

donde hemos aplicado la hipotesis de induccion en el segundo paso. Ahora, comor` ⊂ K`(A, r0), por el punto i) podemos escribir

r` = β0d0 + β1d1 + . . . + β`d`. (5.6)

El resultado se sigue de la propiedad i) ya que dm+1 ⊥A dk para k ≤ m. Final-mente, si rm+1 6= 0 entonces {r0, . . . , rm+1} es una base de Km+1(A, r0) por serortogonales. �

100

Page 107: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

Un examen mas cuidadoso de la demostracion anterior comprueba que esta falla en elcaso de que en un paso rm+1 o dm+1 sean nulos. En cualquiera de estos casos

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

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

Notas finales

El Gradiente Conjugado fue propuesto por Magnus R. Hestenes y Eduard Stiefel en1952. Lo mas curioso es que el metodo fue desarrollado de forma independiente por estosdos autores. Segun cuenta Marvin Stein13, un estudiante postdoctoral en aquellos anos queprogramo el algoritmo por primera vez para Hestenes, Stiefel coincidio con Hestenes enuna conferencia en UCLA (University of California, Los Angeles) y le comento a grandestrazos el metodo en el que estaba trabajando. Stiefel estaba impresionado sobre las buenaspropiedades que mostraba este metodo hasta que revisando las tarjetas perforadas quecontenıan el programa implementado cayo en la cuenta de que se trataba del mismometodo sobre el que independiente el estaba trabajando14.

Hemos visto que el metodo del Gradiente Conjugado es un metodo directo, en tantoen cuanto da la solucion en un numero finito de pasos, concretamente n, el numero de filasde la matriz. Sin embargo, se programa como un metodo iterativo, de forma que se buscala convergencia en muchas menos iteraciones. En cada iteracion se tiene la estimacion

‖em+1‖A ≤ 2

(√κ(A)− 1√κ(A) + 1

)m

‖e0‖A

donde de nuevo em := xm − x es el error en el paso m−esimo y e0 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 delmetodo del Gradiente (por la raız cuadrada), sigue siendo importante. Si la matriz tieneun condicionamiento moderado, el metodo del Gradiente Conjugado dara una solucionaceptable en unas pocas iteraciones. Sin embargo, esto no suele ser un caso habitual. Lasmatrices que surgen en la resolucion de ecuaciones en derivadas parciales, por ejemploelementos o volumenes finitos, suelen ser, ademas de matrices sparse, mal condicionadas,por lo que el metodo del Gradiente Conjugado requiere de bastantes iteraciones15.

Estas razones hicieron que el Gradiente Conjugado se tomara como un metodo mas,sin concederle especial relevancia y confundiendose con la multitud de metodos para laresolucion de sistemas de ecuaciones lineales que iban surgiendo a su alrededor. Esta

13Anecdota recogida por Yousef Saada y Henk A. van der Vorstb en “Iterative solution of linear systemsin the 20th century” publicado en “Journal of Computational and Applied Mathematics” en el ano 2000.

14Esta coincidencia no es de todas formas un caso aislado en las Ciencias en general y en las Matematicasen particular. En ocasiones parece como si las ideas estuviesen flotando en el ambiente a la espera de quealguien diera el paso final de plasmarlas.

15O(n1/3) en problemas en 3D, O(n1/2) en 2D es un comportamiento tıpico.

101

Page 108: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

situacion se prolongo durante casi 20 anos hasta que las ideas del precondicionamien-to cambiaron radicalmente esta situacion y encumbraron al Gradiente Conjugado a suposicion actual16.

El precondicionamiento consiste, a grandes rasgos, en cambiar el sistema por unoequivalente17

Ax = b, L−1AL−>︸ ︷︷ ︸B

y = L−1b︸ ︷︷ ︸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. Engeneral, la matriz L−1AL−> no se construye, porque el producto por el precondicionadorhace 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, quese reducen sistemas lineales con M como matriz de coeficientes. Obviamente, y de formasimilar a como procedıamos con la descomposicion de Cholesky, esto equivale resolver dossistemas lineales con L y L>. La buena noticia es que es posible construir matrices paralas 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. Dehecho, el comando de Matlab con el Gradiente Conjugado implementado es pcg depreconditioned conjugate gradient.

En ultima medida, el exito del Gradiente Conjugado origino el nacimiento de unafamilia entera de metodos, los conocidos como metodos de Krylov, que trataban deextender las buenas propiedades del metodo a matrices mas generales. Por ejemplo, BiCG,BiCGSTAB, CGS, QMR, GMRES, MINRES, etc. Algunos de estos metodos requierenque la matriz sea simetrica y otros son validos para matrices arbitrarias.

Un precondicionador universal, es valido en muchos casos, es la descomposicion deCholesky incompleta. Va mas alla de los contenidos de este curso describir detalladamenteen que consiste pero podemos dar una idea. Se trata de, grosso modo, aplicar el metodode Cholesky pero restringiendo la creacion de nuevas entradas. El resultado es una matrizL tal que LL> ≈ A en algun sentido. Por tanto, L−1AL−> ≈ In y su condicionamientoes moderado, o al menos mejor que el de A. En Matlab se encuentra implementada enel comando cholinc. El siguiente ejercicio ilustra el efecto del precondicionamiento en laconvergencia del Gradiente Conjugado y con ello trata de convencer de la necesidad deutilizarlo en la resolucion de (muy) grandes sistemas de ecuaciones.

Ejercicio 5.17 Las siguientes instrucciones

>> [p,e,t]=initmesh(’lshapeg’,’Hmax’,0.05);

>> [a,b]=assempde(’lshapeb’,p,e,t,1,0,1);

devuelven en a una matriz sparse simetrica definida positiva proveniente de resolver la ecuacionde Poisson (una ecuacion en derivadas parciales) por el metodo de elementos finitos en un

16La American Mathematic Society lo situo entre los diez algoritmos mas relevantes del siglo XX, juntocon, por ejemplo, la Transformada Rapida de Fourier (FFT) o el algoritmo QR para el calculo de valoresy vectores propios.

17Utilizamos la notacion L−> = (L−1)>, es decir invertir y trasponer (o equivalentemente, trasponer einvertir).

102

Page 109: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION II Capıtulo 5. Matrices sparse en Matematicas. Metodos iterativos

0 50 100 150 200 25010

−8

10−7

10−6

10−5

10−4

10−3

10−2

10−1

100 Metodo del gradiente

sin precondicionarprecondicionado

Residuo

Iteraciones

Figura 5.5: Efecto del en el Gradiente Conjugado.

dominio en forma de ‘L’. La matriz tiene aproximadamente 2100 filas con 14500 elementos nonulos18.

Con el comando spy se puede ver la forma de a, su tamano y el numero de entradasno nulas. Aplica el comando pcg que contiene implementado el Gradiente Conjugado. Porejemplo, con

>>[x,flag, relres,iter,resvec] = pcg(a,b,1e-7,100);

aplicas el metodo con una tolerancia relativa de 10−7 y un numero maximo de 100 iteraciones.En relres se recoge el residuo relativo de la solucion calculada (‖b−Ax‖/‖b‖), en resvec

un historial del residuo en cada paso y en flag una variable que informa sobre que ha sucedidoen la aplicacion del metodo. Ası flag==1 indica que se ha alcanzado el numero maximo deiteraciones sin convergencia, mientras que si flag==0 entonces ha habido convergencia. Paraver el historial de la convergencia del metodo se puede ejecutar

>> semilogy(resvec);

Observa que es necesario o aumentar el numero de iteraciones maximas o disminuir la toleranciapara 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 numero de entradasno nulas de R.

Modificando las instrucciones anteriores con18Por cierto, el logo de Matlab es la solucion de un problema de este tipo.

103

Page 110: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador5.2 Metodos iterativos para sistemas lineales LECCION II

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

estas aplicando el metodo del Gradiente Conjugado precondicionado con R>R. ¿Disminuye elnumero de iteraciones? (ver iter2). ¿Y el tiempo de calculo?. ¿Puedes ser ahora mas exigentecon la tolerancia?.

Ejercicio 5.18 Con la orden helpwin lee la ayuda que proporciona Matlab para pcg. ¿Que otrosmetodos iterativos estan implementados?. Consulta tambien la ayuda de cholinc y luinc.

104

Page 111: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLeccion III

Funciones como argumento. RecursividadFormulas de cuadratura. FFT

105

Page 112: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador

Page 113: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorIntroduccion

Hobbes clearly proves that every creatureLives in a state of war by nature;So naturalists observe a fleaHas smaller fleas that on him prey,And these have smaller still to bite’em,And so proceed ad infinitum.

Swift, Poetry: a Rhapsody

En esta leccion abordaremos dos nuevos aspectos de Matlab: el envıo de funcionescomo argumentos de otras funciones y la recursividad, esto es, la habilidad de que lasfunciones se llamen a sı mismas. Ademas mostraremos una forma alternativa de definirfunciones 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 integracionadaptativa. Finalizaremos con la transformada discreta de Fourier, y su calculo medi-ante la transformada rapida de Fourier (FFT). La implementacion de estos algoritmosservira de ilustracion de las estrategias de recursividad, que sirven para obtener un codigosimple y legible.

107

Page 114: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador

108

Page 115: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorCapıtulo 6

Matlab: Funciones como argumentos.Recursividad

6.1. Funciones inline

En la seccion 3.2 de la Leccion I mostramos la definicion de funciones mediante ficherosde texto (con extension *.m). Existe una forma alternativa de introducir funciones enMatlab que puede utilizarse directamente en la lınea de comandos o en el codigo de unafuncion. Por ejemplo,

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

define la funcion f(x) = e−xsen(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 escribirel correspondiente codigo. La definicion queda en memoria pero una vez cerrada la sesionde Matlab (esto es, al salir del programa) la funcion se pierde. Esta es pues una importantedesventaja frente la funciones basada en m-files1. Sin embargo puede resultar util paratareas sencillas tanto en el modo comando como en el codigo de una subrutina.

Nada impide definir funciones con mas argumentos,

>> g=inline(’x*cos(y)-y*cos(x)’,’x’,’y’);

Los ultimos argumentos del comando inline definen las variables de la funcion. Si no seespecifican, Matlab trata de reconocer cuales son las variables y las ordena alfabeticamente:

1En el menu, seleccionando File → Save workspace as se pueden grabar las variables y funcionesutilizadas en la sesion actual de Matlab. Otra posibilidad es utilizar la orden save indicando que queremosgrabar f . En cualquier caso, ambas opciones no son muy naturales.

109

Page 116: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador6.1 Funciones inline LECCION 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 explıcitamente puede aclarar y facilitar lalectura, ademas de especificar el orden de las variables en la definicion de la funcion:

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

f =

Inline function:

f(k,x) = x*cos(k*x)

>> 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 omatriz no actuan elemento a elemento. Para ello, deberıa 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 aMatlab que la prepare para su aplicacion a vectores. El comando dedicado a esta tarea esvectorize:

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

Page 117: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 redefine la funcion anadiendo “.”en los sitios adecuados.

6.2. Funciones como argumentos

Es frecuente que en programacion mas avanzada se requiera que las funciones trabajensobre funciones. Por ejemplo, podemos plantearnos implementar una funcion que realicela siguiente tarea

dada una funcion de una variable y dos valores dibujar la funcion entreesos valores

En este caso, uno de los argumentos es la funcion a dibujar. Veamos como se haimplementado

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 lınea 07, f recoge la funcion argumento, mientras que en 20 se procede a evaluaresta mediante

feval

Para enviar la funcion existen dos posibilidades:

111

Page 118: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador6.2 Funciones como argumentos LECCION III

Si enviamos una funcion inline, basta con insertar su nombre

>> fun=vectorize(inline(’exp(-x)*cos(4*x)’));

>> miplot(fun,0,2*pi,200)

Si la funcion es propia de Matlab o esta implementada en un fichero m-file en lacarpeta 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 construyeel polıgono con vertices(x(i),y(i)). Si se toma un numero suficiente de puntos esto bastapara obtener una buena grafica. Este comando es una de las salidas graficas mas simples deMatlab y admite una amplia variedad de argumentos opcionales que controlan el aspectofinal del dibujo. En una leccion posterior (Leccion V) veremos este comando y otrosrelacionados con las salidas graficas. �

Ejercicio 6.1 Modificar el programa miplot para que en caso de no recibir los argumentosa 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 comose puede cambiar de forma sencilla tanto la forma de la grafica (lınea continua, lınea a trozos,raya-punto, solo puntos,...), el color,...

6.2.1. Recursividad

Un aspecto ya habitual en muchos lenguajes de programacion es la recursividad, esdecir, la habilidad de que una funcion se llame a sı misma. Es habitual su utilizacioncuando se programan estrategias de tipo divide y venceras, que consiste, a grandes trazos,en dividir un problema en problemas iguales pero de menores dimensiones.

Quizas el ejemplo mas sencillo (y clasico) se basa en la funcion factorial.

n! = n · (n− 1) · · · 1.

De una manera simple, podemos definir de forma recursiva

n! =

{n · (n− 1)!, si n > 0,1, si n = 0.

Su implementacion en Matlab es ahora tan sencilla como sigue

2Matlab recomienda esta forma. El operador @ accede al handle de la funcion que es la referencia quetiene Matlab de la funcion. Para mayor informacion, ver helpwin function handle.

112

Page 119: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 factorialque en Matlab se encuentra implementada en una funcion con el mismo nombre3. Esmas, abusar de este tipo de programacion suele generar codigo poco eficiente. Ademas elcontrol que debe hace el ordenador de las sucesivas llamadas puede dar lugar a un costoen memoria elevado. Sin embargo es cierto que el codigo resultante suele ser bastante massimple.

3Tienes de hecho acceso al codigo, basta con ejecutar edit factorial.

113

Page 120: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador6.2 Funciones como argumentos LECCION III

114

Page 121: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorCapıtulo 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 analıticos o bien porque conlleva uncosto elevado. Este tipo de problemas se ha planteado desde la antiguedad, con algunasreferencias que se remontan a las Matematicas clasicas en el calculo de areas y volumenesde figuras curvas. Quizas este sea el origen de la denominacion de formula de cuadraturaa cualquier expresion que aproxime una integral definida.

La propia definicion de integral1 se formula actualmente en terminos del lımite deformulas de cuadratura, concretamente formulas del rectangulo. El Analisis Numericotrata 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 zonasdel intervalo de integracion concentran el error cometido por nuestra formula y por tantodonde debemos concentrar nuestro esfuerzo para reducir el error cometido. Obtenemosası un metodo adaptativo, no rıgido, que reconoce las dificultades del problema y se adaptaa el.

En esta seccion esbozaremos estas ideas recurriendo siempre a casos sencillos e ideasintuitivas y dejando la teorıa en el mınimo imprescindible.

7.1.1. Primeras nociones

Desde una optica completamente ingenua, y a la vista de la grafica de la funcion porintegrar, podemos plantear su aproximacion por una suma de areas de rectangulos queaproximen el area total que define f (Figura 7.1)2. A este tipo de aproximaciones se les

1Hablamos de la integral de Rienmann.2Esta aproximacion esta, de hecho, detras de la definicion de la integral de Rienmann.

115

Page 122: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.1 Formulas de cuadratura LECCION III

conoce como reglas del rectangulo. Queda por elegir el punto que al evaluar define laaltura de cada rectangulo. Las elecciones mas sencillas son tomar el extremo inferior decada 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.6particiónRegla 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.6ParticionRegla del trapecio

Figura 7.1: Reglas de cuadratura: punto medio y trapecio

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

n ∈ N, h =b− a

n, xj = a + hj, xj+1/2 = a + h(j + 1/2)

o particion asociada. Las reglas quedan ahora de la siguiente forma

Q1(f, h) := hn−1∑j=0

f(xj) (Punto inferior),

Q2(f, h) := hn∑

j=1

f(xj), (Punto superior)

Qpm(f, h) := h

n−1∑j=0

f(xj+1/2), (Punto medio)

Es difıcil escapar a la sensacion de que la regla del punto medio goza de mejores

116

Page 123: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

propiedades que las que definen el resto de elecciones3. Esta impresion es correcta, comoveremos mas adelante.

Un analisis algo mas profundo nos descubre la regla del trapecio como una mejormanera de aproximar la integral (ver de nuevo la Figura 7.1). En este caso la integral seaproxima como suma del area de trapecios, como su propio nombre indica. Es un simpleejercicio comprobar que la regla obedece a la siguiente formula

Qtr(f, h) := h[12f(x0) +

n−1∑j=1

f(xj) +1

2f(xn)

], (Regla del trapecio).

Parecerıa evidente que esta aproximacion es mejor que la de las formulas de rectanguloque hemos visto. Esta impresion es solo parcialmente correcta: de hecho la regla del puntomedio es ligeramente mejor que la regla del trapecio, como veremos mas adelante.

En cualquier caso, la regla del trapecio sugiere que podemos desarrollar formulas mascomplejas sobre cada subintervalo [xi, xi+1] para luego construir con ellas, simplementesumandolas, 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 subdividirel intervalo de integracion en intervalos mas pequenos 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 final del intervalo a,b.

Numero de divisiones del intervalo n.

Una vez leıdos 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 enesos puntos (un nuevo vector de valores), sumar el vector y multiplicar por h.

El programa podrıa 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;

3Quizas por razones de simetrıa. La intuicion es una arma poderosa en todas las Ciencias y en lasMatematicas en particular. Sin embargo en el Analisis Numerico puede llevar a confusiones e impresioneserroneas. En ocasiones los metodos numericos funcionan o fallan por razones que escapan a la puraintuicion. De todos modos, no por ello se debe desdenar, sino manejarla con algo de cuidado.

117

Page 124: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.1 Formulas de cuadratura LECCION 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 numero de puntos suficientemente alto y siempre que la funcionsea regular (sea derivable un numero suficiente de veces) puedes tomar ese valor como elresultado exacto de la integral. Con un ejemplo arbitrario compara los resultados de la regladel punto medio y la regla del trapecio.

Nota. Existe una cuestion, algo tonta, sobre el parametro n. Lo habitual es tomar n deforma que h = (b − a)/n sea la distancia entre los puntos que se evaluan para construirla regla de cuadratura. Esta eleccion hace que en la regla del punto medio la funcion seevalue en n puntos mientras que en la regla del trapecio, se haga en n + 1 puntos. Encualquier caso, y adelantandonos a lo que sigue, el parametro relevante es precisamenteh. �

7.1.2. Reglas simples

Tanto la regla del punto medio como la del trapecio se basan en interpolar la funcionpor un polinomio de grado 0 (constante) y grado 1 (una recta) sobre cada subintervaloe integrar dicho polinomio. Esto es, si c es el punto medio de (a, b), la regla del puntomedio consiste en reemplazar la funcion por la constante, polinomio de grado 0, que pasapor (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 p1(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 p1(s):∫ b

a

f(s)ds ≈∫ b

a

[ b− s

b− af(a) +

s− a

b− af(b)

]︸ ︷︷ ︸

p1(s)

ds =b− a

2[f(a) + f(b)] .

El estudio del error de las formulas anteriores queda ası reducido a las propiedades deaproximacion 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

24f ′′(ξ1)(b− a)3,∫ b

a

f(s) ds− b− a

2

(f(a) + f(b)

)= − 1

12f ′′(ξ2)(b− a)3.

118

Page 125: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

Obviamente, nada se dice sobre cuales son los puntos ξ1, ξ2, puesto que conocer esospuntos en cada caso serıa equivalente a conocer la integral para cualquier funcion arbi-traria. Es remarcable que ambas formulas son exactas para polinomios de grado 1 (porqueen tal caso f ′′ = 0) y que el error que se puede esperar de la formula del punto medio esla mitad que el de la formula del trapecio y ademas con signo opuesto4.

Siguiendo con estas ideas, podemos avanzar un paso mas trabajando con polinomiosde grado dos. Denotando por Pn(x) los polinomios de grado n, procedemos como sigue

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

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

Dar como aproximacion ∫ b

a

f(s) ds ≈∫ b

a

p2(s) ds.

a c b

Figura 7.2: Regla de Simpson

En la terminologıa habitual se habla de una regla de precision 2. La formula queası 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 masutilizadas en la practica. A primera vista se puede esperar que de el valor exacto de laintegral para polinomios de grado de 2, puesto que ası se ha impuesto en la definicion.Sin embargo tiene un grado de precision adicional fruto de la disposicion simetrica de lospuntos de evaluacion (es decir, del hecho de que c sea el punto medio de [a, b]), lo que llevaa que la formula sea exacta para polinomios de grado 3. Esto es, la regla de Simpsontiene precision 3:

4Salvando el hecho de que en principio ξ1 6= ξ2. Un analisis mas elaborado permite probar que estaconclusion es esencialmente cierta.

119

Page 126: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.1 Formulas de cuadratura LECCION 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

2880f (4)(ξ3)(b− a)5.

En general, tenemos la siguiente estrategia para construir reglas de mayor precision:

Tomar n ∈ N, h = (b− a)/n, xj = a + jh con j = 0, . . . , n (n + 1 puntos).

Construir un polinomio pn ∈ Pn(x) tal que

pj(xj) = f(xj).

Aproximar ∫ b

a

f(s) ds ≈∫ b

a

pn(s) ds.

Las formulas ası obtenidas reciben el nombre de formulas de Newton-Cotes cerradas5. Lasformulas de Newton-Cotes abiertas se definen de forma similar pero tomando

xj+1/2 = a + (j + 1/2)h, j = 0, . . . , n, h =b− a

n.

Se denominan reglas abiertas porque ni a ni b se evaluan para aproximar la integral.Sin embargo no es conveniente recurrir a estas formulas de cuadratura porque conforme

aumenta el numero de puntos, las formulas tienden a ser mas inestables numericamente.En lugar de ello, se utilizan formulas compuestas, como las del rectangulo o trapecio,definidas a partir de formulas simples de pocos puntos. Volveremos a ello en proximosapartados.

Ejercicio 7.4 (Matematico) Deducir los coeficientes de la regla de Simpson expuestos en(7.1).(Ayuda: Todo polinomio de grado 2 se puede escribir en la forma p2(s) = α1(s − b)(s − c) +α2(s − a)(s − c) + α3(s − a)(s − b). ¿Cuanto valen α1, α2, α3 si exigimos que p2(a) = f(a),p2(b) = f(b), p2(c) = f(c)?. Integra p2(x) y deduce la regla. Ten en cuenta que c = (a + b)/2.)

Ejercicio 7.5 Otra forma equivalente de definir y calcular las formulas de Newton-Cotes esexigir que la formula de cuadratura integre a los polinomios de maximo grado. En el caso dela formula de Simpson, bastarıa con partir de

xj = a + jh, j = 0, 1, 2, con h =b− a

2,

definir ∫ b

a

f(s) ds ≈ ω0f(x0) + ω1f(x1) + ω2f(x2).

y exigir que la formula sea exacta para f = 1, s, s2. Calcula ası los pesos de la formula deSimpson.

5El hecho de que Isaac Newton aparezca ligado a estas ideas da una pista sobre la fecha a la que seremontan estas tecnicas.

120

Page 127: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

Ejercicio 7.6 Siguiendo las ideas del ejercicio anterior, podemos deducir las formulas conmas 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(ω0g(0) + ω1g(1) + . . . + ωng(n)

).

Los pesos se determinan sin mas que exigir que sea exacta para polinomios6, de grado n en t.Llegamos por tanto a las condiciones∫ n

0

g(t) dt = n(ω0g(0) + ω1g(1) + . . . + ωng(n)), g ∈ {1, t, . . . , tn}.

Esta forma directa de abordar el problema nos conduce al sistema1 1 1 · · · 10 1 2 · · · n0 1 4 · · · n2

. . . . . . . . . . . . . . . . .0 1 2n · · · nn

ω0

ω1

ω2...

ωn

=

1

n/2n2/3

...nn/(n + 1)

.

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

Solucion. Recordemos en primer lugar que los vectores en Matlab se numeran a partirde 1, lo que exige desplazar todos los ındices una unidad. Dicho esto, una implementacionde 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

6observa que el cambio de variable lleva polinomios de grado n a polinomios de grado n7La 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 consecuenciade que la base de monomios no es buena eleccion como base de los polinomios.

121

Page 128: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.1 Formulas de cuadratura LECCION III

13 function w=pesosnewtoncotes(n)

14

15 r=0:n;

16 c=1; m=ones(1,n+1);

17 for i=1:n

18 m=[m; r.^i]; % construimos matriz del sistema

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 101/2 1/6 1/8 7/90 19/288 41/840 322/7409 248/7109 177/5551 94/35031/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/50591/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/93319/288 9/35 49/64 97/262 282/4373 783/1097

41/84 337/1628 −111/3391 451/2089 −406/933429/9871 578/2783 27/224 722/1587

248/7109 458/2607 −351/4331177/5551 2284/12865

94/3503

Se puede comprobar que aparecen pesos negativos a partir de n = 8. Es decir, la formulade cuadratura puede dar valores negativos para una funcion positiva. Esta inestabilidad sevuelve mas acusada conforme n→∞. De hecho es muy probable que a partir de n ≈ 10la resolucion del sistema lineal de Vandermonde de resultados muy poco fiables dado elmal condicionamiento de la matriz8. En cuanto a los pesos, estos se pueden calcular deforma 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, reglade 3/8. El grado de precision de estas reglas (es decir, el grado de los polinomios paralos que las formulas dan la integral exacta) es n o n + 1 dependiendo si n es impar o parrespectivamente.

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 conun numero de puntos elevados equidistribuidos no es recomendable dado que exhiben

8Se puede atenuar este mal condicionamiento utilizando la descomposicion QR (ver Leccion IV) pararesolver el sistema lineal

122

Page 129: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

una gran inestabilidad numerica. Este hecho esta ıntimamente con la inestabilidad de lainterpolacion 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 originalen 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 dividirel intervalo de integracion en n subintervalos y aplicar en cada uno de ellos la formula deNewton-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 lugarn subintervalos, con lo que habremos de evaluar en 2n + 1 puntos. Definiendo h = (b −a)/(2n), xi = a+ih (i = 0, . . . , 2n) aplicaremos la regla de Simpson simple sobre [x2i, x2i+2](longitud 2h). Aparecen ası tres terminos diferentes:

Los puntos x0 (= a) y x2n (= b) son extremos de un unico subintervalo.

Los puntos x2j, j = 1, . . . , n − 1, que son extremo superior de un subintervalo einferior del siguiente ([x2j−2, x2j] y [x2j, x2j+2]).

Los puntos x2j−1 que son puntos interiores de los subintervalos ([x2j−2, x2j]).

La formula que obtenemos es

Qsp(f, h) := h[13f(x0) +

4

3

n∑j=1

f(x2j−1) +2

3

n−1∑j=1

f(x2j) +1

3f(x2n)

]. (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

Qpm(f, h)−∫ b

a

f(s) ds =h2

24f ′′(ξ1)(b− a),

Qtr(f, h)−∫ b

a

f(s) ds = −h2

12f ′′(ξ2)(b− a),

Qsp(f, h)−∫ b

a

f(s) ds = − h4

180f (4)(ξ3)(b− a).

A la luz de este resultado se concluye que el error se divide por cuatro cuando h sedivide por dos para las formulas del punto medio y trapecio, y por dieciseis en el caso de laformula de Simpson. Se dice entonces que las formulas tienen orden de convergencia2 en los dos primeros casos y orden 4 para la regla de Simpson.

Esencialmente, el resultado anterior informa de como mejora la aproximacion de laformula cuando aumentamos el esfuerzo computacional. Comprobamos que hay una claraventaja de la regla de Simpson respecto a la regla del punto medio y del trapecio. Noobstante, se observa que es necesario que la funcion tenga derivada cuarta continua paraalcanzar orden 4. En caso de que la funcion no sea tan regular, es esperable que la reglade Simpson pierda orden.

123

Page 130: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.1 Formulas de cuadratura LECCION III

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

Ejercicio 7.9 Se trata de observar experimentalmente el orden de convergencia de las reglasdel punto medio, trapecio y de Simpson, programadas en los ejercicios 7.1, 7.2 y 7.8 medianteuna baterıa de experimentos.

Para ello, definimos una funcion mediante inline:

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

La integral exacta se puede calcular tomando un numero muy elevado de puntos (por ejem-plo n = 10000) con la regla de Simpson, que es la de mayor precision. Mide el error paradiferentes valores de n y observa como decrece el error. Una buena eleccion podrıa sern = 10, 20, 40, 80, ..., esto es, multiplicando por 2 el numero de puntos. Deberıas observar quepara funciones suaves el error se divide por 4 o por 16, segun la regla que se aplique.

Testa los programas con los siguientes ejemplos

i) f1(x) = x cos(x) en [0, π]

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

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

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

Un fichero script te puede venir bien para este ejercicio. ¿Que observas con las reglas deltrapecio y del punto medio en el ultimo caso?.

Nota. En esta serie de experimentos se observa que la regla de Simpson no alcanza elorden que la teorıa predice en el ejemplo iii) sobre el intervalo [0, 2]. Ello es debido a quelas 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π

0cos2(x) (punto iv)).Esto es consecuencia de que el integrando,

ademas de regular, es π−periodico y se esta integrando en un multiplo de su intervalode periodicidad. En una seccion posterior daremos una explicacion a este fenomeno tansorprendente. �

Ejercicio 7.10 Implementa la regla compuesta de 3/8, la siguiente a la regla de Simpson, queaparecıa en el Ejercicio 7.6. Compara los resultados con la regla de Simpson. ¿Que observas?

9En este caso, evaluar en 0 es una singularidad de tipo 0 · ∞. En realidad el lımite cuando x → 0 escero, 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 afectaal resultado.

124

Page 131: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 escogidosde manera que la formula tuviese grado maximo de precision aunque la eleccion de losnodos, es decir, de los puntos en los que se evalua la funcion, estaba fijada a priori.

Podemos plantearnos ahora hacer de la posicion de los nodos una variable mas delproblema. Para ello, y con objeto de simplificar el analisis, nos situamos en el intervalo[−1, 1] y buscamos la formula de mayor precision de dos puntos:

ω1, ω2, ξ1, ξ2 ∈ R

ω1p(ξ1) + ω2p(ξ2) =

∫ 1

−1

p(s) ds, p ∈ {1, s, s2, s3}

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 principioel problema esta bien planteado10.

Es un ejercicio ilustrativo resolver el sistema no lineal

ω1 + ω2 = 2,

ω1ξ1 + ω2ξ2 = 0,

ω1ξ21 + ω2ξ

22 = 2

3,

ω1ξ31 + ω2ξ

32 = 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 define una regla de dos puntoscon mejores propiedades de convergencia que, por ejemplo, la regla del trapecio11.

Podemos proceder de la misma forma y dada una regla de cuadratura de n nodosexigir que esta integre de forma exacta a polinomios de grado 2n− 1. Dada la dificultaddel sistema no lineal resultante, patente ya con n = 2, se deduce que el problema debeser atacado desde un punto de vista muy diferente.

Existe una teorıa 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 sincontrol 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.

10Tenemos cuatro ecuaciones con cuatro incognitas. Sin embargo el sistema es no lineal luego la teorıaclasica de sistemas lineales no es aplicable. Podrıamos tener cuatro soluciones, siete soluciones, infinitassoluciones o ninguna solucion...

11Este resultado le resulto ya muy chocante a Carl Friedrich Gauss, que fue el primero en notar queuna distribucion nada logica de los nodos definıa una formula de cuadratura de mayor grado de precision.

125

Page 132: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.1 Formulas de cuadratura LECCION III

La teorıa va mas alla puesto que es constructiva: da una forma de calcular la formula(nodos y pesos) mucho mas eficiente. En concreto, los nodos de la formula de cuadraturason las raıces de una familia de polinomios, los polinomios de Legendre, que se encuentratabulada en multitud de textos cientıficos. Los pesos ωi se pueden calcular a continuacionresolviendo un simple sistema lineal. En la Tabla 7.1 se pueden ver los coeficientes delas primeras reglas gaussianas. Observa que la disposicion simetrica de los nodos en elintervalo [−1, 1] y de los pesos asociados.

n ξi ωi

n = 10 2

n = 2

−√

3/3 1√3/3 1

n = 3−0.774596669 0.555555556

0.0 0.8888888890.774596669 0.555555556

n = 4−0.861136312 0.347854845−0.339981044 0.6521451550.339981044 0.6521451550.861136312 0.34785484

n = 5−0.906179846 0.236926885−0.538469310 0.478628670

0.0 0.5688888890.538469310 0.4786286700.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 aplicarıan en unintervalo [a, b]?.

7.1.5. Extrapolacion de Richardson

La extrapolacion de Richardson es una estrategia que permite acelerar la velocidad deconvergencia de un metodo numerico bajo determinadas condiciones.

Nos centraremos en esta seccion en la descripcion de esta tecnica aplicada a la formuladel trapecio. El metodo resultante se conoce como metodo de Romberg.

126

Page 133: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

Proposicion 7.4 Existe una sucesion de numeros (b2j)j tales que para f suficientementeregular ∫ b

a

f(s) ds−Qtr(f, h) =m∑

j=1

b2jh2j[f (2j−1)(b)− f (2j−1)(a)

]+O(h2m+2).

El sımbolo de Landau O(hM) indica una cantidad que es menor que una constantemultiplicada por hM y con dicha constante independiente de h. En otras palabras, esequivalente a escribir∣∣∣∣ ∫ b

a

f(s) ds−Qtr(f, h)−m∑

j=1

b2jh2j[f (2j−1)(b)− f (2j−1)(a)

]∣∣∣∣ ≤ Cmh2m+2

donde Cm 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) = Qtr(f, h) c2j := b2j

[f (2j−1)(b)− f (2j−1)(a)

]se observa que para h y h/2 se dispone de los desarrollos

I = α0(h) +m∑

j=1

c2jh2j +O(h2m+2),

I = α0(h/2) +m∑

j=1

14j c2jh

2j +O(h2m+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

13

(1

4j−1 − 1)c2j︸ ︷︷ ︸

c(1)2j

h2j +O(h2m+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 h2j +O(h2m+2). (7.3)

Como consecuencia

I − α1(h) = O(h4)(⇔ |I − α1(h)| ≤ C4h

4).

Por tanto α1(h) es una aproximacion de la integral con orden 4. Es mas, α1(h) cumple denuevo un resultado similar al de la proposicion anterior (ver (7.3)), por lo que podemosrepetir el mismo argumento y definir12

α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

Page 134: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.1 Formulas de cuadratura LECCION III

Paso 0 Paso 1 Paso 2 Paso 3

convergencia ��

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

α0(h/2) //

66nnnnnnnnnnnnnα1(h/2)

66nnnnnnnnnnnnn// α2(h/2)

66nnnnnnnnnnnnn

α0(h/4) //

66nnnnnnnnnnnnα1(h/4)

66nnnnnnnnnnnn

α0(h/8)

66nnnnnnnnnnnn

Figura 7.3: Diagrama del metodo de Romberg

Es facil ver que nuevamente I − α2(h) tiene un desarrollo del error que comienza conh6 puesto que este combinacion ha cancelado el primer termino que aparecıa con α1(h).Como consecuencia, α2(h) da una aproximacion de la integral de orden 6. En general sepueden definir

αj+1(h) =22jαj(h/2)− αj(h)

22j − 1.

Cada una ellas satisfaciendo|I − αj(h)| ≤ Cjh

2j+2,

donde Cj es independiente de h pero de j o de f . Observa que la convergencia solo seasegura para j fijo y h→ 0.

Su ventaja mas palpable es que unicamente requiere aproximaciones de la integralobtenidas con una formula de cuadratura sencilla. Combinando resultados para valoresdistintos de h se obtiene una mejora sustancial en la aproximacion de la integral. Aquı noshemos centrado en la formula del trapecio, pero se pueden adaptar a la formula del puntomedio o a la de Simpson. Es mas, estrategias de este tipo se aplican en diversa areas delAnalisis Numerico. Para ello, es esencial contar con un resultado del tipo enunciado en laProposicion 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 regularesy periodicas cuando se integra en un intervalo de periodicidad. Observa que en este casof (2j−1)(b) = f (2j−1)(a) y por tanto no hay terminos en hm para ningun m. Esto es, elorden de convergencia es m para cualquier m, o lo que es lo mismo∣∣∣ ∫ b

a

f(s)ds−Qtr(f, h)∣∣∣ ≤ Cmhm, ∀m ∈ N

donde Cm que depende de la derivada m-esima de f (y por tanto de m) pero no de h. Conello se consigue una convergencia muy rapida a la integral y bastaran unos pocos puntos

128

Page 135: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

para calcular la integral con una precision muy fina.En la terminologıa habitual en Analisis Numerico se dice que el metodo tiene un orden

de convergencia superalgebraico. Es posible probar que bajo condiciones algo mas fuertesque la existencia de todas la derivadas13

∣∣∣ ∫ b

a

f(s)ds−Qtr(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 trapeciocompuesta obtienes el metodo de Simpson.

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

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 definir la extrapolacion. Para ello precisamosque las sucesivas h decrezcan de una forma proporcional

α0(h), α0(rh), α0(r2h), . . . , α0(r

nh).

En el caso expuesto, r = 1/2. ¿Como se adapta la extrapolacion para otras elecciones der ∈ (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 situacion usual es que la funcion tenga zonas donde varıa de forma brusca y zonasdonde su comportamiento sea considerablemente mas suave. Intuitivamente, se entiendeque las primeras zonas son las mas problematicas. El siguiente paso en cualquier algorit-mo numerico es disenar metodos adaptativos. Estos esquemas reconocen aquellas zonasque requieren mayor trabajo (refinar, en la terminologıa habitual) y aquellas donde bastaunas pocas evaluaciones para obtener una aproximacion suficientemente buena.

Para abordar esta tarea debemos disponer en primer lugar de un buen estimadordel error, esto es, de un postproceso que nos de informacion sobre el error que estamoscometiendo y que ası permita dilucidar que partes del intervalo de integracion requierenmayor esfuerzo y cuales no.

13Concretamente que la funcion sea analıtica

129

Page 136: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.1 Formulas de cuadratura LECCION III

Zona regular Zona regularZona Irregular

Figura 7.4: Integracion adaptativa

A continuacion expondremos una implementacion muy sencilla de una integracionadaptativa basada en la regla de Simpson. El estimador se basa en comparar el resultadoobtenido, en cada subintervalo, por la regla de Simpson simple, y la compuesta con dossubintervalos.

Dado que la regla de Simpson se obtiene de la regla del trapecio utilizando un unicopaso de extrapolacion (Ejercicio 7.12), obtenemos de (7.3)∫ b

a

f(s) ds− h

6

(f(a) + 4f(c) + f(b)

)︸ ︷︷ ︸

Q1(f)

= c(1)2 h4 +O(h6) (7.4)

∫ b

a

f(s) ds− h

12

(f(a) + 4f(d) + 2f(c) + 4f(e) + f(b)

)︸ ︷︷ ︸

Q2(f)

=c(1)2

16h4 +O(h6) (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 suficientemente pequeno, es c(1)2 h4 de forma que∫ b

a

f(s) ds−Q1(f) ≈ c(1)2j h4.

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

Q2(f)−Q1(f) ≈(1− 1

16

)c(1)2j h4

y por tanto16

15(Q2(f)−Q1(f)) ≈ c

(1)2j h4 ≈

∫ b

a

f(s) ds−Q1(f)︸ ︷︷ ︸error

.

130

Page 137: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

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

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

est =

∣∣∣∣16

15(Q1(f)−Q2(f))

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

Si est > ε se aplica el argumento anterior en los subintervalos [a, c] y en [c, b] conuna 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 unicaforma, en este estado inicial, de que un subintervalo no se divida es que la integral secalcule dentro de la tolerancia prefijada. Obviamente el algoritmo anterior se programade forma natural de manera recursiva.

El papel fundamental lo juega una funcion, que podrıa 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 Simpsonen [a,b] y tol la tolerancia con la que se pide la integral. Se procede entonces siguiendolos 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

Page 138: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.1 Formulas de cuadratura LECCION III

Si hemos seguido el esquema anterior y nos vemos forzados a dividir en dos subinter-valos, habremos evaluado ya f en a, c y en su punto medio d y en c, b y el correspondientepunto medio e. Tambien se habra calculado la regla de Simpson en estos intervalos. Es porello que enviamos todos estos valores en las llamadas de la funcion simpsonadaptativo,dado que generalmente la operacion mas costosa es precisamente evaluar la funcion.

Notemos que se ha optado por devolver como aproximacion de la integral Q2(f), enlugar de Q1(f)14. Otra variante es devolver

16Q2(f)−Q1(f)

15

que es el primer paso de extrapolacion de Simpson (o el segundo del trapecio, de acuerdoal problema 7.2).

La forma mas simple de implementar el proceso anterior es introduciendo una funcionde cabecera que prepare los datos iniciales: recibe la funcion, el intervalo de integracion yla tolerancia solicitada, y calcula para arrancar la subrutina simpsonadaptativo el puntomedio c, los valores de f en a, b y c y el resultado de aplicar la regla de Simpson simpleen [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 infinito si nose consigue integrar con la tolerancia exigida en las sucesivas subdivisiones de un intervalo.Para evitar este problema hacemos que el programa lleve control del numero de veces que hasubdividido un intervalo. La funcion puede seguir la siguiente sintaxis

14Casi nadie dudarıa en esta eleccion. Es decir, es esperable que Q2(f) sea mejor que Q1(f), ası que ¿porque no devolver lo mejor que se tiene?. Matematicamente, sin embargo, el estimador del error controlael error de Q1(f) y no de Q2(f).

132

Page 139: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

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

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 desubdividir y se continua la ejecucion del programa devolviendo el ultimo valor calculado. Elparametro subdmax puede dejarse como un valor por defecto que puede modificarse si el usuarioespecifica otro valor. Es decir, entra a formar parte de un conjunto variable de argumentos deentrada.

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 final se desea que los puntos x2 esten ordenados se puede aplicar la instruccionsort(x2) que devuelve el vector con sus componentes ordenadas de menor a mayor.)

Nota final

De un estimador se suele hablar de dos conceptos bien importantes: confiabilidad yeficiencia. Un estimador es confiable si efectivamente el error esta por debajo de lo que elestimador calcula. Por contra, es eficiente si el estimador aproxima bien el error cometido.Nuestro estimador, en general, es poco eficiente: el error real suele estar muy por debajo dela cantidad que nos devuelve el estimador, especialmente si el intervalo de integracion esgrande. Por ejemplo, para f =

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

133

Page 140: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.2 Transformada rapida de Fourier LECCION III

Adaptativa Pto. medio Trapecio Simpson

tol Error neval Error Error Error10−1 8.91e−03 7 8.01e−3 −3.67e−2 −1.01e−210−2 1.41e−04 15 2.70e−3 −1.06e−2 −3.59e−310−3 1.57e−06 29 1.03e−3 −3.81e−3 −1.40e−310−4 2.12e−07 47 5.01e−4 −1.82e−3 −6.90e−410−5 8.48e−09 77 2.45e−4 −8.67e−4 −3.33e−410−6 2.64e−10 133 1.09e−4 −3.81e−4 −1.36e−410−7 8.27e−12 233 4.73e−5 −1.64e−4 −6.41e−510−8 2.25e−13 421 1.96e−5 −6.76e−5 −2.65e−5

Cuadro 7.2: Resultados numericos para∫ 2

0

√x dx. Tolerancia exigida (tol), numero de

evaluaciones (neval) y error cometido (Error). Comparativa con las reglas del punto medio,del trapecio y de Simpson con h fijo y el mismo numero de evaluaciones

de 10−5 el error real cometido por el metodo adaptativo es 8.48 ·10−9, un error 1000 vecesmenor en magnitud. Una forma de corregir este problema es, una vez que se ha decididodividir el intervalo de integracion en dos subintervalos, no exigir una tolerancia tol/2 encada 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 quehemos visto en esta seccion. Por otro lado, quadl utiliza una regla de orden mayor queda mejores resultados si el integrando es mas regular.

El codigo de estas funciones esta abierto, luego se puede editar para ver los detallesde su implementacion.

7.2. Transformada rapida de Fourier

La transformada rapida de Fourier, o FFT, segun sus siglas en ingles15, es una her-ramienta muy potente en el analisis de senales periodicas y cuyas aplicaciones se hanextendido a aspectos muy diferentes del Calculo Numerico.

Existen diversas formas de introducir la FFT. Hemos escogido la interpretacion querelaciona la transformada de Fourier discreta con los coeficientes de Fourier para enlazarseguidamente con algunas aplicaciones.

15El nombre correcto serıa transformada discreta rapida de Fourier, para distinguirla de la transformadade Fourier continua. Sus siglas en ingles, FFT, podrıan entonces provenir de Fast Fourier Transform oFinite Fourier transform. De acuerdo a lo anterior, las siglas mas adecuadas serıan FFFT (Fast FiniteFourier transform), pero nadie utiliza esta nomenclatura, seguramente por el exceso de Fs)

134

Page 141: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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θ) = eiθ = cos θ + i sen θ, θ ∈ R,

donde i es la unidad imaginaria. �Dada una funcion 1–periodica, esta se puede expresar en forma de serie de Fourier

f(θ) =∑m∈Z

f(m) exp(2πimθ), θ ∈ R (7.6)

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

f(m) =

∫ 1

0

f(θ) exp(−2πimθ)dθ, m ∈ Z.

La convergencia de la serie es un asunto algo delicado16, pero si la funcion tiene, porejemplo, derivada continua, la convergencia de la serie es uniforme:

maxθ∈[0,1]

∣∣∣f(θ)−s∑

m=−r

f(m) exp(2πimθ)| → 0, cuando r, s→∞,

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

La identidad (7.6) se interpreta en el sentido de que la funcion original f es sumainfinita de unas frecuencias fundamentales. Observa que para cada m,

exp(2πimθ),

es una funcion 1/m-periodica, o dicho de otra forma, su periodo es 1/m (ver la Figura7.6).

Ademas se tiene la relacion∫ 1

0

|f(θ)|2 dθ =∞∑

m=−∞

|f(m)|2 (7.7)

que se interpreta como que la energıa de funcion original f es igual a la energıa del vectorinfinito (. . . , f(−2), f(−1), f(0), f(1), f(2), . . .)>.

16Mucho se ha escrito sobre esto. En cualquier caso hay que especificar en que sentido converge laserie. El sitio mas adecuado, matematicamente hablando, es el espacio de las funciones cuyo cuadradoes integrable, que se denota por L2(0, 1). Fısicamente se interpreta como el espacio de las senales cuyaenergıa es finita.

135

Page 142: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.2 Transformada rapida de Fourier LECCION 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 1Freq 2 periodo 1/2Freq 3 periodo 1/3

Figura 7.6: Primeras exponenciales trigonometricas.

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

f = f(0) +∞∑

m=1

(f(m) + f(−m))︸ ︷︷ ︸=: αm

cos(2πm · ) +∞∑

m=1

i(f(m)− f(−m))︸ ︷︷ ︸=: βm

sen(2πm · ) (7.8)

donde αm y βm se pueden calcular de forma alternativa mediante

αm = 2

∫ 1

0

f(θ) cos(2πmθ) dθ, βm = 2

∫ 1

0

f(θ) sen(2πmθ) dθ.

La expresion (7.8) puede resultar mas atractiva que (7.6), especialmente si la funcion esreal puesto que implica trabajar unicamente con cantidades reales, sin parte imaginaria.Sin embargo, tanto el analisis como una notacion mas compacta animan a utilizar laexponencial compleja. Aun es mas, en lo que sigue podemos suponer que las funcionesson complejas (devuelven valores en C) y por tanto se cubre este caso de forma muynatural. �

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

xj = jN

, j = 0, . . . , N − 1,

se evaluayj := f (xj) , j = 0, . . . , N − 1

136

Page 143: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

y se construye el vector

y =

y0

y1...

yN−1

.

La primera cuestion es

¿Es posible recuperar los coeficientes de Fourier de f a partir de y?

La respuesta obvia es no: si tomamos una cantidad finita de informacion es imposiblerecuperar (salvo en casos triviales) los coeficientes de Fourier, que en ultima media son lafuncion y, por tanto, conllevan una cantidad infinita de informacion.

Ahora bien, la situacion es muy diferente si disponemos de informacion a priori sobrela 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 coeficientespueden ser suficientes para reconstruir la funcion de forma muy aproximada.

Para calcular estos coeficientes utilizamos la regla del trapecio, que como hemos vistoen la seccion anterior converge muy rapidos para funciones regulares y periodicas. Todolo anterior nos conduce a

f(k) :=

∫ 1

0

f(θ)exp(−2πikθ) dθ

≈ 1

N

[12f(0) +

N−1∑j=1

f( jN

) exp(−2πijkN

) +1

2f(1)

] f(1) = f(0) = y0

↓=

=1

N

N−1∑j=0

yjωjk

dondeω := exp

(−2πi

N

).

Lo anterior sugiere construir

Yk :=1

N

N−1∑j=0

yjωjk

como una aproximacion de f(k). El vector

Y =

y0

y1...

yN−1

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

137

Page 144: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.2 Transformada rapida de Fourier LECCION III

Ejercicio 7.18 Sea f es periodica con derivada primera continua,

f(k) :=

∫ 1

0

f(θ) exp(−2πikθ) dθ = − 1

2πkif(θ) exp(−2πikθ)

∣∣∣∣θ=1

θ=0︸ ︷︷ ︸= 0

+1

2πki

∫ 1

0

f ′(θ) exp(−2πikθ) dθ.

Demostrar entonces que

|f(k)| ≤ C

kdonde C es independiente de k. ¿De que depende C?. Prueba reiterando este argumento quesi f es mas regular el decrecimiento de f(k) es mas acusado.

Para estudiar la relacion entre transformada de Fourier continua y discreta precisamosdel siguiente lema

Lema 7.5 Para todo k ∈ Z

1

N

N−1∑j=0

exp(−2πijk

N

)=

{1, k = `N para algun ` ∈ Z,

0, en caso contrario.

Demostracion. Tomemos como antes

ω := exp(−2πi

N

).

Entonces, la suma anterior es simplemente

1

N

N−1∑j=0

ωjk =1

N

N−1∑j=0

(ωk)j.

Si k = `N , es decir, si k es un multiplo de N , ωk = exp(−2πi`) = 1 y la suma anterior es1. En caso contrario, teniendo en cuenta que

1 + r + r2 + . . . + rm−1 =1− rm

1− r

obtenemos que

1

N

N−1∑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 sumatorios17

podemos escribir

Yk :=1

N

N−1∑j=0

yjωjk =

1

N

N−1∑j=0

f(xj) exp(−2πijk

N

)=

1

N

∑m∈Z

f(m)[N−1∑

j=0

exp(

2πi(m−k)jN

) ].

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

138

Page 145: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

Por el lema anterior,

N−1∑j=0

exp(

2πi(m−k)jN

)=

{1, si m = k + `N ,0, en caso contrario,

por lo que

Yk =1

N

∑m∈Z

f(k + mN).

De esta forma, Yk recoge no solo el coeficiente k−esimo de Fourier, sino contribuciones enfrecuencias mas altas, cuya distancia al coeficiente k dista un multiplo de N .

Llegado a este punto, conviene recordar que el decreciemiento rapido a cero de loscoeficientes de Fourier cuando |k| → ∞ sugiere que Yk aproxima bien al coeficientede Fourier mas proximo a cero y la aproximacion mejora muy rapidamente cuandoN →∞. Es decir,

Yk =

f(k)+∑m6=0

f(k + mN)︸ ︷︷ ︸pequeno

, si 0 ≤ k ≤ N2

f(k −N)+∑m6=0

f(k + mN)︸ ︷︷ ︸pequeno

, si N2

< 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−1Y = y.

Con argumentos similares a los utilizados anteriormente se puede ver que

yk :=N−1∑j=0

Yj exp(

2πijkN

),

obteniendose ası una expresion muy similar a la transformada de Fourier. En particular,concluimos que F−1 existe y esta bien definida.

Nota. En el marco continuo, tenıamos que

f(m) =

∫ 1

0

f(θ) exp(−2πimθ) dθ, f(θ) =∑m∈Z

f(m) exp(2πimθ).

Observese el paralelismo entre la Transformada de Fourier Discreta, y la integral de laexpresion superior (la primera es la aproximacion discreta de la segunda) y la inversa dela Transformada de Fourier Discreta con la serie de Fourier.

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

139

Page 146: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.2 Transformada rapida de Fourier LECCION III

Ejercicio 7.20 Dado que vamos a calcular aproximaciones de los coeficientes centrales deFourier, podrıamos plantearnos definir

Yk =N−1∑j=0

yjωjk, −N/2 < k ≤ N/2

¿Sabrıas ver que relacion hay entre Yk e Yk?.

7.2.2. Calculo de la transformada de Fourier Discreta

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

W :=

1 1 1 · · · 11 ω ω2 · · · ωN−1

1 ω2 ω4 · · · ω2(N−1)

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

1 ωN−1 ω2(N−1) · · · ω(N−1)2

, ω = exp(−2πi

N

)

Con esta matriz, la relacion entre y y su transformada Y se escribe simplemente

Y = Fy =1

NWy.

Analogamente,

y = F−1Y = W ∗Y

donde W ∗ es la matriz adjunta

W ∗ =

1 1 1 · · · 11 ω ω2 · · · ωN−1

1 ω2 ω4 · · · ω2(N−1)

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

1 ωN−1 ω2(N−1) · · · ω(N−1)2

, ω = ω−1 = exp(

2πiN

)

La matriz W es una matriz de tipo Vandermonde, que ya surgido anteriormente.Ademas es casi ortogonal:

W ∗W = N IN

donde IN la matriz identidad de orden N .En resumen, la transformada discreta de Fourier, y su transformada inversa, se reducen

a calcular un producto matriz-vector. El costo, en una implementacion directa, conllevala construccion de la matriz y realizar el producto. Solo el producto tiene un costo deorden O(2N2) operaciones (sumas y productos).

Ejercicio 7.21 Construye la matriz W ∗.

Ejercicio 7.22 Implementa la transformada discreta de Fourier.

140

Page 147: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

Solucion. Esta es una implementacion que evita construir la matriz W . En su lugarcalcula sucesivamente las filas, la multiplica por y para hallar el correspondiente coeficientey calcula la siguiente fila. De esta forma se reduce la memoria utilizada pero no el numerode 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 finales

Si f es real,Re f(k) = Re f(−k), Im f(k) = −Im f(−k).

Esta simetrıa se extiende a la transformada discreta: si y es real

Im y0 = 0, Re yk = Re yN−k, Im yk = −Im yN−k, k = 1, . . . , N − 1.

De esta forma, si ignoramos la primera componente, la parte real de Y, respectivamenteimaginaria, es simetrico, respectivamente antisimetrico, respecto al punto N/2. Este puntose conoce como el punto de Nyquist.

Otra analogıa 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 energıa.Concretamente (comparar con (7.7))

‖Y‖22 = Y∗Y =1

N2(Wy)∗(Wy) =

1

N2y∗W ∗Wy =

1

Ny∗y =

1

N‖y‖22. (7.10)

Hay una falta de consenso en la definicion de Transformada de Fourier discreta.Nosotros hemos tomado como definicion de la transformada y de su inversa las dadaspor

Yk :=1

N

N−1∑j=0

yjωjk, yk :=

N−1∑j=0

Yjω−jk, ω = exp(−2πi

N).

141

Page 148: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.2 Transformada rapida de Fourier LECCION III

En Matlab, la transformada de Fourier y su inversa estan implementadas en fft e ifft.La definicion que se toma es ligeramente diferente

Yk :=N−1∑j=0

yjωjk, yk :=

1

N

N−1∑j=0

Yjω−jk, ω = exp(−2πi

N).

En otros textos se multiplica por 1/√

N en ambos sumatorios con el fin de dar un aspectomas uniforme (en este caso la norma 2 del vector y de su transformada coinciden). Encualquier caso, la diferencia entre las diferentes transformadas es simplemente el productopor una potencia de N .

Todo lo desarrollado en esta seccion es perfectamente aplicable a funciones periodicascon distintos periodos, sin mas que aplicar un cambio de variables y transformarla en1−periodica.

7.2.3. Aplicaciones a la eliminacion de ruido

Una de las primeras aplicaciones surge en el analisis de senales y fenomenos periodicos.Vamos a mostrar un (muy) simple ejemplo en la eliminacion de ruido de una senal periodi-ca. Suponemos que la senal, dada por una funcion regular y suave, es perturbada por unruido que puede ser modelizado por una variable aleatoria que sigue una distribucionuniforme.

Como la senal original es regular, sus coeficientes de Fourier decrecen rapidamentea cero. En particular, la funcion puede ser aproximada por una suma parcial con unaspocas exponenciales trigonometricas. Dicho de otra forma, la funcion tiene unas pocasfrecuencias importantes mientras que el resto tiene una aportacion despreciable.

Tomemos por ejemplo una senal dada por la funcion

f(x) := cos(cos(12πx)) sen(2πx)

En la Figura 7.7 se muestra la funcion y sus coeficientes 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 relacionentre transformada discreta de Fourier y los coeficientes de Fourier mostrada en (7.7).

En el campo discreto, tenemos un ruido r y el vector transformada de Fourier discretaR = Fr. Visto en el campo transformado, esta perturbacion tiene un tamano, relacionadocon la amplitud del ruido y con el numero de puntos que se han tomado de muestra. Dadoel comportamiento altamente irregular, es esperable que las contribuciones en todas lasfrecuencias sean similares. Pero

‖R‖22 =1

N‖r‖22 ≤ max

j=0,...,N−1|rj|.

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 decrecimientosea uniforme en todas las componentes, es decir,

Rj ≈1√N

142

Page 149: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

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

0.1

0.2

0.3

0.4Coef. 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 600

0.1

0.2

0.3

0.4

FT de la señal discreta (valor abs.)

Señal continua con un muestreo de 64 puntos

Figura 7.7: Coeficientes de Fourier y transformada discreta de Fourier

Ahora, si consideramos la influencia de este ruido sobre una senal y, tenemos la senalperturbada y = y + r. Se trata ahora de eliminar ese ruido observando la transformadaY.

La estrategia que planteamos es la siguiente. En el caso de que Yj sea grande, pode-

mos aceptar este coeficiente dado que el error relativo es pequeno. Por contra, si Yj espequeno, el error relativo que hemos introducido es tal que la informacion ha quedadoirremediablemente contaminada y por tanto debemos desecharla.

Lo anterior sugiere una forma de depurar la senala, partiendo de un nuevo vector Z

Zk =

{0 si |Yk| es pequeno,

Yk en otro caso.(7.11)

Con la informacion que nos queda, reconstruimos la senal discreta original y medianteF−1Z. Ası tenemos el siguiente diagrama

y+ ruido−→ y

F−→ Y(7.11)−→ Z

F−1

−→ z.

Al final de proceso, z es (deberıa ser) mejor aproximacion de y que la senal perturbaday.

En la Figuras 7.9 se muestran los resultados obtenidos con n = 64 y n = 256. Se puedeobservar como la senal es filtrada eliminando gran parte del ruido introducido.

143

Page 150: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.2 Transformada rapida de Fourier LECCION III

10 20 30 400

0.02

0.04

0.06

0.08

10 20 30 400

0.005

0.01

0.015

50 100 1500

0.02

0.04

0.06

0.08

50 100 1500

2

4

6

8x 10-3

Figura 7.8: Ruido en un conjunto de puntos (40 arriba, 160 abajo) y su transformadadiscreta

7.2.4. Transformada rapida de Fourier

La importancia del analisis de Fourier, y por ende de la transformada discreta deFourier, fue cobrando fuerza a lo largo del siglo XX y muchos aspectos siguen demandandoeste tipo de tecnicas en el siglo actual.

Pronto surgieron problemas que requerıan calcular la transformada de Fourier de mil-lones de elementos, lo que colocaba el problema mas alla de la potencia de los ordenadoresde la epoca y los de un futuro previsible18. En cualquier caso duplicar N , el numero deelementos de y, requerirıa multiplicar por cuatro la potencia del ordenador. Siguiendo elprogreso de la informatica, esto significarıa una espera de 36 meses19.

18Hemos mostrado algunas aplicaciones simples de la transformada de Fourier que son esencialmenteunidimensionales (una senal periodica). Existen aplicaciones que exigen trabajar ya con senales bidimen-sionales. En ese caso, duplicar la precision con la que se trabaja implica multiplicar por 4 la dimensiondel problema y por 16 la complejidad computacional del algoritmo que hemos visto. Problemas en masdimensiones y con numeros muy elevados de variables no son extranos.

19La ley de Moore formulada por Gordon Moore cofundador de Intel en 1965 es un ejemplo de unaley empırica que se viene satisfaciendo con asombrosa regularidad en los ultimos cuarenta anos. Esta leyestablece 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 decrecimiento exponencial en el mundo de la informatica.

144

Page 151: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

0 0.2 0.4 0.6 0.8 1-1

-0.5

0

0.5

1Señal con ruido

0 10 20 30 40 50 600

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 600

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

1Señal filtrada

64 puntos

0 0.2 0.4 0.6 0.8 1-1

-0.5

0

0.5

1Señal con ruido

0 50 100 150 200 2500

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 2500

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

1Señal filtrada

256 puntos

Figura 7.9: Filtrado del ruido

145

Page 152: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.2 Transformada rapida de Fourier LECCION III

En 1965, Jim Cooley, investigador ligado a IBM y John Tukey, de la Universidad dePrinceton mostraron una forma sencilla de programar la transformada de Fourier discretaque reducıa drasticamente el numero 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

Yk =1

N

N−1∑j=0

yjωjk =

1

N

M−1∑j=0

y2jω2jk

︸ ︷︷ ︸Pares

+1

N

M−1∑j=0

y2j+1ω(2j+1)k

︸ ︷︷ ︸Impares

N = 2M↓=

1

2

[ 1

M

M−1∑j=0

y2jωjk1 + ωk 1

M

M−1∑j=0

y2j+1ωjk1

]=:

1

2

[Y

(0)k + ωkY

(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 (y0, y2, . . . , y2M−2)> y a (y1, y3, . . . , y2M−1)

> respectivamente, que sonvectores 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

Yk =1

N

N−1∑j=0

yjωjk =

1

N

M−1∑j=0

y2jω2jk +

1

N

M−1∑j=0

y2j+1ω(2j+1)k

=1

2

[ 1

M

M−1∑j=0

y2jωjM1 ωjκ

1 + ωMωκ 1

M

M−1∑j=0

y2j+1ωjκ1

].

Dado queωM = exp(−πi) = −1, ωM

1 = 1;

se deduce que

Yk =1

2

[Y (0)

κ − ωκY (1)κ

]. (7.13)

Denotando por[ vw]

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 (y0, y2, . . . , y2M−2)> y

(y1, y3, . . . , y2M−1)>,

ω = (ω0, ω1, . . . , ωM−1)>, ω := exp(−2πiN

), (7.15)

146

Page 153: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

y “.*” denota el producto elemento a elemento entre las componentes de los vectores.En cuando al numero de operaciones, si f(N) es el numero de multiplicaciones, se

comprueba que el total de productos es el de dos transformadas de longitud N/2 mas Nproductos 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) eY(1) si M es divisible por 2 (o lo que es lo mismo, que N sea divisible por 4). De formanatural, se puede programar el metodo de forma recursiva.

El caso optimo del algoritmo en la version anterior se da cuando N = 2p. El algoritmoqueda de la siguiente forma

FFT

N =length(y)if N==1

Y=yelse

Y(0) := FFT(y(0 : 2 : N − 2)) % Parte ‘‘par’’

Y(1) := FFT(y(1 : 2 : N − 1)) % Parte ‘‘impar’’

ω = exp(−2πi/N)ω := [ω0, ω1, . . . , ωN/2−1]>

Y(0 : N/2− 1) = (Y(0) + ω. ∗Y(1))/2Y(N/2 : N − 1) = (Y(0) − ω. ∗Y(1))/2

end

En tal caso, se puede comprobar que el numero de productos es

f(N) = 2p(p + 1) = N(log2(N) + 1)

que debe compararse con el N2 esperable de la implementacion directa. De ahı viene elnombre 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 deMatlab para el calculo de la transformada rapida de Fourier. Entrando ya en programa, enprimer lugar podemos plantearnos como se va a devolver el resultado, si como un vectorfila o como un vector columna. Para ello, la primera instruccion de nuestra subrutinapodrıa ser

y=y(:); Y=y;

si se quiere trabajar solo con columnas, o

147

Page 154: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.2 Transformada rapida de Fourier LECCION III

y=y(:).’; Y=y;

si se desea implementar para filas. Fıjate que ya hemos introducido el vector que va aguardar 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 numero par de elementos, la transformada se calcula a partir de

la transformada de los vectores

y(1 : 2 : n) −→ (y0, y2, . . . , yn−2)>, (Y(0))

y(2 : 2 : n) −→ (y1, y3, . . . , yn−1)>, (Y(1))

de acuerdo con el algoritmo (vease tambien (7.14) y (7.15)).Cuando el numero de entradas de y no sea una potencia de 2 se puede utilizar el primer

algoritmo que dimos (ejercicio 7.22). De esta manera tendrıamos 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 lıneas anteriores, mod(m,n) devuelve el resto de la division de m entre n y sirvepara comprobar si el numero de entradas es par o impar.

Ejercicio 7.25 Implementa una funcion recursiva que devuelva el numero de operacionespara el calculo de la FFT. Utilızala para obtener una tabla con el numero de operaciones paraalgunos valores altos de N . Compara con el numero de operaciones requerido en la versioninicial 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

Page 155: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

�Hemos testado la funcion con 219 y 219 − 1 que es primo. Este es el resultado

>> format rat

>> operacionesfft(2^19) %(2^19 approx 500.000)

ans=

10485760

>> operacionesfft(2^19-1)

ans =

274876858369

Observa que el numero de operaciones efectuadas se reduce en un factor de 26000 siaumentamos en uno el numero de elementos.

Ejercicio 7.26 Implementa la Inversa de la Transformada Discreta de Fourier con nombreInvTrRaFourier.

Ejercicio 7.27 En este ejercicio observaremos la dependencia de la FFT implementada enMatlab respecto del numero de entradas del vector. Para ello, utilizaremos de nuevo los valores219 − 1 y 219 propuesto anteriormente. Define dos vectores y1 y y2 con 219 − 1 y 219 com-ponentes respectivamente, por ejemplo, mediante la orden rand. Aplica fft(y1) y fft(y2)

y comprueba el tiempo que tarda en cada caso. ¿Sabrıas explicar por que se reduce el tiempode calculo?.

Nota final

Las implementaciones comerciales de la FFT son ciertamente mas complicadas quelo que hemos visto. En realidad, los metodos recursivos son menos eficientes que lasimplementaciones directas, que no hacen uso de la recursividad.

En lugar de ello se opta por una programacion directa, mas refinada. No solo sedescompone la transformada en dos de longitud mitad de la original, como se ha mostradoen este algoritmo, sino que ademas se intenta dividir por los primeros numeros primos 2,3, 5, 7,... reduciendola a dos, tres, cinco o siete transformadas y ası sucesivamente. Inclusoel caso de numeros primos se realiza de forma mas optima que el algoritmo (ingenuo) delejercicio 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 eimplementacion. Existen otras transformadas ligadas a esta. Por ejemplo, la transformadadel coseno y la del seno, tambien implementadas en Matlab (dct, idct, dst y idst). .

149

Page 156: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.2 Transformada rapida de Fourier LECCION III

La FFT y el producto de numeros enteros

Dados dos vectores

u = (u0, u1, . . . , ur)>, v = (v0, v1, . . . , vs)

>

se define el vector convolucion u ∗ v al vector de r + s + 1 componentes cuya entrada kviene dada por

(u ∗ v)k :=∑

`+j=k

u`vj =

mın{k,r}∑`=max{0,k−s}

u`vk−`, (k = 0, . . . , r + s). (7.16)

Es facil comprobar que la convolucion, tambien llamado producto de convolucion, esconmutativo. Esta operacion es simplemente el producto de polinomios. En efecto, siconsideramos los polinomios

u0 + u1x + . . . + urxr, v0 + v1x + . . . + vsx

s

entonces el coeficiente en xk del polinomios producto viene dado precisamente por (7.16).Una propiedad interesante de la transformada de Fourier discreta es que convierte la

convolucion de dos vectores en producto de transformadas. Tomemos N = r + s. Si u yv se insertan en Rn+1 rellenando con ceros

u = (u0, u1, . . . , ur, 0, . . . , 0︸ ︷︷ ︸N − r = s ceros

)>,v = (v0, v1, . . . , vs, 0, . . . , 0︸ ︷︷ ︸N − s = r ceros

)

tenemos queF (u ∗ v) = N (F (u). ∗ F (v)),

donde la operacion anterior es el producto elemento a elemento entre los vectores. Ası, unaforma 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 numero de operaciones es del orden deO(n log2(N)), comparado con 2N2 que tiene la implementacion mas directa.

Una de las aplicaciones mas simples del calculo de productos de convolucion esta enel producto de numeros enteros. Por ejemplo,

6031 → 1 + 3 · 10 + 0 · 102 + 6 · 103

1234 → 4 + 3 · 10 + 2 · 102 + 1 · 103

}⇒

⇒ 6031× 1234 = 4 + 15 · 101 + 11 · 102 + 31 · 103 + 21 · 104 + 12 · 105 + 6 · 106

= 7442254.

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) =: u1234 → (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 numeros enteros.

150

Page 157: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION III Capıtulo 7. Formulas de cuadratura. FFT

Ejercicio 7.28 Implementa una funcion que calcule el producto de dos numeros enteros conla 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 eficiente necesitamos que los vectores sobre losque se va a aplicar la transformada de Fourier tengan longitud una potencia de 2. Paraello podemos insertar mas ceros de los inicialmente previstos de forma que N sea unapotencia20 de 2.

Para disponer de una precision en principio ilimitada, introduciremos los numerosque deseamos multiplicar en una cadena de caracteres y haremos la salida en el mismoformato. Para su implementacion necesitaremos manejarnos con la conversion entre losdiversos 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 numeros y viceversa. Paraello se puede utilizar los comandos str2num, num2str(STRing-to-NUMeric y NUMeric-to-STRing).

Una vez que tengamos el vector de numeros hay que darle la vuelta al vector, de formaque

’1234’ [4 3 2 1].

20¿Que hace log2(ceil(r+s))?

151

Page 158: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador7.2 Transformada rapida de Fourier LECCION III

Por ultimo una vez multiplicados hay un paso de acarreo, es decir, un resultado de formaque

[4 15 11 31 21 12 6] 4 + 15 · 101 + 11 · 102 + 31 · 103 + 21 · 104 + 12 · 105 + 6 · 106

debe transformarse en su representacion decimal

4 + 5 · 101 + 2 · 102 + 2 · 103 + 4 · 104 + 4 · 105 + 7 · 106 = 744224.

Nota. ¿Para que preocuparse en multiplicar numeros enteros? Es decir, no parece haberuna necesidad acuciente de disenar algorimos para multiplicar numeros de centenares omiles 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 matematicos21

Ron Rivest, Adin Shamir y Len Adleman en 1977, esta basado en el conocido TeoremaPequeno de Fermat22. Este teorema, muy simple, tiene que ver con los restos de la divisionpor numeros primos. El mensaje que se desea enviar se convierte en un numero entero,mas o menos largo. El cifrado y descifrado del mensaje se basa en calcular restos de di-visiones por el producto de dos numeros primos muy grandes. La seguridad del sistemadepende directamente del tamano de estos primos: mayor tamano es mayor seguridad.Ello hace que se requiera calcular productos y divisiones de numeros enteros enormes deforma rapida y eficiente23. �

Nota. La convolucion esta implementada en Matlab mediante el comando conv. Laforma de calcular es esencialmente la expuesta en esta seccion. �

21El nombre del algoritmo son las iniciales de sus apellidos.22Nada que ver con el Ultimo Teorema de Fermat, cuya demostracion tuvo que esperar cuatro siglos.23Para una informacion mas detallada, mırese por ejemplo http://en.wikipedia.org/wiki/Rsa.

152

Page 159: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLeccion IV

Calculo simbolico, arrays y celdas en Matlab.Valores y vectores propios. Google.

153

Page 160: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador

Page 161: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorIntroduccion

La physique ne nous donne pas seulementl’occasion de resoudre des problemes... ellenous fait pressentir la solution

Henri Poincare

En la primera parte de esta leccion trataremos diversos aspectos instrumentales deMatlab, como el manejo de polinomios, arrays multidimensionales (tensores) y vectores deceldas. Daremos ademas algunos esbozos sobre la manipulacion de expresiones simbolicas.Aunque en este campo Matlab no es comparable a otros manipuladores simbolicos comoMaple o Mathematica, puede resultar en muchos casos suficiente.

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 unrecordatorio de lo que vimos en las Lecciones 1 y 2. Con el fin de aliviar el peso teorico dela parte matematica, terminaremos con un capıtulo fundamentalmente divulgativo sobreGoogle y su algoritmo de evaluacion de paginas web Pageranktm.

155

Page 162: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador

Page 163: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorCapıtulo 8

Matlab: Calculo simbolico yestructuras 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 operacionesbasicas en un ordenador. En esta seccion veremos como maneja Matlab un polinomio ynos servira de preparacion para la seccion siguiente donde veremos someramente la toolboxde calculo simbolico.

8.1.1. Polinomios

Matlab maneja un polinomio identificandolo simplemente con un vector de numeros(en principio) reales. Concretamente, el vector fila (an, . . . , a0)

> corresponde al polinomioanx

n + an−1xn−1 + . . . + a0. Si algun coeficiente es nulo, debe incluirse. Por ejemplo, el

vector (1, 0, 2)> representa el polinomio x2 + 2. Sumar y restar dos polinomios se reduceası a sumar y restar dos vectores, salvando el problema de que ambos deben tener elmismo 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

Page 164: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador8.1 Polinomios y calculo simbolico LECCION 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 segun 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

Raıces de polinomios

Las raıces de un polinomio p son las soluciones de la ecuacion p(x) = 0. El TeoremaFundamental del Algebra1 afirma que un polinomio de grado n tiene exactamente n raıcesen C (alguna puede estar repetida).

1Demostrado por primera vez por Carl Friedrich Gauss en 1799 (a los 22 anos) en su tesis doctoral.Gauss ha salido repetidamente en estas lecciones y en campos muy distintos, desde las Matematicas masaplicadas a las mas puras. Quizas ahora se comprenda mejor por que recibio el sobrenombre de“prıncipede las Matematicas”.

158

Page 165: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION IV Capıtulo 8. Matlab: Calculo simbolico y estructuras de datos.

En Matlab podemos utilizar roots para calcular de forma aproximada las raıces de unpolinomio:

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

Recıprocamente, dado un vector que contenga las raıces, podemos crear un polinomiomonico (el coeficiente que acompana a la mayor potencia de x es 1) cuyas raıces sean lasdadas:

>> poly([-3 5/2 2])

ans =

1 -3/2 -17/2 15

El comando poly puede emplearse tambien para construir el polinomio caracterıstico deuna 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

Page 166: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador8.1 Polinomios y calculo simbolico LECCION IV

En la segunda parte de esta leccion nos centraremos en los metodos numericos para elcalculo de las raıces de estos polinomios2.

Nota. Un problema clasico3 es la determinacion de las raıces de un polinomio. Laecuacion de segundo grado aparece mas o menos resuelta en las Matematicas antiguas:babilonicas, griegas, hindues y arabes. Es un hecho muy resaltable que no existıa unaformula para la solucion como la como la que conocemos hoy en dıa, sino que los autoresdescribıan diversas ecuaciones, habitualmente con ejemplos concretos, para luego explicarcomo se procedıa a resolverlas4 a menudo con razonamientos geometricos que excluıancualquier resultado negativo. Fue en las matematicas hindues donde las raıces negativasfueron consideradas como validas.

Las matematicas italianas primero y europeas despues retoman a partir del siglo XVlas ecuaciones polinomicas. Nicolo Fontana Tartaglia, Girolamo Cardano, Francois Viete,Rene Descartes, Gottfried Wilhelm von Leibniz, Joseph-Louis Lagrange y Leonhard Eulerentre otros matematicos de menor renombre, estudiaron la resolucion por radicales deecuaciones polinomicas de tercer y cuarto grado con un resultado final satisfactorio: seconsiguio dar con formulas que proporcionaban las raıces de un polinomio de grado 4. Sinembargo fueron incapaces de encontrar una formula para la ecuacion general de quintogrado. La cuestion quedo zanjada de forma sorprendente: Niels Henrik Abel probo en 1824(a los 22 anos) que no existıa un formula que diera las raıces de cualquier polinomio degrado 5 mediante la aplicacion de radicales5 tomando raıces enesimas. En ultima medida,se habıa llegado a la conclusion de que era imposible la resolucion exacta de ecuacionespolinomicas de grado mayor o igual que cinco. El estudio de cuando una ecuacion se podıaresolver mediante radicales fue iniciado por Evariste Galois6.

Otro asunto muy diferente es la resolucion numerica del problema. Se dispone de unafamilia de metodos para la resolucion de problemas no lineales generales (es decir, paraecuaciones de la forma f(x) = 0 donde f es una funcion cualquiera, no necesariamentepolinomica) como los metodos de Newton-Raphson, secante, regula–falsi, etc. Sin em-bargo, dadas las particulares propiedades de los polinomios, hay metodos especialmentedisenados para tal fin. Algunos metodos clasicos son los de Bairstow y el de Bernoulli. Enlos ultimos anos el calculo de las raıces de un polinomio ha quedado reducido al calculo

2Las raıces son los valores propios de la matriz A.3La informacion de estas lıneas se ha extraıdo 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 clasifico y explico como resolver ecuaciones de segundo grado en 6 tomos. El desarrollodel Algebra y la manipulacion simbolica de expresiones ha conseguido que este problema pueda serplanteado en nuestros dıas a un alumno de primaria.

5Paolo Ruffini habıa dado una demostracion no del todo correcta en 1799.6Galois y Abel comparten algunas caracterısticas en comun, ambos murieron jovenes (Abel a los 29

anos y Galois a los 21) con buena parte de su trabajo ignorado por la comunidad matematica. La muertede Galois es todavıa mas sorprendente. Frances y republicano convencido, llego a estar en prision por ello,murio en un duelo en 1832 en los anos convulsos posteriores a la revolucion francesa, aunque no esta clarosi este fue por motivos polıticos o de otra ındole. En la noche anterior al duelo escribirıa en el margen deunas notas sobre las que trabaja: “Falta algo para completar la demostracion. No tengo tiempo.”. Estafrase ha cimentado la, probablemente exagerada, leyenda de que paso la noche escribiendo Matematicas.Su trabajo fue rescatado del olvido por Joseph Liouville 11 anos despues.

160

Page 167: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION IV Capıtulo 8. Matlab: Calculo simbolico y estructuras de datos.

de los valores propios de una matriz, simplemente construyendo la matriz companera7

xn + an−1xn−1 + . . . a0

−an−1 −an−2 · · · −a1 −a0

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 estaleccion. �

8.2. Procesador simbolico

Retomando el hilo de la seccion anterior, otra forma de operar con polinomios es demanera 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 variablesimbolica 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 laderivacion:

7De hecho, ası procede roots.

161

Page 168: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador8.2 Procesador simbolico LECCION 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 lımites (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 oLaplace (fourier, ifourier, laplace e ilaplace)

Observa como los resultados son sımbolos y no numeros. En cualquier caso, el comandovpa 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

Page 169: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 simbolico:

>> polyder([1 4 2]) % derivada de x^2+4*x-2

ans=

2 4

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

simplify factor expand collect simple

Consulta la ayuda de Matlab y aplıcalos sobre diferentes expresiones algebraicas susceptiblesde ser simplificadas.

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 raıces de la ecuacion de cuarto gradox4 + ax3 + bx2 + cx + d.

163

Page 170: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador8.3 Tensores LECCION 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 comparablea Mathematica o Maple. Sin embargo se puede acceder a cualquier instruccion de Mapleluego 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 ayudacorrespondiente se accede con mhelp. �

8.3. Tensores

Ya hemos hablado en multiples ocasiones de la gran potencia que posee Matlab pararealizar calculos matriciales8 y su habilidad en el manejo de grandes cantidades de memo-ria. Estas habilidades se extienden a la manipulacion de arrays multidimensionales, quematematicamente se puede identificar con tensores. Un tensor es simplemente una matrizmultidimensional, esto es, si una matriz se puede interpretar como una tabla de numeros,un tensor (o array) tridimensional es simplemente un conjunto de numeros desplegadosen 3D en forma de paralelogramo. Ası

>> a=zeros(1,3,2)

a(:,:,1) =

0 0 0

a(:,:,2) =

0 0 0

define un array de una fila, tres columnas y dos alturas. Abandonaremos en lo que sigueeste sımil geometrico pues aporta poco. Se puede declarar un tensor simplemente dandosus 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

8Recuerda Matlab = Matrix laboratory

164

Page 171: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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

Page 172: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador8.3 Tensores LECCION IV

1 2 3

4 5 6

Por tanto, de las variables que acabamos de definir 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 dela 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

Page 173: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION IV Capıtulo 8. Matlab: Calculo simbolico y estructuras de datos.

Las funciones que operan sobre escalares, tales como sin, cos, etc., funcionan contensores 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 elementosde un tensor como por ejemplo busqueda de maximos o mınimos (max, min) o la suma yproducto (sum, prod), devuelve un tensor de una dimension menos, resultado de realizarla 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

Page 174: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador8.4 Vectores de celdas LECCION IV

8.4. Vectores de celdas

Aunque los tensores anaden mayor flexibilidad a las matrices y vectores, siguen siendoestructuras rıgidas (todas las entradas deben ser numeros reales, a(1,:,:,:) debe tenerla misma dimension que a(2,:,:,:),...).

Matlab cuenta con una estructura que probablemente sea el paradigma de la flexibilidaden 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 celdaso cell array. Ya nos hemos encontrado con esta estructura cuando vimos el diseno defunciones cuyo numero de parametros de entrada y/o salida era variable. Las variablesvarargin y varargout son realmente vectores de celdas que contenıan distintos tipos dedatos a los que se accedıa mediante llaves. Un vector de celdas se maneja del mismo. Amodo 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 pequenas diferencias de sintaxis, de la siguiente forma

>> celda(1)={7};

>> celda(2)={[1 2 3;4 5 6]};

Fıjate en la disposicion de las llaves en los dos ejemplos anteriores. En cualquier caso, unavez definido el vector podemos acceder a cada una de sus componentes indicando entrellaves su posicion

>> celda{1}

ans =

7

>> celda{4}([1 2 4], [2 1 1/2]) % funcion!!

ans =

3.0000 3.0000 4.5000

168

Page 175: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 flexible a la hora de almacenar informacion, essin embargo manejada con menor eficiencia por Matlab, por lo que debe hacerse un usomesurado de ella. Los comandos varargin y varargout proporcionan un buen ejemplode 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 podrıa contener los campos Titulo y Autor que serıan cadenas decaracteres y A~noPublicacion y NumeroPaginas que serıan numeros.

Utiliza la ayuda de Matlab para averiguar como pueden definirse estos tipos de datosmediante la orden struct.

169

Page 176: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador8.4 Vectores de celdas LECCION IV

170

Page 177: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorCapıtulo 9

Calculo numerico de valores yvectores propios.

9.1. Introduccion

El estudio de los valores y vectores propios de una matriz surge ligado a una grancantidad de problemas que se plantean en ambitos de muy diversa ındole, tales como laIngenierıa, Fısica, Economıa, Estadıstica o Biologıa. Algunos ejemplos los encontramosen el calculo de los modos de vibracion de algunas estructuras, el estudio de la evolucionde sistemas dinamicos, compresion de datos, el analisis de redes (grafos),...

El problema que abordamos es el siguiente: dada una matriz A de tamano n × nqueremos encontrar los escalares λ y vectores v 6= 0 que cumplan

Av = λv.

Se dice entonces que λ es un valor propio de A y que v es un vector propio asociadoa λ. Se trata por tanto de buscar las direcciones invariantes bajo los productos por lamatriz.

Equivalentemente, los valores propios de A son aquellos valores λ para los que elsistema lineal homogeneo

(A− λI)v = 0,

tiene soluciones no nulas, y estas soluciones son los vectores propios asociados a λ. Estaexpresion nos da una manera de calcular λ: los valores propios son los valores, reales ocomplejos, para los que A−λI no es invertible, o equivalente, para los que det(A−λI)=0.Concluimos de esta manera que los valores propios son las raıces del polinomio

p(λ) := det(A− λI) = 0.

conocido como polinomio caracterıstico. Dado que p(λ) tiene grado n, habra exactamenten valores propios (aunque alguno de ellos puede estar repetido o ser complejo).

Historicamente los metodos numericos comenzaron trabajando sobre el polinomio car-acterıstico para hallar los valores propios, pero pronto se comprobo que este camino noera el mas indicado. Uno de los hechos que motivaron este abandono radicaba en la in-estabilidad numerica:

171

Page 178: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.1 Introduccion LECCION IV

Las raıces de un polinomio son muy sensibles a variaciones en sus coeficientes;

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 propiossensibles a pequenas modificaciones de las entradas de la matriz?. Afortunadamente paramatrices simetricas se tiene la ansiada estabilidad: pequenas variaciones en A, productopor ejemplo de errores de medida o errores de redondeo, dan lugar a pequenas modifica-ciones en los valores propios1. Para matrices arbitrarias este resultado dista mucho de sercierto, las condiciones para asegurar la estabilidad son mas complicadas, y podemos en-contrarnos con lo que en la terminologıa habitual se denomina, matrices mal condicionadaspara el calculo de valores propios.

Ejemplo Estas lıneas muestran la sensibilidad de una matriz muy simple ante unapequena 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 comoel resultado es mas estable.

1Probado por primera vez por Hermann Weyl en 1911 en un area totalmente distinta.

172

Page 179: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION IV Capıtulo 9. Calculo numerico de valores y vectores propios.

Nota. Este y otros detalles no eran conocidos en los inicios del calculo cientıfico. JamesHardy Wilkinson relata la siguiente anecdota2. Cuando estaba programando en uno de losprimeros ordenadores electronicos el metodo de Newton para la resolucion de ecuacionesno 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, hastaque Wilkinson cayo en la cuenta de que el error no radicaba en su programa sino quelas raıces eran tan sensibles numericamente que se veıan afectadas por los errores deredondeo. Wilkinson demostro que al cambiar el coeficiente de x19 en p, que es −210,por −210 − 2−23, las raıces 16 y 17 se transforman3 en el par complejo 16.73 ±2.81i.El polinomio en cuestion paso a la historia del Numerico con el nombre de “el perfidopolinomio 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 caracterıstico y por tanto los mismos valorespropios.

Este resultado sugiere una estrategia para encontrar los valores propios de A: buscarmatrices 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 :=[v1|v2| . . . |vn] (su i–esima columna es el vector vi) es invertible. Entonces

AP = PD ⇐⇒ P−1AP = D,

donde D es una matriz diagonal con los valores propios sobre la diagonal. Si una matrizes 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 diseno de meto-dos mas robustos frente a errores de redondeo.

2Recogida por D. Kincaid y W. Cheney en su excelente libro “Analisis Numerico: Las Matematicasdel Calculo Cientıfico.” Addison-Wesley, 1994.

3¿Como asumir que las raıces de un polinomio tan sencillo fueran imposibles de aproximar por unordenador? Wilkinson dirıa despues “Speaking for myself I regard it as the most traumatic experience inmy career as a numerical analyst”

173

Page 180: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.3 Metodo de potencias LECCION IV

Teorema 9.1 Si A es simetrica, existe Q ortogonal tal que Q>AQ = D con D diagonal conlos valores propios de A. En particular, los valores propios de una matriz simetrica son todosreales.

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 unamatriz simetrica a una forma diagonal como forma de calcular los valores propios. Estosmetodos se pueden adaptar, con mas o menos exito, a matrices arbitrarias llevando eneste 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 mismoque proporcionan un valor propio de la matriz. Estos metodos combinados con tecnicasde deflacion, que consisten en construir una nueva matriz con los mismos valores propiosque 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 {vi}ni=1 vectores propios linealmente independientes (la matriz A es por tantodiagonalizable). Entonces, cualquier vector x0 puede escribirse en la forma

x0 =n∑

i=1

αivi

con αi adecuados. Multiplicando reiteradamente por A obtenemos

Amx0 =n∑

i=1

αiλmi vi = λm

1

(α1v1 + α2

(λ2

λ1

)m

v2 + . . . + αn

(λn

λ1

)m

vn

). (9.1)

Entonces, si α1 6= 0 y m es grande

xm := Amx0 ≈ λm1 α1v1,

es decir, xm tiende a apuntar en la direccion del vector propio asociado al valor propiode mayor modulo (en el lenguaje habitual se habla del valor propio dominante). El valorpropio λ1 se puede calcular, entre otras posibilidades, mediante el conocido cociente deRayleigh:

λ(m)1 :=

x>mAxm

‖xm‖2=

x>mxm+1

‖xm‖2≈ λ1.

174

Page 181: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION IV Capıtulo 9. Calculo numerico de valores y vectores propios.

Proposicion 9.2 Bajo las hipotesis anteriores

λ(m)1 = λ1 +O

((λ1

λ2

)m ).

Si ademas A es simetrica

λ(m)1 = λ1 +O

((λ1

λ2

)2m ).

Basado en estas ideas surge el metodo de potencias, que simplemente consiste enmultiplicar un vector inicial por las potencias sucesivas de la matriz A. Para evitar quelos vectores xm tengan componentes muy grandes o muy pequenas se genera una sucesionde vectores normalizados, es decir, una vez multiplicado por A se procede a dividir porsu norma.

El algoritmo es el siguiente:

Metodo de potencias

01 x0 6= 0 vector inicial

02 y0 =x0

‖x0‖203 for m=1:mmax

04 xm = Aym−1

05 λ(m) = y>m−1xm

06 ym =xm

‖xm‖207 if ‖ym − ym−1‖2 < eps

08 return

09 end

10 end

La lınea 06 es simplemente el cociente de Rayleigh que, como la norma escogida paranormalizar es la euclıdea, adopta esta expresion mas sencilla.

Hemos elegido como criterio de parada la diferencia entre dos vectores consecutivos.Otra posible eleccion es

|λ(m) − λ(m−1)| < 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

Page 182: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.3 Metodo de potencias LECCION 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 especifique alguno delos parametros, ignorando los anteriores sin mas que utilizar el vacıo []. Por ejemplo, lasiguiente llamada es valida:

176

Page 183: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 numero de iteraciones requeridopara distintas tolerancias y vectores iniciales al tomar las matrices

A =

−1 −3 04 9 4−2 −1 5

, B =

−1 −3 0−3 9 4

0 4 5

, C =

−1 4 −24 9 −1−2 −1 5

.

Nota. Cuando no se conoce una aproximacion del vector propio asociado al valor propiodominante, se suele iniciar el algoritmo partiendo de un vector generado aleatoriamente.Podrıa ocurrir que para el vector inicial α1 = 0, pero la probabilidad de que se de esteproblema es (practicamente) nula. En este caso, si |λ2| > |λ3|, salvo por errores de re-dondeo4, el metodo proporcionara el valor propio subdominante λ2 y su vector propioasociado normalizado.

No es necesario que la matriz sea diagonalizable para que el metodo de potenciasconverja. Tampoco que el subespacio asociado al valor propio dominante este generadopor un unico vector. En este caso, que solo puede darse si λ1 es un valor propio repetido, elmetodo puede converger a distintos vectores propios normalizados dependiendo del vectorinicial considerado.

Si |λ1| = |λ2|, es decir, λ1 = ±λ2 o λ1 y λ2 son numeros complejos conjugados, entoncesel metodo de potencias falla. �

Ejercicio 9.4 Consideremos la matriz

A =

0 0 0 −241 0 0 500 1 0 −350 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 delvector (−20, 33,−15, 2)>.

2. Sabiendo que v1 = (−24, 26,−9, 1)> y v2 = (−12, 19,−8, 1)> son vectores propiosasociados a los valores propios 1 y 2 respectivamente, ¿que crees que ocurrira si se tomacomo vector inicial v1 − 3v2 = (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)>.

4El efecto de los errores de redondeo se traduce en una componente no nula en la direccion de v1,incluso aunque el vector inicial no la tuviese. Se podrıa decir que este es uno de los pocos casos en losque los errores de redondeo nos pueden ayudar.

177

Page 184: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.3 Metodo de potencias LECCION IV

Ejercicio 9.5 En este ejercicio vamos a comprobar que el calculo de los valores propiosutilizando el polinomio caracterıstico no es el camino correcto. Teclea las instrucciones en unfichero 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 propios5 {0.02, 0.04, 006, . . . , 1}. Se trata deque apliques potencias para calcular el valor propio dominante y compares el resultado con elque obtienes al calcular las raıces del polinomio caracterıstico.

Compara los resultados. Cambia el valor de n y observa el efecto que tiene en matricescada 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 distintode cero), entonces,

Av = λv ⇐⇒ A−1v = λ−1v.

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 menorvalor propio en valor absoluto de A.

En lugar de calcular el producto xm = A−1ym−1 (lınea 04 en el metodo de potencias)resolveremos en cada iteracion el sistema6

Axm = ym−1.

Disponemos para ello de una galerıa amplia de metodos vistos en las Lecciones I y II.Notemos ademas que en cada iteracion se tiene que resolver un sistema cuya matrizes siempre la misma, ası que si optamos por un metodo directo podemos calcular lafactorizacion LU una unica vez, fuera del bucle for (lıneas 03--10), y resolver de formareiterada los dos sistemas triangulares. Si por contra se opta por un metodo iterativo,podemos arrancar el esquema utilizando xm−1, la aproximacion del vector propio calculadaen 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 A−αI y (λ−α)−1

lo es de (A− αI)−1. Por tanto, si aplicamos el metodo de potencias a la matriz

A− αI

5El comando qr descompone A = QR con Q ortogonal y R triangular. Por tanto los valores propiosde Q>AQ coinciden con los de A. La Seccion 9.5.1 esta dedicada al calculo de esta descomposicion.

6Recuerda que invertir una matriz para multiplicarla posteriormente por un vector es mucho mascostoso que resolver el sistema correspondiente.

178

Page 185: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION IV Capıtulo 9. Calculo numerico de valores y vectores propios.

donde α es una constante conocida, podemos obtener el valor propio de A mas alejadode α. Mas interesante desde el punto de vista practico es aplicar el metodo de potenciasa (A− αI)−1, que nos proporcionara el valor propio de A mas proximo a α.

Ejercicio 9.7 Modifica 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 finales

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 vectorpropio si se conoce λ, el valor propio asociado. Basta para ello aplicar el metodo conα = λ + ε con ε << 1. Puede plantearse si esto tiene efectos perniciosos habida cuentade que A− αI esta muy cerca de ser singular. Wilkinson probo sin embargo que el efectode esta inestabilidad se da precisamente en la direccion del vector propio, que a fin decuentas 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 salvoen contados casos no es recomendable.

Si se conoce un valor propio λ de una matriz A de tamano n, puede construirse unanueva matriz de tamano n − 1 que tiene exactamente los mismos valores propios que Asalvo λ. Podrıa aplicarse ahora el metodo de potencias (o cualquiera de sus variantes) a lanueva matriz para determinar un nuevo valor propio de A. Este tipo de tecnica, en la queno entraremos en estos apuntes, se conoce como deflacion. Debemos senalar que medianteesta tecnica los errores de redondeo se van acumulando, de modo que solo es factible paracalcular unos cuantos valores propios. El numero final depende obviamente de la propiamatriz 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 basadoen transformaciones de semejanza.

9.4.1. Descripcion del metodo

El metodo de Jacobi transforma en cada paso una matriz simetrica A en otra semejantecon estructura mas diagonal mediante el producto a izquierda y derecha por matricesapropiadas. Una matriz de Givens, tambien llamada de rotacion, es una matriz de la

179

Page 186: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.4 Metodo de Jacobi LECCION IV

forma

Rpq(α) =

1. . .

cos α sin α1

. . .

1− sin α cos α

. . .

1

← fila p

← fila q

↑ ↑col. p col. q

(9.2)

Es facil ver que son ortogonales, es decir, Rpq(α)−1 = Rpq(α)>.Mediante

A1 := R>pqARpq

(p, q y α adecuados) vamos a anular el mayor elemento extradiagonal de A. Esta operacion

solo afecta a las filas y columnas p, q de A. Concretamente, si denotamos por a(1)ij las

entradas de A1,

a(1)pq = (aqq − app) cos α sen α + apq(cos2 α− sen2α) =

=1

2(aqq − app) sen(2α) + apq cos(2α).

Por tanto, el angulo α debe tomarse de modo quecos(2α) = 0, si aqq = app,

tan(2α) =2apq

aqq − app

, en caso contrario.

Para calcular cos α y sen α evitando el uso de un arcotangente se recurre a algunasmanipulaciones trigonometricas que prueban que si7

θ :=aqq − app

2apq

, t :=sign(θ)

|θ|+√

θ2 + 1,

entonces

cos α =1√

t2 + 1, sen α =

t√t2 + 1

.

Cuando aqq = app tomamos

cos α =1√2, sen αm =

−sign(aqq)√2

.

7sign (z) es el signo de z, −1 si z es negativo, 1 en caso contrario.

180

Page 187: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 argumentocon A1 para obtener una segunda matriz A2 resultado de cancelar el mayor elementoextradiagonal de A1. De esta forma, reiterando este proceso llegamos a una sucesion dematrices Am que cumplen

Am −→ D :=

λ1

λ2

. . .

λn

, cuando m→∞.

Ademas, definiendo Qm := Rp1q1(α1)Rp2q2(α2) . . . Rpmqm(αm), donde Rpk,qkes la matriz

utilizada en el paso k−esimo

Q−1m AQm = Am −→ D.

Por tanto, las columnas de Qm son las aproximaciones (ortonormales) de los vectorespropios correspondientes.

El siguiente teorema prueba la convergencia de este metodo. Para ello necesitamos lallamada norma de Frobenius8

‖A‖F :=[ n∑

i,j=1

|ai,j|2]1/2

Teorema 9.3 Sea Am la matriz en la iteracion m, Dm su diagonal y Bm := Am − Dm.Entonces

‖Am‖F = ‖Am+1‖F , ‖Bm+1‖2F = ‖Bm‖2 − 2|a(m)pmqm|2

El resultado dice en primer lugar que la norma de Frobenius de una matriz no cambiacuando se multiplica a izquierda y derecha por las matrices Rpq(α), una de ellas traspuesta.De hecho se preserva cuando se multiplica, a izquierda y derecha, por matrices ortogonalesarbitrarias. El segundo resultado dice algo mas: el peso de los elementos extradiagonalesdisminuye en cada paso segun el elemento cancelado. Esto asegura la convergencia delproceso hasta obtener una matriz diagonal.

En la practica, el proceso se interrumpe cuando los elementos que estan fuera de ladiagonal son suficientemente pequenos. En concreto, se suele tomar el siguiente criteriode parada

|a(m)pmqm| < eps

(n∑

i=1

|a(m)ii |2

)1/2

.

Fıjate que las matrices Am y Am+1 solo difieren en las filas y columnas pm y qm. Aefectos practicos no sera necesario formar las matrices de rotacion ya que basta conocerlos valores de cos αm y de sen αm para construir Am+1 a partir de Am.

Ejercicio 9.8 Implementa el metodo de Jacobi.

8En Matlab serıa norm(a(:)) o norm(a,’fro’).

181

Page 188: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.4 Metodo de Jacobi LECCION IV

Solucion. La parte central del programa se puede implementar con las siguientes lıneas

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 Q’A 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

Page 189: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 lıneas 32-33 que sirven para encontrar la posicion del maximo elementoextradiagonal.

9.4.2. Variantes del metodo de Jacobi

Aunque el metodo de Jacobi ofrece la posibilidad de calcular de forma rapida todoslos valores propios, tiene una convergencia lenta incluso para matrices de tamano mod-erado. Vamos a introducir algunas mejoras desde el punto de vista computacional, queno matematico. Concretamente vamos a realizar una pequena modificacion que aunqueeleva el numero de iteraciones necesarias para converger (peor desde el punto de vistamatematico) cada iteracion se ejecuta en menos tiempo, de forma que al final se consiguereducir el tiempo de calculo (mejora computacional).

Para ello vamos a identificar primero donde se nos va el tiempo de calculo. Con estefin utilizaremos una de las herramientas mas utiles en Matlab: profile.

Comenzamos creando una matriz simetrica de tamano moderado:

>> a=rand(120); a=a+a’;

y activamos el profile de Matlab con

>> profile on

Ahora Matlab va a llevar un control sobre el tiempo que consume cada lınea de codigo9.A continuacion ejecuta el programa jacobi para a con un numero maximo de iteracionessuficientemente 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 lıneas mas costosas son aquellas empleadas en labusqueda del maximo elemento extradiagonal (observa la Figura 9.1). Es precisamente

183

Page 190: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.4 Metodo de Jacobi LECCION IV

MATLAB Profile Report: Function Details

jacobi C:/Documents and Settings/Víctor/Escritorio/LibroMatlab/jacobi.mTime: 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: for m=1:mmax0.07643962 1% 34: d=diag(a);

35: %Calculo del mayor elemento extradiagonal13.37100000 91% 36: [max1,p]=max(abs(a-diag(d)));0.26000000 2% 37: [max2,q]=max(max1);

38: p=p(q);0.07000000 0% 39: if max2<eps*norm(d)

40: return % convergencia

42: %calculo sen y cos0.09000000 1% 43: if abs(a(q,q)-a(p,p))<eps

44: c=1/sqrt(2);

51: end0.10819591 1% 52: r0=[c s ;-s c];

53: %La rotacion solo afecta a las filas y col. p y q0.31000000 2% 54: a([p q],:)=r0'*a([p q],:);0.12000000 1% 55: a(:,[p q])=a(:,[p q])*r0;0.17000000 1% 56: r(:,[p q])=r(:,[p q])*r0; % guardamos r0.05000000 0% 57: end

Figura 9.1: Profile aplicado al metodo de Jacobi.

184

Page 191: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION IV Capıtulo 9. Calculo numerico de valores y vectores propios.

en estas lıneas donde debemos proponer nuestra mejora, reemplazando la busqueda poralgun 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 suficiente).Si el tamano de un elemento es pequeno, no hacemos nada y pasamos al siguiente. Si esgrande, se procede anularlo. Para dilucidar si es grande o pequeno compararıamos conel tamano de la diagonal de forma semejante a como se hace en el programa original(lınea 09). Una vez recorridos todos los elementos, esto es, una vez realizado un barridoen la terminologıa habitual, volvemos a empezar. Cada cierto numero de iteraciones, porejemplo tras cada barrido, podemos medir el tamano de los elementos extradiagonales quequedan para ver si se da por finalizada la ejecucion del programa. Si comprobamos quehay todavıa elementos diagonales muy grandes, empezamos de nuevo.

Ejercicio 9.9 Implementa la modificacion sugerida en el parrafo de arriba. Ejecuta el profilede Matlab y compara tiempos de ejecucion con el programa original. ¿Que observas?. Fıjatetambien en el numero de iteraciones que necesita para converger. ¿Que te parece?.

Nota. La instruccion profile es muy util a la hora de depurar codigo dado que permitecontrolar que partes del programa vale la pena optimizar y cuales no. La instruccion tienevarios argumentos opcionales y comandos relacionados que puedes consultar en la ayuda.

Los comandos tic y toc son mas simples pero proporcionan menos informacion. Elprimero activa el reloj y el segundo nos informa sobre el tiempo trascurrido desde que seejecuto tic. �

9.5. Metodo QR de Francis

El metodo QR y sus variantes son sin lugar a dudas la eleccion mas apropiada para elcalculo de todos los valores propios de una matriz llena.

El metodo es muy facil de entender y sencillo de implementar. Sin embargo, es difıcilde comprender por que funciona (el analisis no es nada trivial).

Ya hemos visto descomposiciones matriciales del tipo A = LU con L (permutacionde) triangular inferior con 1s en la diagonal y U triangular superior. Una descomposicionalternativa es

A = QR

con Q ortogonal (Q> = Q−1) y R triangular superior. Esta descomposicion siempre existey puede ser calculada de varias formas distintas.

El metodo QR de Francis consiste en grosso modo construir una sucesion de matricesAm (A0 = A) procediendo como sigue

Am = QmRm (factorizar) Am+1 := Rm+1Qm+1 (construir)

Para una matriz simetrica el algoritmo converge practicamente en todos los casos a unamatriz diagonal con los valores propios. Mas adelante detallaremos el algoritmo y como se

9Tener activada esta opcion resta algo de velocidad a los programas puesto que parte de Matlabesta ocupada en autorevisarse. Con profile off desconectas este control.

185

Page 192: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.5 Metodo QR de Francis LECCION IV

puede mejorar su implementacion. En cualquier caso queda claro que antes de entrar enmateria debemos hablar con algo de profundidad de la descomposicion QR de una matriz.

Ejercicio 9.10 Probar que todas las matrices Am son semejantes y por tanto comparten losmismos 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 utilizapara 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 vectoresortonormales que generan el mismo subespacio que los vectores columna de A y R es unamatriz triangular superior que indica como se transforma la base original en la nueva baseortonormal. La descomposicion tiene sentido para matrices rectangulares y en este casolas dimensiones de A y Q coinciden (si A, es m× n, tambien lo es Q y R es n× n).

Este algoritmo es, sin embargo, muy inestable numericamente y rara vez se utiliza enla practica10.

Existen caminos distintos que nos conducen a la descomposicion QR. Los dos metodosmas 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 aparecenen el algoritmo de Jacobi (matrices de Givens), o matrices (reflexiones) de Householder.

Factorizacion QR con Matrices de Householder

Una matriz de Householder viene dada por

Q = I − 2uu>, con ‖u‖2=1,

donde u es un vector columna n× 1 e I es la matriz identidad de tamano n. Observa queefectivamente 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 tantoQ−1 = Q.

La factorizacion QR mediante transformaciones de Householder se basa en la siguientepropiedad

Proposicion 9.4 Dado un vector columna x, si tomamos α = ±‖x‖2 y definimos

u :=x− α e1

‖x− α e1‖2, donde e1 = (1, 0, . . . , 0)>,

Q := I − 2uu>,

entoncesQx = (α, 0, . . . , 0)>.

10Existe el algoritmo de Gram-Schmit modificado que dota de algo mas de estabilidad al metodooriginal.

186

Page 193: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 xpara que ‖u‖2 no sea demasiado pequena.

Para obtener una descomposicion A = QR podemos proceder del siguiente modo:

1. Construimos la matriz de Householder Q1 como en la proposicion anterior tomandocomo vector x la primera columna de A. Entonces

Q1A =

α1 ∗ . . . ∗

0... A2

0

(9.3)

2. Repetimos el proceso con la matriz A2 que es (n − 1) × (n − 1) para construir lamatriz de Householder Q∗

2 tal que

Q∗2A2 =

α2 ∗ . . . ∗

0... A3

0

. (9.4)

Ahora basta considerar

Q2 =

1 0 . . . 0

0... Q∗

2

0

(9.5)

que cumple

Q2 Q1 A =

α1 ∗ ∗ . . . ∗0 α2 ∗ . . . ∗

0 0...

... A3

0 0

3. En el k–esimo paso se construyen las matrices Q∗

k y Qk:

Q∗kAk =

αk ∗ . . . ∗

0... Ak+1

0

, Qk :=

[Ik−1

Q∗k

],

donde Ik−1 es la matriz identidad de tamano k − 1.

Despues de n− 1 pasos obtenemos la descomposicion

Qn−1 · · ·Q1 A = R, con R triangular superior.

Definiendo Q := Q1 · · ·Qn−1, tenemos que Q−1 = Q−1n−1 · · ·Q−1

1 = Qn−1 · · ·Q1. Por tanto,

A = QR con Q ortogonal y R triangular superior.

Ejercicio 9.11 Implementa la descomposicion QR con matrices de Householder

187

Page 194: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.5 Metodo QR de Francis LECCION 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 filas y n columnas.(Ayuda: el for de la lınea 11 es ahora for k=1:min([m,n]). El resto de cambios son inmediatossin mas que tener en cuenta los tamanos de las matrices implicadas.)

Si Q = I−2uu> es n×n y B n×m, entonces el producto QB puede calcularse como

QB = (I − 2uu>)B = B − 2u(u>B). (9.6)

Es decir, en ningun momento se requiere construir la matriz Q y unicamente necesitamosrealizar dos productos matriz-vector. El numero de operaciones del producto QB es ahoranm mientras que en la implementacion inicial el costo era n2m. De forma analoga se puedecalcular el producto BQ con B m× n tambien en mn operaciones.

Ejercicio 9.13 Implementa la factorizacion QR utilizando las indicaciones previas. Comparacon algun 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 derotacion, es decir, matrices de la forma (9.2). Esta alternativa es especialmente interesantesi la matriz tiene sus elementos no nulos concentrados entorno a la diagonal. Para matrices

188

Page 195: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 utilizarmatrices de Householder.

Es muy facil comprobar que para crear un cero en la posicion (p, q) al multiplicarla aizquierda por una matriz de Givens Rp,q(α) basta elegir α de modo que

cos α =aqq√

a2qq + a2

pq

, sin α =−apq√a2

qq + a2pq

.

Notemos que las matrices Rpq(α)A y A solo difieren en las filas p y q.El metodo consistira entonces en ir transformado la matriz original (de tamano n) en

una matriz triangular superior del siguiente modo: en primer lugar se hacen ceros en lasposiciones de la primera columna por debajo del elemento de la diagonal multiplicandopor n− 1 matrices como (9.2), de modo que

A1 := R1n(α1n) . . . R13(α13)R12(α12)︸ ︷︷ ︸Q1

A =

∗ ∗ . . . ∗0 ∗ . . . ∗...

......

0 ∗ . . . ∗

.

Obviamente Q1 es una matriz ortogonal por ser producto de matrices ortogonales. En elsiguiente paso haremos ceros en la segunda columna por debajo de la diagonal y ası suce-sivamente. Fıjate que los elementos nulos de las columnas anteriores se preservan en lossucesivos pasos.

Ejercicio 9.14 Implementa la factorizacion QR utilizando matrices de Givens.

Solucion. Podemos definir 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

Page 196: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.5 Metodo QR de Francis LECCION 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 Householdery 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

Page 197: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 m×n, y Q,R es la descomposicion dada por Householder o Givens11, tomando(con notacion de Matlab)

Q1 = Q(:, 1 : m), R1 = R(1 : m, :),

entonces R1 es cuadrada, Q1 tiene las columnas ortonormales y A = Q1R1.La factorizacion QR se puede utilizar para resolver sistemas lineales compatibles inde-

terminados mediante la aproximacion por mınimos cuadrados. Especıficamente, se tratade 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 ∈ Rn.

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 Q1︸ ︷︷ ︸I

R1x = R>1 Q>

1 b, ⇔ R>1 R1x = R>

1 Q>1 b, ⇔ R1x = Q>

1 b.

Recuerda que R1 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 elmetodo de Gauss, ya que realiza el doble numero de operaciones, pero tiene una ventajamuy importante: es estable numericamente y no hace falta realizar ninguna estrategia depivotaje12.

11Ya hemos indicado en los Ejercicios 9.12 y 9.15 que estos metodos pueden aplicarse a matricesrectangulares generales.

12La razon de esta estabilidad se puede vislumbrar intuitivamente: como Q es ortogonal, todas lasentradas estan entre 0 y 1.

191

Page 198: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.5 Metodo QR de Francis LECCION IV

Otra aplicacion de la factorizacion QR es el calculo del rango de una matriz. Concre-tamente, el rango de A coincide con el numero de filas de R distintas de cero. Asumiendoque estamos trabajando con un rango numerico, examinaremos cuantas filas son clara-mente distintas de cero. Esto merece un comentario: casi cualquier perturbacion de unamatriz 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 estarmuy cerca de una matriz que no tenga rango maximo tiene consecuencia perniciosas enmuchas aplicaciones numericas.

Ejercicio 9.17 Implementa la resolucion de sistemas lineales por mınimos cuadrados.

Ejercicio 9.18 Introduce la siguiente matriz en Matlab

A =

[11 1322π 26π

]Calcula el determinante en Matlab y deduce cual es su rango. Calcula la descomposicion QR.¿Que rango le asignarıas 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 = A1 matriz inicial

for k=1:mmax

Descomponer Ak = QkRk

Calcular Ak+1 := RkQk

Dk+1=diag(Ak+1)

if (

n−1∑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 finaliza cuando el tamano de los elementos por debajo de la diagonalprincipal es pequeno respecto de los elementos diagonales, es decir, cuando consideramosque la matriz es practicamente triangular.

Para matrices simetricas, que es el caso que de momento nos ocupa, el metodo convergesalvo en situaciones algo extranas a una matriz diagonal con los valores propios. Un hechosorprendente es que ademas los valores propios aparecen ordenados en la diagonal demayor a menor modulo.

192

Page 199: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION IV Capıtulo 9. Calculo numerico de valores y vectores propios.

Ejercicio 9.19 ¿Que modificacion harıas del algoritmo anterior para que tambien devolvieralos 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 =

D1 . . . . . . . . . . . .

D2 . . . . . . . .. . . . . .

Dm

, donde Dj 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 Dj deorden 2. En particular, si la matriz tiene unicamente valores propios reales, la matriz Tes triangular. Si trabajamos con aritmetica compleja entonces la matriz T es triangularsuperior. Este es el conocido Teorema de Schur.

Ejercicio 9.21 Adapta el metodo QR a matrices no simetricas. Observa que deberas cambiarel criterio de parada.

Ejercicio 9.22 Aplica el metodo QR a distintas matrices (simetricas, no simetricas, contodos los valores propios reales o con alguno complejo) para observar como es la matriz lımiteresultante en cada caso.

Nota. La descomposicion de Schur, tanto real como compleja, se puede calcular enMatlab 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 deHessenberg correspondiente es de hecho tridiagonal simetrica.

193

Page 200: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.5 Metodo QR de Francis LECCION 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 unicamentedebemos preocuparnos de cancelar los elementos situados en la subdiagonal inferior. Esmas, si H es Hessemberg (respectivamente tridiagonal simetrica), y H = QR, entonces lamatriz RQ es de nuevo de Hessemberg (respectivamente tridiagonal simetrica). En el casode matrices tridiagonales hay claramente una reduccion en las necesidades de memoriadel metodo pues solo requerimos guardar tres diagonales de la matriz durante todo elproceso.

El metodo QR no se programa en la practica tal como lo hemos presentado. Se recurrea dos tipos de estrategias que aceleran enormemente la velocidad de convergencia. Laprimera es la traslacion. Utilizando la notacion de la Seccion 9.5.2, se tratarıa de enlugar de factorizar la matriz Am, descomponer

Am − αmI = QmRm,

para posteriormente definir

Am+1 := αmI + RmQm.

Es trivial comprobar que Am y Am+1 son semejantes, por lo que tendran los mismosvalores propios. Una eleccion adecuada de αm consigue acelerar la convergencia en zonasdeterminadas de la matriz. Por ejemplo, si A simetrica se puede conseguir que en pocasiteraciones

Am →

Bn−1 0

0 λn

.

En este caso, λn es un valor propio, se guarda en memoria y se empieza a trabajar con Bn−1

que es de orden n− 1. Este tipo de tecnica se denomina deflaccion. Existen algoritmosque permiten seguir la pista a los vectores propios, relacionando los vectores propios deAm con los de Bn−1.

Apendice: reduccion a la forma de Hessenberg

Disponemos ya de las herramientas necesarias para implementar la reduccion a formade Hessenberg de una matriz. Para ello, consideremos la siguiente particion de A

A =

α b>

c A1

,

donde b y c son vectores columna de n − 1 componentes y A1 es (n − 1) × (n − 1).Tomemos H1 una matriz de Householder n− 1×n− 1, que especificaremos mas adelante,y construyamos

H :=

1 0

0 H1

.

194

Page 201: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION IV Capıtulo 9. Calculo numerico de valores y vectores propios.

Entonces

HAH =

β b>H1

H1c H1A1H1

.

Si H1 se toma ahora de forma que H1c = αe1, se consigue cancelar todos los elementosde la primera columna situados por debajo de la subdiagonal inferior. Es mas, si A essimetrica, b = c y por tanto en la primera fila de HAH solo los dos primeros elementosson no nulos.

A continuacion se procede a trabajar con la matriz H1A1H1 de forma similar a comose hizo en la Seccion 9.5.1.

Nota. En Matlab la funcion hess reduce una matriz a forma de Hessenberg. Puedeutilizarse 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 utilizarel comando eig. Esta funcion es de hecho una compilacion de funciones que se aplicandependiendo 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 encontrarescalares λ y vectores v 6= 0 tales que

Av = λBv.

En ocasiones requerimos unos pocos valores propios. El comando eigs, proporcionalos valores propios mas relevantes, siendo el propio usuario el que especifique si estos sonlos mayores o menores en valor absoluto, los de mayor o menor parte real,etc. La ayudade Matlab es bastante extensa y desde aquı animamos a su consulta. Como detalle curiosoeste comando se puede llamar de forma que uno de los argumentos sea una funcion quedevuelva el producto por la matriz. Es decir, solo necesita saber multiplicar por la matrizy por tanto no es necesario disponer de ella13. El uso de este comando es indispensableen matrices sparse no simetricas dado que, aun reduciendola a forma de Hessenberg, lasnecesidades de memoria son gigantescas14. Para este tipo de problemas se utilizan otrostipos 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,

13Puede resultar extrano, pero en muchas aplicaciones practicas es mas facil hallar el producto de unvector por la matriz que construirla explıcitamente.

14La descomposicion QR destroza la estructura sparse de una matriz.

195

Page 202: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.7 Notas historicas LECCION IV

donde D es una matriz diagonal con elementos no negativos. Las entradas de D son losvalores singulares, mientras que las columnas de P y Q contienen los vectores singularesasociados. Esta descomposicion existe aun cuando A es rectangular. El comando que cal-cula esta descomposicion en Matlab es svd. El algoritmo mas utilizado para este problemaes una variante del metodo QR conocido como Algoritmo de Golub-Kaham.

9.7. Notas historicas15

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 surgidode forma simultanea en diversos ambientes. El metodo de la potencia desplazada fueintroducido por Helmut Wielandt en 1944, quien sugirio tambien algunas tecnicas dedeflaccion para, combinadas con el metodo de potencias, obtener varios valores propiosde la matriz.

En 1958, Heinz Rutishause propuso un precursor del metodo QR, el metodo LU. Elmetodo descomponıa la matriz en la forma LU , para posteriormente construir UL. Setrataba de aplicar de forma simultanea el metodo de potencias y para evitar que to-das las direcciones degeneran hacia la direccion dominante, se hacıa una descomposicionLU que aseguraba la independencia de los vectores. Desgraciadamente, el metodo erainestable numericamente salvo para algunos casos particulares. J. G. F. Francis y V. N.Kublanovskaya propusieron independientemente en 1961 reemplazar la descomposicionLU por la QR dando origen al metodo que hemos visto. El trabajo de Francis era mascompleto y sugerıa ya de hecho la reduccion a forma de Hessenberg, la deflacion y estrate-gias de desplazamiento.

El calculo estable de la descomposicion QR tuvo que esperar a los anos 1950, cuandoWallace Givens y Alstom S. Householder propusieron sus metodos en 1954 y 1958 re-spectivamente. Householder tambien en 1958 y Wilkinson en 1960 estudiaron los aspectosnumericos de la reduccion de una matriz a su forma de Hessenberg.

9.8. Google16

Google17 ha pasado a ser en su corta vida uno de los referentes mundiales de Internet.Su sistema de busqueda de paginas en la red ofrece en general unos resultados bastanteprecisos. Una de las claves de su sistema es su metodo de evaluacion de las paginas,denominado Pageranktm. Este sistema evalua las paginas web segun el numero de enlacesque permiten llegar a ella.

15Las fuentes de esta seccion se han obtenido principalmente del artıculo Eigenvalue computation inthe 20th Century (Gene H. Golub y Henk A. van der Vorst, publicado en Journal of Computational andApplied Mathematics 123 y Matrix Algorithms Volume II: Eigensystems, de G.W. Stewart.

16 Este capıtulo se ha extraıdo esencialmente del libro Numerical Computing de Cleve Moler, disponibleen http://www.mathworks.com/moler/

17Por si algun despistado todavıa no conoce su direccion electronica, visıtese http://www.google.es,http://www.google.com y muchos mas...

196

Page 203: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 quesigue:

Si una persona navega de forma continuada durante un largo periodo de tiempo,¿cual 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 formasde 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 figura 9.2 vemos un (muy) simple ejemplo de una web representada como un

grafo dirigido. Una flecha de i a j indica que la pagina i tiene un enlace (un link) a lapagina j.

En este ejemplo n = 6 es el numero de paginas que cuenta con 9 enlaces. Este grafose puede representar matematicamente mediante la matriz 6× 6

G = (gij) =

0 0 1 0 0 01 0 0 1 1 00 1 0 0 0 00 0 1 0 0 00 0 0 1 0 10 0 0 1 0 0

donde

gij = 1, si llegamos a i desde j.

De forma natural G es sparse, puesto que con n paginas uno puede esperar que el numerode enlaces sea del orden de O(n) (esto es, proporcional al numero de paginas) y no delorden O(n2) que se corresponderıa con una matriz llena.

Sea

cj =n∑

i=1

gij (numero de enlaces que salen de j).

197

Page 204: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.8 Google LECCION IV

Entonces la probabilidad de llegar a i si estamos en j es

pgij

cj︸︷︷︸Siguiendo un enlace desde j

+1− p

n︸ ︷︷ ︸Tecleando la direccion

Esta informacion se puede recoger en la matriz A de tamano n × n cuyas componentesvienen dadas por

aij = pgij

cj

+1− p

n.

Esta matriz no es sparse, pero se puede escribir

p G +1− p

nene

>n

donde gij = gij/cj y en es la matriz columna 1× n

en =[

1 1 · · · 1]>

.

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

Ax = p Gx +1− p

nene

>n x = p G x./c︸︷︷︸

Div. elem. a elem.

+1− p

n(en · x)︸ ︷︷ ︸

Prod. escalar

en.

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

aijx(0)j =: x

(1)i

y por tanto x

(1)1

x(1)2

· · ·x

(1)n

=

a11 a12 · · · a1n

a21 a22 · · · a2n

. . . . . . . . . . . . . . . . . .an1 an2 · · · ann

x(0)1

x(0)2

· · ·x

(0)n

= Ax0.

De esta forma, denotando por

xm = (x(m)1 , x

(m)2 , . . . , x(m)

n )>

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

xm+1 = Axm.

La idea es hacer evolucionar el sistema hasta que se estabilice.

198

Page 205: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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>en =n∑

i=1

xi = 1.

Ademas, comenzando con x0 cuyas componentes sean positivas y sumen uno,

x = lımm

xm.

El resultado dice, en palabras llanas, que la probabilidad de que estemos en una paginaweb (esto es, x), despues de navegar una cantidad suficiente de tiempo18 es independientede como hemos empezado (es decir, de x0). Matematicamente hablando, dice que existeun unico vector propio asociado al valor propio 1 de componentes positivas con ‖x‖1 = 1y que ademas la sucesion xm converge a x independientemente del vector inicial escogido.Observa que la sucesion de vectores xm son el resultado de aplicar el metodo de potenciasa la matriz A (sin normalizar respecto de ‖ · ‖2) y que por su forma particular19 siempreque se parta de un vector inicial cumpliendo los requisitos de la proposicion tendremosque xm ≥ 0 y ‖xm‖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

18Ciertamente, podrıamos tener que dedicar muchas horas...19La matriz A cumple que todas sus entradas son positivas y que la suma de los elementos de cada fila

es 1. Una matriz de esta forma se denomina matriz de Markov. Teoricamente se sabe que el valor propiodominante de estas matrices es siempre 1.

199

Page 206: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.8 Google LECCION 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 influyeen su buena puntuacion.

En problemas reales, las matrices son enormes, en Febrero de 2006 google habıa cat-alogado 9.680.000.000 paginas20. Despues de la evaluacion hay que hacer un filtrado deacuerdo a las palabras clave con las que se hace la busqueda.

Es posible hacer subir la evaluacion de una pagina mediante la creacion de paginas webque se enlacen entre ellas y especialmente sobre una. Este tipo de tecnicas, denominadagoogle bombing ha sido utilizado reiteradas veces por objetivos de diversa naturaleza,economicos, polıticos, de protesta.... Los algoritmos del buscador tratan de detectar estetipo 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 ingenieroelectrico y el segundo licenciado en matematicas y que contaban entonces con 23 y 24anos. El nombre proviene del numero 10100 que, aunque no oficialmente, se llama Googol21

El ambiente desenfadado y el origen matematico del buscador tuvo un curioso reflejoen la primera oferta publica de acciones que tuvo lugar a principios del 2004. Brin y Pagesacaron al mercado una participacion de la companıa cuyo valor era 2.718.281.828$, elnumero e con 10 cifras decimales22.

20Basta hacer la busqueda de una palabra inexistente precedida de un “-” para obtener el numero depaginas catalogadas.

21Ası lo denomino el matematico Edward Kasner. En ingles existe la palabra goggles que son unas gafasde natacion (?).

22Muy pocos se dieron cuenta de este “guino”. Se hizo de nuevo palpable la escasa cultura cientıfica

200

Page 207: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION IV Capıtulo 9. Calculo numerico de valores y vectores propios.

en general y matematica en particular del mundo periodıstico.

201

Page 208: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador9.8 Google LECCION IV

202

Page 209: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLeccion V

Salidas graficas en Matlab. Interpolacion

203

Page 210: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador

Page 211: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorIntroduccion

...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 salidasgraficas. Ciertamente exponer con cierto detalle todo lo relacionado con este campo esuna tarea ardua y extensa. Sin embargo, y este es nuestro objetivo, sı es asumible alcanzarun conocimiento base de forma que sea el usuario quien, con la ayuda de Matlab o conmanuales especıficos, profundice en los aspectos puntuales que necesite.

En la segunda parte estudiaremos el problema de la interpolacion polinomica comouna buena piedra de toque para testar las salidas graficas. Como aspectos relacionadoshablaremos someramente de la interpolacion por splines y las curvas Bezier, que nosofrecen un ejemplo muy sencillo de las Matematicas aplicadas al diseno grafico.

205

Page 212: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador

Page 213: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorCapıtulo 10

Matlab: Salidas graficas 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 nivelesfinos exige trabajar con argumentos nuevos, mas instrucciones y el manejo de una sintaxismas complicada.

Esta caracterıstica se destaca mas, si cabe, en los comandos relacionados con las salidasgraficas. Es por ello que, empezando por la instruccion plot, recorreremos los diferentesniveles de forma gradual. No trataremos el nivel superior, que conlleva un control absolutodel dibujo, dado que requerirıa una exposicion demasiada larga. Lo que aquı expondremoses suficiente en un 99% de los casos, y en ultima medida, se puede acceder a todos losaspectos de un dibujo desde la ventana grafica a golpe de raton.

Primer nivel

El primer comando que trataremos es plot. Es una instruccion muy versatil y la masindicada para dibujar graficas 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 numero suficientemente elevado de puntos trazamoscon ello una grafica suave, sin esquinas visibles.

Al ejecutar este comando se abre una ventana, figure en el vocabulario de Matlab,donde se traza la correspondiente figura.

Si y es real, plot(y) toma x=1:n donde n es la longitud de y. Si, por otro lado, y esun vector de numeros 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 lıneas de codigo?

>> clear i

>> t=linspace(0,2*pi,9);

>> plot(exp(i*t));

207

Page 214: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.1 Dibujos bidimensionales LECCION V

Figura 10.1: Ventana grafica.

¿Te parece natural? ¿Que observas con la escala? ¿Que sucede si se ejecuta axis equal?.¿Como dibujarıas una circunferencia?.

Segundo nivel

El comando ademas acepta una serie de argumentos que, entre otras cosas, permitencontrolar el color, el tipo de marcas sobre los puntos (x(i), y(i)) y el formato de laslıneas 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 con1

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)

1Traducido directamente de la ayuda de Matlab.

208

Page 215: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas en Matlab

< triangulo (izquierda)

> triangulo (derecha)

p estrella pentagonal

h estrella hexagonal

La primera columna especifica el color utilizado, la segunda la marca sobre cada punto yla tercera el patron que siguen las lıneas utilizadas para unir los puntos.

Por ejemplo el siguiente fichero 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 Figura10.2.

El comando figure abre una ventana grafica asignandole un numero. Si la ventanaya esta abierta, la coloca como la ventana de salida por defecto. En particular, figurepermite manejarse con varias ventanas de forma simultanea.

Para superponer varios dibujos sobre una misma ventana podemos

Utilizar plot de la siguiente forma2

>> 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 formatopersonalizado 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 graficas construidas condiferentes comandos. La superposicion se desconecta con hold off, de forma queun nuevo dibujo borrara los anteriores.

2Se asignan distintos colores a cada una de las graficas de forma automatica.

209

Page 216: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.1 Dibujos bidimensionales LECCION V

Figura 10.2: Ventana grafica.

Tercer nivel

Ya en un tercer nivel, se pueden acceder a detalles concretos del dibujo, como el tamanoy color de las marcas, la anchura de la lınea, etc. Las diferentes opciones llevan nombresnemotecnicos que facilitan su memorizacion3. Destacamos entre las mas importantes

color: color de la lınea.

LineWidth: anchura de la lınea.

Marker: selecciona la marca que se coloca en los puntos evaluados

MarkerEdgeColor: color del borde de las marcas

MarkerFaceColor: color de la marca

MarkerSize: tamano de la marca

Para especificar un color, se puede utilizar uno de estos caracteres {b, g, r, c, m, y, k} obien un vector con tres componentes con valores entre 0 y 1 que especifica un color segun

3nemotecnicos en ingles, of course.

210

Page 217: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas en Matlab

el estandar RGB4.

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 lasegunda en azul. El ancho de lınea debe ser de dos puntos y deben seguir dos estilos diferentes,a tu eleccion.

Puedes empaquetar las instrucciones en un fichero script. Sera mas comodo para editar ycambiar lo que desees.

La ventana grafica

Las propiedades anteriores se pueden editar directamente en la ventana grafica. Paraello, hay que seleccionar edit plot (vease la Figura 10.3) y pulsar sobre la grafica conun doble click. Se desplegara una ventana adicional con varias pestanas que informan ypermiten modificar las diferentes caracterısticas del objeto. Si se procede igual sobre elfondo de la pantalla controlaremos mas aspectos del propio entorno, como la escala, el ratioentre 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 ejemplodonde la prueba, la experimentacion y el ensayo–error permiten aprender mejor y masrapidamente 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 cadaejemplo. Esto es especialmente importante si necesitamos un numero elevado de graficaso bien necesitamos rehacerlas constantemente. En contrapartida deberemos manejar unamayor galerıa 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 grafica modifica su aspecto para que tenga el que le habıas dado en elEjercicio 10.2.

4Red, Green, Blue. Crea un color anadiendo partes de rojo, verde y azul (de 0 a 1) especificado porun vector de tres componentes.

211

Page 218: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.1 Dibujos bidimensionales LECCION V

Figura 10.3: Edicion de un dibujo.

212

Page 219: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas en Matlab

10.1.2. Comandos asociados a plot

Hay una serie de comandos que controlan el entorno donde se despliega la grafica.Entre los mas elementales (o al menos, mas faciles de utilizar), podemos destacar:

clf: borra la ventana actual (figure) de graficos.

cla: borra el axes actual. El axes es la parte de la ventana utilizada paradibujar. Una ventana puede contener varios axes (vease el comandosubplot tratado mas adelante).

hold: hold on permite que sucesivas graficas 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 ratioentre 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: especifican los lımites del dibujo. Se puedn utilizar para centrar eldibujo.

grid: grid on muestra una malla en pantalla; grid off la desconecta.

legend: despliega una leyenda, esto es, un cuadro explicativo sobre las graficaspresentes.

text: anade un texto en las coordenadas especificadas.

xlabel, ylabel: anade tıtulos (etiquetas) a los ejes OX y OY.

title: coloca un tıtulo 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 ficheroscript) despliega las graficas 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

Page 220: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.1 Dibujos bidimensionales LECCION 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

Eje

OY

Algunas graficas de funcionesexp(-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 paraespecificar la fuente y su tamano utilizada en el tıtulo. Otros atributos son

fontweight: los valores posibles son light, normal, demi, bold. Especifica el trazode los caracteres, desde fino (light) hasta negrita (bold).

fontangle: sus valores son normal, italic u oblique. Fija la inclinacion de la fuente.

rotate: especifica el angulo con el que se escribe el texto. El valor por defecto, 0, esla escritura horizontal, mientras que con 90 se escribe el texto en vertical.

214

Page 221: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas en Matlab

Estos atributos estan disponibles para cualquier comando que se ocupe de desplegartextos en la pantalla grafica. Por ejemplo, xlabel, ylabel, title,...

Quizas lo mas difıcil sea saber que fuentes tenemos instaladas y su correspondientenombre. La solucion mas sencilla a esta cuestion es ir a la venta grafica, y editar lascaracterısticas del dibujo5. Allı podremos ver que fuentes estan a nuestra disposicion y sunombre correspondiente. �

Ejercicio 10.4 En este ejercicio trataremos de visualizar el efecto del comando axis condiferentes opciones sobre el aspecto final de un dibujo.

Teclea

>> clf

>> x = 0:.025:pi/2; plot(x,tan(x),’-ro’)

La funcion tangente presenta una asıntota vertical6 en π/2. Teclea los siguientes comandos yobserva el aspecto final de la figura.

>> axis equal

>> axis image

>> axis normal % vuelta al formato original

>> axis([0 pi/2 0 5]) % especificamos el rango de salida

>> axis tight

¿Podrıas 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 grafica.Todo objeto grafico, desde una simple curva hasta la propia ventana donde se despliegael dibujo tiene asociado un puntero, un handle al que se encuentra enlazado. Los valoresde cada uno de los parametros se pueden visualizar (get) y editar (set) desde la lınea decomandos 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. Ahorase puede recabar informacion sobre este:

>> get(h,’linestyle’)

ans =

-

5Seleccionar editar dibujo, doble click sobre el fondo, seleccionar la pestana style e ir al menu desple-gable font name

6Tiende a infinito.

215

Page 222: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.1 Dibujos bidimensionales LECCION 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 lınea continua, sinninguna marca y con anchura de lınea 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 grafica pasa a tener una anchura de 2 puntos, cambia el color y el estiloahora es punto-raya.

Si se ejecuta get(h) podemos visualizar todos los atributos del objeto grafico:

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

Page 223: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas 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 variableque permite a continuacion la manipulacion de muchas de sus propiedades. Para ello seutiliza 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 tamano, la inclinaciony 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 grafica (gca), que esencialmente es el marco donde de-splegamos los dibujos. Las lıneas 07-08 edita los atributos xtick, que senala los puntosdonde se colocan las marcas en el eje OX, la fuente utilizada en el dibujo, activa la mallaunicamente en la direccion OX, especifica la anchura de la lınes y el patron que sigue. Elresultado se puede ver en la Figura 10.5.

Todas las propiedades anteriores se pueden modificar mas facilmente en la ventanagrafica. 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 figura.

Finalmente gca y gcf devuelven el puntero al axis y figure utilizado en ese momento(get current axis y get current figure). Si quieres ver todos sus atributos, ejecuta

>> get(gca), get(gcf)

217

Page 224: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.1 Dibujos bidimensionales LECCION V

0 0.25 0.5 1 2 4-1

0

1

2

3

4

5

6x log(x)

Figura 10.5: Modificacion del entorno del dibujo.

Un ejemplo de caracterısticas mas avanzadas

Es posible asignar a un objeto grafico funciones que se ejecuten al realizar algunaaccion, como cuando se crean (util especialmente si se redibuja constantemente) o cuandose 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, seejecutara 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. Observacomo se repite ’ precisamente para insertar este caracter y evitar ası la confusion con elsımbolo fin de cadena de caracteres.

En ultima medida, estas caracterısticas enlazan con las interfaces graficas de Mat-lab (gui), donde los objetos graficos pueden ser menus desplegables, campos de textos,items,... Matlab dispone de una guıa para el desarrollo de interfaces graficos 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 yallı acceder a Creating GUIs.

218

Page 225: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas en Matlab

10.1.4. El comando subplot

Este comando permite la visualizacion de diferentes subventanas graficas (axes) enuna misma ventana. A modo de ejemplo,

subplot(231)

define en la figure seis zonas para volcar las salidas graficas dispuestas en 2× 3 (dos filas,tres columnas) y accede a la primera de ellas. La numeracion es la desplegada en la figura10.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

Page 226: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.1 Dibujos bidimensionales LECCION 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 graficas

Senalaremos a continuacion otros comandos relacionados con dibujos y graficas bidi-mensionales de manejo similar a plot

plotyy: permite mostrar dos dibujos en la misma grafica con dos ejesOY a la izquierda y a la derecha.

polar: curvas en polares.

semilogx, semilogy: similar a plot pero utilizando, respectivamente, una escala log-arıtmica en el eje OX y en el eje OY.

loglog: escala logarıtmica en ambos ejes.

stem: dibuja puntos uniendolos con una linea vertical al eje OX.

stairs: traza una grafica en forma de escalera.

bar, barh, bar3: despliega graficas en forma de barras. Muy apropiada para rep-resentar datos y estadısticas (estilo excel).

area: muestra los datos en una grafica de forma acumulada. El col-or utilizado se controla mediante el comando colormap, cuyofuncionamiento veremos mas adelante.

line: une puntos mediante lıneas. Es una instruccion de bajo niv-el cuyo funcionamiento es similar a plot. De hecho, plot seconstruye a partir de line.

fill: dibuja polıgonos cerrados y colorea su interior.

patch: una instruccion tambien de bajo nivel, construye polıgonos, ocaras en tres dimensiones y asigna un color a la cara definida.

Comandos faciles de usar

Matlab tiene implementada una serie de comandos, asociados a la toolbox de calculosimbolico que vimos en la leccion anterior, que permiten dibujar de forma sencilla graficasde funciones. No se tiene un control tan completo como con plot pero se compensa consu facil uso. En el apartado que nos ocupa (graficas bidimensionales) son resaltables

220

Page 227: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas en Matlab

0 2 4 6

-0.5

0

0.5

sin(x)

0 2 4 6

-0.5

0

0.5

1cos(x)

0 2 4 6

-0.5

0

0.5

sin(2x)

0 2 4 6

-0.5

0

0.5

1cos(2x)

0 2 4 6

-0.5

0

0.5

sin(4x)

0 2 4 6

-0.5

0

0.5

1cos(4x)

Figura 10.7: Disposicion simultanea de graficas con subplot.

ezplot ezpolar

La ayuda de Matlab es, en nuestra opinion, suficiente para hacernos con su manejo.

10.2. Graficas en 3D

Comenzaremos con curvas en el espacio para pasar y tratar con mayor profundidadlas superficies en 3D. Hemos decidido incluir en este apartado las instrucciones relativasa curvas de nivel aunque hablando propiamente son dibujos bidimensionales. Su origen ysu 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 muysimilar a plot, por lo que no nos detendremos demasiado en su explicacion. Esta es susintaxis

plot3(x,y,z,opciones)

Las opciones son esencialmente las mismas que aparecıan en plot. He aquı un ejemplosencillo

221

Page 228: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.2 Graficas en 3D LECCION 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

-100

1020

30

-30-20

-100

1020

300

5

10

15

20

25

30

eje OX

Una curva en espiral...

eje OY

eje

OZ

Figura 10.8: Un dibujo en 3D con plot3.

accesorios del dibujo (axes, title, xlabel, grid...) funcionan exactamente igual. Ademasaparecen algunos nuevos cuya utilidad y manejo no deberıa causar sorpresa:

zlabel zlim

Para poder manipular, rotar en 3D, el objeto grafico basta presionar en la barra deherramientas en el boton senalado en la Figura 10.9 y mover el raton sobre el objeto conel boton pulsado

222

Page 229: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas en Matlab

Figura 10.9: Icono para rotar los dibujos.

10.2.2. El comando surf

Primer nivel

El comando surf dibuja esencialmente superficies en el espacio. En su forma massimple se puede identificar con el dibujo de funciones de dos variables en el espacio. Eneste caso, el formato es

surf(x,y,z)

donde x e y especifican una malla en el plano y z la altura correspondiente. El color quese da a cada punto esta asignado por defecto segun la altura en el eje Z.

Queda pendiente, no obstante, como construir una malla. Aunque se puede hacer amano (Matlab ofrece en su ayuda informacion detallada de como hacerlo), es mejor utilizarlos comandos propios de Matlab, en este caso, meshgrid. Ası, si queremos representar unasuperficie z = f(x, y) en un dominio rectangular utilizando los puntos de coordenadasx = (x1, . . . , xn) e y = (y1, . . . , ym), deberemos generar primero la malla formada por lospuntos (xi, yj). En Matlab simplemente tenemos que utilizar la orden

[X,Y]=meshgrid(x,y)

que crea las matrices de tamano m× n

X =

x1 . . . xn...

...x1 . . . xn

Y =

y1 . . . y1...

...ym . . . ym

.

Es decir, las m filas de X son copias del vector x y las n columnas de Y son copias delvector 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

Page 230: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.2 Graficas en 3D LECCION V

Y =

-1 -1 -1 -1

0 0 0 0

1 1 1 1

Ahora para representar la superficie z = f(x, y) utilizamos la orden surf(X,Y,Z)

donde

Z = f(X, Y) =

f(x1, y1) . . . f(xn, y1)...

...f(x1, ym) . . . f(xn, ym)

.

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 superficie creada con surf.

Se puede dibujar la superficie y asignar un color segun los valores de un cuarto vector(matriz mas bien). Desde una interpretacion matematica, se tratarıa de dibujar los valoresde una funcion sobre una superficie:

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

Page 231: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas en Matlab

Figura 10.11: Otro ejemplo de surf.

despliega la grafica de la Figura 10.11. El comando colorbar muestra la barra de coloresde la derecha que informa sobre el valor numerico que corresponde a cada color.

Tambien es posible dibujar superficies definidas sobre partes de un rectangulo. Paraello, cualquier punto cuya coordenada z sea un nan (not a number), no se dibuja. Porejemplo

>> 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 superficie de la Figura 10.12). La cuarta lınea merece un comentario aunqueinstrucciones parecidas han sido tratadas ya en la Leccion 1. Al hacer la comparacionsqrt(X.^2+Y.^2)<0.5, Matlab devuelve una matriz logica, de 1s y 0s segun el puntocorrespondiente este cerca del cero o no. La instruccion Z(sqrt(X.^2+Y.^2)<0.5)=NaN,hace que los puntos situados dentro del cırculo de radio 1/

√2 (que es donde la expresion

logica es 1), tomen como valor NaN. De todos modos se observa la deficiente aproximacionde los cuadrados, propios de surf, del cırculo interior. Al final de esta leccion veremosuna forma mas elaborada para trabajar con superficies definidas sobre conjuntos masgenerales.

Comandos del entorno 3D

Nos limitaremos a hablar de cinco comandos que controlan las propiedades del entorno3D, aunque estos no son los unicos disponibles en Matlab:

225

Page 232: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.2 Graficas en 3D LECCION V

Figura 10.12: Utilizacion de nan en un dibujo.

colorbar: despliega una barra de colores que informa sobre la correspondenciaentre el valor numerico y el color utilizado. Por defecto se despliegaverticalmente a la derecha del dibujo, aunque puede mostrarse horizon-talmente si ası se desea.

colormap: especifica que colores se van a utilizar en el dibujo (mapa de colores).Existe un conjunto de formatos predefinidos 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 definir formatos personalizados, bien mediante lalınea de comandos o desde la propia ventana grafica.

daspect: controla la relacion entre los ejes del dibujo. Baste decir que

daspect([1 1 1])

fija 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

Page 233: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas en Matlab

pbaspect: similar al anterior pero relacionado con la caja que enmarca el dibujo.

view: especifica 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 segundoes el angulo de elevacion vertical. Ambos deben especificarse 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 algunasopciones adicionales entre las que podrıamos destacar:7

’EdgeAlpha’: se especifica un valor entre 0 y 1 que define la transparencia quetiene la rejilla o red en el dibujo (con 0 la red es transparentey por tanto no se ve).

’FaceAlpha’: como la opcion anterior pero relativa a las caras.

LineStyle: indica el formato de la rejilla: ’-’, ’--’, ’:’,.... Igual que enplot. Con ’none’ desaparece del dibujo.

’MeshStyle’ tiene tres opciones posibles both (por defecto), row y column.Especifica como despliega la red: entera, solo las filas o solocolumnas, respectivamente.

’EdgeColor’: toma cuatro posible valores: un color (en el formato habitual),’none’, ’flat’, ’interp’. Especifica que color utilizar en larejilla. Por defecto es negro, pero se puede eliminar la rejil-la (’none’), se puede utilizar el color marcado por el primervertice (’flat’) o bien utilizar un color definido por los coloresde los dos vertices de cada eje (’interp’).

’FaceColor’: con los mismos valores que en la opcion anterior. La opcion’interp’ fija un color interpolado sobre la cara, eliminan-do ası el aspecto de mosaico que en ocasiones adoptan lassuperficies.

’LineWidth’: anchura de las lıneas 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

7siempre a nuestro juicio...

227

Page 234: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.2 Graficas en 3D LECCION 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 superficie

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

Page 235: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas en Matlab

En un tercer nivel de dificultad (y de precision), se puede manipular el dibujo vıa elhandle que devuelve, de forma similar a como hacıamos 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 propiedaddeterminada 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

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

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

Observarıamos ası algunas de las opciones que hemos comentado y otras muchas mas queno 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

Page 236: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.2 Graficas en 3D LECCION V

Mallados especiales

Con sphere podemos obtener el mallado de una esfera. Puede utilizarse para dibujarbien una esfera o incluso funciones definidas sobre una superficie esferica. Por ejemplo,mediante el siguiente fichero script hemos obtenido las representaciones graficas de laFigura 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 masflexibles de lo que pueda parecer. Ası, y aunque parezca paradojico,

230

Page 237: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas en Matlab

>> cylinder(0:0.1:1,40)

dibuja un cono.

Ejercicio 10.6 Lee bien la ayuda de cylinder. ¿Podrıas dibujar una semiesfera utilizandoeste comando?.

10.2.3. Otros comandos

Comentaremos a continuacion otras instrucciones relacionadas con graficas de objetostridimensionales.

pcolor

Proporciona un dibujo bidimensional de una superficie vista desde arriba. Es equiva-lente a dibujar primero la superficie con la orden surf y posteriormente cambiar el puntode vista mediante view(0,90). Puedes ver un ejemplo en la Figura 10.15.

Figura 10.15: Una superficie con surf y pcolor.

contour y contourf

Despliegan las lıneas de nivel del dibujo. Propiamente generan una grafica en 2D. Ladiferencia entre ellas es que la primera instruccion solo traza las curvas de nivel mientrasque la segunda colorea el espacio entre ellas.

Es posible anadir un texto sobre cada lınea de nivel utilizando clabel. Para ello bastahacer como en el ejemplo siguiente

231

Page 238: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.2 Graficas en 3D LECCION 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.20.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.60.6

0.6

0.8

0.8

0.80.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.59

999-0.59999

-0.2

-0.2

-0.2

-0.2

0.2 0.2

0.20.2

0.60.6

0.6

0.6

0.6

-0.2

-0.20.2

0.2 -0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

Figura 10.16: Lıneas de nivel

surfc y surfl

Ambas son variantes de surf. La primera despliega la superficie y dibuja en el planoOXY (plano inferior) las curvas de nivel.

La segunda es como surf pero el color que asigna a cada punto viene determinadopor un punto de iluminacion exterior. El resultado es el de una superficie de un colordeterminado iluminado desde un punto

mesh, meshc, meshz y waterfall

Todos ellos dibujan unicamente la malla (rejilla) del dibujo. La segunda ademas anadelas lıneas de nivel, de forma semejante a como procedıa surfc. Finalmente, waterfall es

232

Page 239: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas en Matlab

como mesh pero anade un efecto de caida en los bordes del dibujo8.

10.2.4. Comandos faciles de usar

Los comandos

ezplot3 ezmesh ezmeshc ezsurf ezsurfc

ezcontour ezcontourf

permiten trazar, de forma muy sencilla, curvas y superficies en el espacio. Su sencillez deuso (consulta la ayuda) queda lastrada con el inconveniente de que apenas se tiene controlsobre el aspecto final.

10.3. Campos vectoriales

Los comandos quiver y quiver3 despliegan en 2D y 3D campos de velocidades. Estoes, 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

8Es mas facil verlo que explicarlo...

233

Page 240: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.4 Dibujos sobre dominios mallados en triangulos LECCION 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 estodistorsione el dibujo hemos optado por no dibujar los vectores correspondientes a puntosmuy cercanos al origen. Con este fin hemos utilizado una variable (en realidad una matriz)logica ind que toma valor uno unicamente si el punto correspondiente (X,Y) esta cercadel origen.

Una vez salvada esta dificultad, hemos procedido a dibujar el campo de velocidadesresultante.

El comando quiver devuelve en realidad dos punteros, uno a las lıneas y otro ala cabeza del vector. Sus valores opcionales son similares a los ya vistos en seccionesanteriores.

Ejercicio 10.7 Siguiendo con las instrucciones desplegadas arriba, observa que sucede si seejecuta

set(h(1),’linewidth’,1,’color’,’r’,’linestyle’,’:’)

set(h(2),’color’,’k’)

¿Podrıas eliminar la punta de los vectores?.

Ejercicio 10.8 Utilizando el comando quiver3, dibuja el campo de velocidades que a cadapunto le asigna el vector (velocidad) dado por(

− x√x2 + y2 + z2

,− y√x2 + y2 + z2

,− z√x2 + y2 + z2

)

(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 pensadospara dibujar superficies definidas esencialmente sobre una cuadrıcula. Aunque en muchoscasos esto es suficiente, en otras muchas ocasiones se trabaja con funciones definidas sobreconjuntos, o dominios en la terminologıa habitual, mucho mas generales.

Una forma muy simple de trabajar con estos dominios es dividirlos en triangulos yconstruir la superficie solapando diferentes planos definidos sobre cada triangulo9. Losresultados que se obtienen son bastante satisfactorios, puesto que los triangulos son masflexibles que los cuadrilateros a la hora de adaptarse a los dominios.

Esta division en triangulos de un dominio se denomina triangulacion o mallado deldominio. Se dice que un mallado se hace mas fino si el tamano de los triangulos disminuye.

Una triangulacion es conforme si la interseccion de dos lados cualesquiera del malladoes o bien vacıa (los triangulos no se tocan), o un vertice o un lado entero. Es decir no

9Se utiliza el conocido resultado de que tres puntos no alineados definen un unico plano. Es facil vertambien que la superficie ası construida es continua

234

Page 241: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas en Matlab

Figura 10.18: Triangulacion no conforme.

se admite que un lado de un triangulo pueda ser parte de dos lados de dos triangulosdiferentes (vease la Figura 10.18). Por otro lado, una familia de triangulaciones se diceregular si los triangulos no se aplanan, es decir, los angulos de los triangulos no se hacenmuy pequenos.

La siguiente cuestion es como almacenar la informacion de una triangulacion. Sioptaramos por guardar cada triangulo, con sus correspondientes vertices, guardarıamosinformacion redundante. Por ejemplo, un vertice compartido por 6 triangulos serıa alma-cenado 6 veces.

En lugar de ello se opta por una estructura mas elaborada pero mas economica. Seempieza almacenando las dos coordenadas de los vertices en dos vectores que denotaremospor 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 ynumero de filas igual al numero de triangulos. Para saber los vertices que correspondenal triangulo i basta leer la correspondiente fila 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 siguientesvariables

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

Page 242: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.4 Dibujos sobre dominios mallados en triangulos LECCION 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

78

9 10

1112

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

1920

21

22

2324

25

26

27

28

Figura 10.19: Ejemplo de triangulacion. En el grafico la numeracion de los triangulos serodea con un cırculo.

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

Page 243: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 10. Matlab: Salidas graficas 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 suficiente para construir la malla, la triangulacion del do-minio. Si ademas se desea construir una superficie definida sobre ese dominio, basta anadirun 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

Page 244: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.4 Dibujos sobre dominios mallados en triangulos LECCION V

Esta es una forma ya estandar de definir y trabajar con una triangulacion que tambiensigue Matlab10 con los comandos trimesh y trisurf.

El primero despliega la malla triangular especificada por t, (la matriz conteniendo lostriangulos), x e y (que dan las coordenadas de los vertices),

trimesh(t,x,y)

Se puede especificar 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 superficies. Las opciones para manipularel aspecto final de la superficie son iguales que las de surf, incluyendo las ya vistasfacecolor, 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 seplantea 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 demasıa lostriangulos).

Posteriormente, se trata de refinar la malla, es decir, dividir los triangulos en triangulosmas pequenos hasta que se alcance una precision adecuada.

Esta idea se esconde detras de aplicaciones como la interpolacion (aproximacion deuna funcion) y especialmente el metodo de elementos finitos, probablemente del metodo11

mas utilizado en la resolucion de problemas de contorno para ecuaciones en derivadasparciales.

Si se desea informacion de como se puede inicializar un malla en Matlab, ası comosobre el algoritmo utilizado se puede consultar el comando initmesh (incluido el tema detriangulaciones de Delaunay). Para el refinamiento puedes consultar refinemesh. .

Existe otra posibilidad mas visual, y por tanto mas amigable para empezar a trabajar.Teclea

>> pdetool

Se cargara un entorno grafico para la resolucion de ecuaciones en derivadas parciales. Noentraremos en este tema por ser demasiado tecnico. En lugar de ello, nos centraremos enla definicion de mallados. Una vez dibujado el dominio, y mallado, se puede exportar lamalla a la ventana de comandos en las variables t y p. La primera contiene en las tresprimeras filas los triangulos que componen la triangulacion mientras que las coordenadasde los vertices estan guardadas en las dos filas de p. �

10La toolbox pdetool dedicada a la resolucion de ecuaciones en derivadas parciales sigue una variantealgo mas complicada que la expuesta arriba.

11Propiamente hablando es una familia de metodos.

238

Page 245: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorCapıtulo 11

Interpolacion. Curvas Bezier

11.1. Interpolacion polinomica

Un problema ya clasico es la construccion, o aproximacion de una funcion conocidosunos pocos valores. Algunas referencias a este tipo de problemas se remontan al manejo detablas trigonometricas y posteriormente logarıtmicas y exponenciales donde unos pocosvalores 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 delvalor puntual, anadimos informacion sobre las derivadas estamos ante una interpolacionde Hermite.

En estos apuntes trataremos principalmente la interpolacion polinomica, esto es, laconstruccion 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 {(x0, y0), (x1, y1), . . . (xn, yn)}, construirun polinomio pn de grado n tal que

pn(xj) = yj, j = 0, . . . , n.

El polinomio pn recibe el nombre de polinomio de interpolacion de Lagrange. Ha-bitualmente, yj son valores de una funcion f que solo se puede evaluar en un conjuntofinito de puntos porque o bien en el resto del intervalo es desconocida, o bien es caracomputacionalmente de evaluar.

Tenemos una serie de cuestiones pendientes:

¿Se puede construir siempre el polinomio de interpolacion pn?. Y relacionada conesta cuestion, ¿el polinomio de interpolacion es unico?.

¿Existen formas optimas para calcular este polinomio?.

239

Page 246: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador11.1 Interpolacion polinomica LECCION V

7.994 7.996 7.998 8 8.002 8.004 8.006

-1

0

1

2

3

4

5

x 10-9

z6-46*z5+ 884*z4-9088*z3+52736*z2-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 pn a esta funcion f?. Este punto es crucial ya que se trata del errorque podemos esperar de nuestra aproximacion.

Como cuestion asociada, pero no menos importante, nos deberıamos 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 (z−8)4(4+(z−8)(2+(z−8)))y z6−46z5+884z4−9088z3+52736z2−163840z+212992 en un entorno de 8. Analıticamenteson el mismo polinomio pero el resultado de evaluar una u otra expresion puede darun resultado muy diferente debido a los errores de redondeo. La primera expresion esmucho mas apropiada desde el punto de vista computacional aunque nosotros estemosmas acostumbrados a escribir los polinomios de la segunda manera.

El algoritmo mas estable para evaluar un polinomio es el metodo de Horner queesta basado a su vez en el metodo de Ruffini para dividir polinomios. Concretamenteutiliza que el valor de p(a) es el resto de dividir p(z) por z−a . El algoritmo es facilmenteimplementable y tiene un costo reducido.

11.1.2. Existencia del polinomio de interpolacion

Probaremos la existencia del polinomio de interpolacion mediante un razonamientodirecto. Tomemos

Pn 3 pn(x) = a0 + a1x + a2x2 + . . . + anx

n,

240

Page 247: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 11. Interpolacion. Curvas Bezier

un polinomio de grado n. Obviamente, pn cuenta con n + 1 parametros libres que sonsimplemente sus coeficientes {aj}. Si exigimos que

pn(xj) = yj, j = 0, . . . , n,

nos encontramos con que los coeficientes satisfacen el sistema lineal

1 x0 x20 · · · xn

0

1 x1 x21 · · · xn

1

1 x2 x22 · · · xn

2

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

1 xn x2n · · · xn

n

a0

a1

a2

...

an

=

y0

y1

y2

...

yn

. (11.1)

Por tanto el problema se reduce a la resolucion de un sistema de ecuaciones lineales yla existencia y unicidad del polinomio de interpolacion a que el sistema en cuestion seacompatible determinado.

La matriz del sistema (11.1) es de tipo Vandermonde que nos ha surgido repetidasveces en estos apuntes1. Dado que el sistema tiene el mismo numero de ecuaciones quede incognitas, se tiene que la existencia de solucion para cualquier conjunto dedatos es equivalente a la unicidad. Ademas, la unicidad de solucion es equivalentea 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 nraıces.

Otra forma de ver la existencia y unicidad es de tipo constructiva. Tomemos

Lj(x) :=(x− x0) · · · (x− xj−1)(x− xj+1) · · · (x− xn)

(xj − x0) · · · (xj − xj−1)(xj − xj+1) · · · (xj − xn)=∏i6=j

x− xi

xj − xi

.

Es facil ver que Lj ∈ Pn y que ademas

Lj(xi) :=

{1, i = j,0, i 6= j.

Por tanto,

pn(x) = y0L0(x) + y1L1(x) + . . . + ynLn(x)

satisface las condiciones (11.1). Una vez probada la existencia deducimos por los mismosargumentos 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 Pn formada por {Lj}j se denomina basede Lagrange del problema de interpolacion.

Ejercicio 11.1 Programar una funcion que evalue el polinomio de interpolacion segun laformula de Lagrange en un conjunto de puntos.

1Cada columna es el resultado de elevar a una potencia el vector [1 x0 x1 · · · xn]>

241

Page 248: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador11.1 Interpolacion polinomica LECCION V

Solucion. He aquı una posible implementacion2

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 conel 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 polinomiocrece?.

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 interpolaciony de proceder a su evaluacion.

2Observa el for de la lınea 20

242

Page 249: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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.5Error

polinomio de grado 5polinomio de grado 9polinomio de grado 13

exp(-x).*sin(6.*x)polinomio de grado 5polinomio de grado 9polinomio 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 Pn la dada por

{L0(x), L1(x), . . . , Ln(x)}.

En esta base, las coordenadas del polinomio de interpolacion son simplemente los valoresque toma la funcion en los puntos donde se interpola. Es decir, no es necesario resolverningun sistema de ecuaciones lineales (la matriz del sistema serıa la matriz identidad).El precio que se paga como contrapartida es una evaluacion mas cara del polinomio deinterpolacion.

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− x0), (x− x1)(x− x0), . . . , (x− xn−1)(x− xn−2) · · · (x− x0)}.

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− x0) + . . . + αn(x− xn−1)(x− xn−2) · · · (x− x0). (11.2)

Ademas el sistema lineal que hay que resolver para obtener los coeficientes αj es ahora tri-angular superior, por lo que su resolucion es practicamente directa en O(n2) operaciones.

243

Page 250: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador11.1 Interpolacion polinomica LECCION V

Aun es mas, si pn(x) interpola a f en n + 1 puntos, anadir un punto mas (xn+1, yn+1) essimplemente corregir el polinomio anterior en la forma siguiente

pn+1(x) = pn(x) + αn+1(x− x0) · · · (x− xn), (11.3)

donde

αn+1 =yn+1 − pn(xn+1)

(xn+1 − xn)(xn+1 − xn−1) · · · (xn+1 − x0). (11.4)

Es decir, el trabajo hecho para calcular el polinomio de interpolacion en n + 1 puntos sepuede utilizar si se desea anadir 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 dedatos. Sin embargo, un analisis algo mas detallado nos va a descubrir una manera masapropiada de calcular los coeficientes del polinomio de interpolacion. Siguiendo la no-tacion clasica, consideraremos que los valores yj que deseamos interpolar provienen deuna funcion f a priori desconocida, es decir,

yj = f(xj), j = 0, . . . , n.

Escribiremos entonces el polinomio que interpola en {xk, . . . , xk+m} como sigue

f [xk] + f [xk, xk+1](x− xk) + . . . + f [xk, xk+1, . . . , xk+m](x− xk) · · · (x− xk+m−1). (11.5)

La identidad (11.3) justifica el uso de esta notacion es correcta. Esto es, el coeficientede (x − xk) · · · (x − xk+r) no depende de m. Obviamente, si k = 0 y m = n, entoncesrecuperaremos el polinomio de interpolacion en el conjunto inicial de valores. A estasalturas f [xk, xk+1, . . . , xk+r] son todavıa simples coeficientes del polinomio de cuyo calculonos ocupamos a continuacion. Es inmediato comprobar que si∣∣∣∣∣∣∣

pn interpola en{

(x0, f(x0)), (x1, f(x1)), . . . , (xn, f(xn))}

,

qn interpola en{

(x1, f(x1)), (x2, f(x2)), . . . , (xn+1, f(xn+1))}

,

entonces

pn+1(x) = qn(x) +x− xn+1

x0 − xn+1

(pn(x)− qn(x)), (11.6)

es el polinomio que interpola en los n + 1 puntos{(x0, f(x0)), (x1, f(x1)), . . . , (xn+1, f(xn+1))

}.

Detengamonos un momento a examinar el coeficiente director de cada polinomio. Elcoeficiente en xn de pn y qn y el de xn+1 de pn+1 son respectivamente

f [x0, . . . , xn], f [x1, . . . , xn+1] f [x0, . . . , xn+1].

Utilizando (11.6) deducimos que

f [x0, x1 . . . , xn+1] =f [x0, . . . , xn]− f [x1, . . . , xn+1]

x0 − xn+1

. (11.7)

244

Page 251: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 11. Interpolacion. Curvas Bezier

Comof [xj] = f(xj)

(simplemente porque el polinomio de grado 0 que pasa por (xj, f(xj)) es la constantef(xj)), obtenemos una forma recursiva de calcular los coeficientes del polinomio de in-terpolacion. El algoritmo resultante se puede representar esquematicamente mediante eldiagrama de la Figura 11.3.

En la literatura, f [xk, . . . , xk+r] recibe el nombre de diferencia dividida de orderr, mientras que la forma de escribir el polinomio expuesta en (11.2) y (11.5) recibe elnombre de formula de Newton3.

Obviamente, a partir de la formula de Newton podemos expresar el polinomio queinterpola a f en los puntos {x0, . . . , xn} en la forma

f [x0] + (x− x0)(f [x0, x1] + (x− x1)

(f [x0, x1, x2] + (x− x2)

(. . .

+(x− xn−1)f [x0, x1, . . . , xn])))

, (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 x0, y0 % datos

02 n = length(x0)− 1

03 D(:, 0) = y0;04 for j=1:n

05 for i=0:n-j

06 D(i, j) =D(i + 1, j− 1)− D(i, j− 1)

x0(i + j)− x0(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− x0(i)) ∗ y + D(0, i)14 end

Con la notacion anterior

D(i, j) = f [xi, xi+1, . . . , xi+j]

de forma que j es el orden de la diferencia e i el nodo donde empieza.

3De nuevo los nombres utilizados dan idea de la antiguedad de estas tecnicas. Newton hallo esta formade escribir el polinomio cuando estudiaba las formulas de cuadratura de Newton-Cotes.

245

Page 252: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador11.1 Interpolacion polinomica LECCION V

Orden 0 Orden 1 Orden 2 Orden 3

x0 f(x0) = f [x0] // f [x0, x1] // f [x0, x1, x2] // f [x0, x1, x2, x3]

x1 f(x1) = f [x1] //

66mmmmmmmmmmmmmf [x1, x2]

66mmmmmmmmmmmmm// f [x1, x2, x3]

66lllllllllllll

x2 f(x2) = f [x2] //

66mmmmmmmmmmmmmf [x2, x3]

66mmmmmmmmmmmmm

x3 f(x3) = f [x3]

66mmmmmmmmmmmmm

Figura 11.3: Estructura del calculo de las diferencias dividas.

Ejercicio 11.3 Implementa el calculo del polinomio de interpolacion mediante diferenciasdivididas.

Solucion. Nuestra intencion es, si no se especifican valores donde evaluar el polinomio,que se devuelva el polinomio escrito en forma simbolica. Es decir, declararemos x comovariable simbolica y devolveremos el polinomio en esta variable. Podemos escoger hacerloen forma expandida o bien simplemente escrito en la forma anidada. Nosotros hemosescogido hacerlo en la segunda forma.

Por otro lado y entrando ya en el tema de su implementacion, en el algoritmo anteriortodas las entradas de los vectores y matrices implicados se numeran de 0 a n. Hay que teneren cuenta, como ya hemos hecho repetidas veces, que la numeracion en Matlab comienzanecesariamente en 1 y por tanto los vectores y bucles iran de 1 a n+1. Recordemos quen+1 es la longitud del vector de datos. Aunque en teorıa renumerar el algoritmo esalgo 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

Page 253: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 lıneas 25-27 se puede vectorizar. Hazlo.

Un analisis mas detenido muestra que no es necesario definir toda una matriz D sinoque es posible realizar todo el proceso con un vector. Para ello observa que las diferenciasD(i, j) con solo se utilizan dos veces, para construir D(i− 1, j + 1) y D(i, j + 1). Esto seconsigue modificando las lıneas 03-08 del algoritmo como sigue

Modificacion

03 D = y0;

04 for j=1:n

05 for i=n:-1:j

06 D(i) =D(i)− D(i− 1)

x0(i)− x0(i− j)07 end

08 end

247

Page 254: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador11.1 Interpolacion polinomica LECCION V

Observa que las diferencias se sobrescriben en el vector pero de una forma tal que unvalor no es borrado hasta que ya ha sido utilizado. De ahı que el bucle en 05 vaya haciaatras. Con esta modificacion

D(i) =f [x0, x1, . . . , xi].

Ejercicio 11.5 Retoca el programa newtonp segun las indicaciones anteriores.

Ejercicio 11.6 El algoritmo de Neville para la evaluacion del polinomio de interpolacion sebasa en la identidad (11.6). Dado el punto x donde evaluar el polinomio de interpolaciony partiendo de n + 1 polinomios de grado cero que interpolan los datos ({x0, x1, . . . , xn})procede a calcular el valor que toman en x los polinomios de grado 1 que interpolan endos puntos ({{x0, x1}, {x1, x2}, . . . , {xn−1, xn}}), seguidamente los de grado 2 interpolantesen tres puntos, ({{x0, x1, x2}, {x1, x2, x3}, . . . , {xn−2, xn−1, xn}}), y ası sucesivamente hastallegar al polinomio final de grado n.

En todos los casos es la identidad (11.6) la que permite calcular el valor del polinomio degrado k + 1 en funcion de dos de grado k. La evaluacion se puede representar en forma deestructura en arbol, muy similar a la que se obtiene para las diferencias divididas. ¿Podrıasdisenar y programar este algoritmo?.

Nota. Observa que el metodo funciona aun cuando los puntos x0, . . . , xn no estenordenados, aunque para una evaluacion del polinomio mas estable es mejor que ası sea.Ademas la definicion de las diferencias divididas no depende del orden de los puntos

f [x0, . . . , xi, . . . , xj, . . . xn] = f [x0, . . . , xj, . . . , xi, xn].

De forma alternativa se puede escribir el polinomio de interpolacion mediante

f [xn] + f [xn, xn−1](x− xn) + . . . + f [xn, xn−1, . . . , x0](x− x1)(x− x2) · · · (x− xn). (11.9)

En este caso se habla de diferencias regresivas, mientras que en el caso que hemostratado reciben el nombre de diferencias progresivas. �

Ejercicio 11.7 Modificar 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 setoma igual a length(x0)− 1, devuelve el polinomio de interpolacion mientras que paran menor calcula el polinomio que mejor aproxima a los puntos por mınimos cuadrados4.Para evaluar el polinomio se recurre a polyval.

El algoritmo que utiliza Matlab es el directo, construyendo simplemente la matrizde Vandermonde y resolviendo el sistema mediante una descomposicion QR que es masestable numericamente. Sin embargo, con un numero (muy) elevado de puntos, la inesta-bilidad numerica subyacente se hace palpable.

4Es decir, calcular el polinomio de grado n, que minimiza∑

i

(p(xi)− yi)2.

248

Page 255: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 11. Interpolacion. Curvas Bezier

Ejercicio 11.8 Interpola la funcion cos(8πx) en [0, 1] con 20,40, 80 y 160 puntos utilizandoel 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. Encualquier caso, el resultado relevante es el siguiente: si f es la funcion regular que inter-polamos en {x0, x1, . . . , xn} ⊂ [a, b], entonces el error en cada punto se puede escribir

f(x)− pn(x) =1

(n + 1)!f (n+1)(ξx) (x− x0)(x− x1) · · · (x− xn)︸ ︷︷ ︸

ωn(x)

(11.10)

donde ξx ∈ [a, b] depende de x. Vemos que hay varias contribuciones al error final:

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 puedeser muy oscilante.

En vista de lo anterior serıa facil concluir que hay convergencia del polinomio deinterpolacion a la funcion si esta es suave. Dicho de otra manera, funcion y polinomio sevolverıan indistinguibles si tomasemos un numero elevado de puntos.

Desafortunadamente5, la conclusion anterior es falsa. Uno de los primeros (con-tra)ejemplos lo encontro Carl Runge6 a finales del siglo XIX7. Consistıa en interpolar lafuncion

f(x) =1

1 + 25x2

en el intervalo [−1, 1] en un conjunto uniforme de puntos. El resultado (desastroso) semuestra en la Figura 11.4.

Una forma de reducir el error es controlar la funcion ωn(x) para que sea lo mas pequenaposible. Ası, el problema se plantea en los siguientes terminos8

¿Que eleccion de los nodos {x0, x1, . . . , xn} hace que maxx |ωn(x)| seamınimo?.

5Y contraintuitivamente. ¿Como entender si no que dos funciones regulares que coincidan en un numerocada vez mayor de puntos no acaben siendo muy similares?

6Matematico aleman de finales del siglo XIX. Tambien es conocido por ser codesarrollador del MetodoRunge-Kutta para la resolucion de problemas de valor inicial.

7Este fue el siglo de la fundamentacion de las Matematicas. Se probo que multitud de resultados que setenıan 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 ningun punto, de funciones continuaspero no derivables en ningun punto, ası como de funciones con un numero infinito de maximos y mınimoslocales. Tambien se construyeron curvas que rellenaban el plano, curvas cerradas que englobando una areafinita tenıan una longitud infinita (fractales)... Algunas de estas construcciones, originarias esencialmenteen las Matematicas puras han encontrado en el siglo XX aplicaciones a problemas de ındole esencialmentepractico.

8Un problema min-max: minimizar un maximo.

249

Page 256: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador11.1 Interpolacion polinomica LECCION 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

4Error

1./(1+25.*x.2)polinomio de grado 5polinomio de grado 10polinomio de grado 15polinomio de grado 20

polinomio de grado 5polinomio de grado 10polinomio de grado 15polinomio 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 Chebyshev9 enterminos de una familia de polinomios conocidos como polinomios de Chebyshev de primertipo.

Para un intervalo arbitrario [a, b], la disposicion de los n + 1 puntos de interpolacionque minimizan el maxx∈[a,b] |wn(x)| es la dada por los puntos

xk :=a + b

2+

b− a

2cos( π

2n + 2+

n + 1

), k = 0, . . . , n. (11.11)

Es facil comprobar que la distribucion de puntos no es en medida alguna uniforme sinoque tiende a concentrar puntos en los extremos.

La eleccion de estos puntos para la interpolacion no asegura la convergencia delpolinomio pero sı permite controlar mejor uno de los terminos que mas rapido puedencrecer con n, con lo que en la practica se traduce en mejores resultados10. De hecho conesta eleccion,

maxx∈[a,b]

|ωn(x)| = 1

2n

9Matematico ruso del siglo XIX. Estos polinomios surgieron en sus estudios en aproximacion de fun-ciones por polinomios. Chebyshev hizo tambien importantes contribuciones en Teorıa de la Probabilidad.

10Dicho de otra manera, es mas difıcil dar con un ejemplo para el que esta disposicion de nodos de unpolinomio interpolante que no converja a la funcion original.

250

Page 257: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 11. Interpolacion. Curvas Bezier

de forma que ωn(x) → 0 cuando n → ∞ (ademas esta convergencia es rapida). En laFigura 11.5 observamos como ahora el polinomio interpolante para el ejemplo de Rungeconverge 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

4Error

1./(1+25.*x.2)polinomio de grado 5polinomio de grado 10polinomio de grado 15polinomio de grado 20

polinomio de grado 5polinomio de grado 10polinomio de grado 15polinomio de grado 20

Figura 11.5: Ejemplo de Runge con otros nodos.

Ejercicio 11.9 Elege un intervalo arbitrario [a, b] y crea un fichero script que muestre ladisposicion de los puntos dados por (11.11). Dibuja los puntos obtenidos para diferentesvalores 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 diferenciasdivididas de las que finalmente se deduce la estimacion del error del polinomio de interpolaciondada 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 [x0, . . . , xn] =f (n)(ξ)

n!.

(3) Fijemos y ∈ [a, b]. Entonces

f(x) = pn(y) + f [x0, . . . , xn, y](x− x0)(x− x1) · · · (x− xn).

Utiliza ahora (2) para probar la estimacion del error dada en (11.10).

251

Page 258: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador11.2 Extensiones adicionales LECCION V

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

g′(c) = 0.

Aplicando este resultado, concluimos que existe αj ∈ (xj , xj+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

(x0, f(x0)), . . . , (x0, f(m0)(x0))

(x1, f(x1)), . . . , (x1, f(m1)(x1))

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

(xn, f(xn)), . . . , (xn, f(mn)(xn))

Observa que estamos asumiendo que no hay huecos en los datos. Esto, si por ejemplo laderivada de orden 2 es dato, tambien lo es el valor de la funcion y su primera derivada.El numero total de datos es

N := (m0 + 1) + (m1 + 1) + · · ·+ (mn + 1),

por lo que el polinomio deberıa tener grado N − 1.El analisis de este problema no tiene mayor dificultad 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 [ xk, . . . , xk︸ ︷︷ ︸m + 1 veces

] := f (m)(xk).

La idea es ordenar los nodos y tomarlos repetidos segun el numero de datos que consid-eramos en cada punto de forma que tomaremos los N nodos

{x0, x0, . . . , x0︸ ︷︷ ︸m0+1

, x1, x1, . . . , x1︸ ︷︷ ︸m1+1

, . . . , xn, xn, . . . , xn︸ ︷︷ ︸mn+1

.}

Las diferencias divididas se definen de nuevo de forma recursiva

f [xi, xi+1, . . . , xi+m] :=

f (m)(xi)

m!, si xi = xi+m,

f [xi, x1, . . . , xi+m−1]− f [xi+1, x1, . . . , xi+m]

xi − xm

, en otro caso,

252

Page 259: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 11. Interpolacion. Curvas Bezier

y el polinomio de interpolacion se construye exactamente como antes, es decir, utilizandola formula (11.8) con las nuevas definiciones de los nodos y de las diferencias divididas.

El calculo de las diferencias y la evaluacion del polinomio en un punto en el caso dela interpolacion de Hermite puede describirse en lenguaje de pseudocodigo de la siguienteforma:

Diferencias divididas para la interpolacion Hermite

01 x0, y0 datos02 n = length(x0)− 1

03 D = y0;

04 for j=1:n

05 for i=n:-1:j

06 if x0(i) == x0(i− j)07 D(i) = D(i)/j08 else

09 D(i) =D(i)− D(i− 1)

x0(i)− x0(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− x0(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 computacionallas diferencias con respecto a la interpolacion de Lagrange son mınimas.

Ejercicio 11.11 Entiende bien el algoritmo anterior. Implementa la interpolacion de Hermitesegun 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

Page 260: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador11.2 Extensiones adicionales LECCION V

devuelve de hecho el polinomio de Taylor de orden 5 de f(x) = exp(x) en el cero. Laorden

>> 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 lospolinomios por funciones periodicas sencillas con el mismo periodo. Por simplificar, vamosa suponer que estamos considerando unicamente funciones 2π–periodicas, aunque las ideasque a continuacion expondremos se extienden facilmente a funciones con cualquier periodo.

Concretamente, si se trata de funciones 2π–periodicas 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 utilizacionde exponenciales complejas facilita tanto el analisis como la manipulacion ası como laextension de la interpolacion a funciones complejas

Supongamos que tomamos un numero impar 2n+1 de puntos de interpolacion equidis-tantes:

xk =2kπ

2n + 1, k = 0, . . . , 2n.

El problema queda ası definido: calcular

p2n+1(x) :=n∑

j=−n

αj exp(ijx)

tal que

yk = p2n+1(xk) =n∑

j=−n

αj exp( 2πijk

2n + 1

).

La resolucion de este problema se puede llevar a cabo con la transformada de FourierDiscreta, y por tanto es aplicable la FFT.

Ejercicio 11.12 Comprueba que efectivamente se reduce todo a una transforma de Fourierdiscreta.(Ayuda: Observa que

exp(− 2πijk

2n + 1

)= exp

(2πi(2n + 1− j)k2n + 1

).

Por tanto el problema es equivalente a encontrar αj tales que

yk = p2n+1(xk) =n∑

j=0

αj exp( 2πijk

2n + 1

)+

2n∑j=n+1

α2n+1−j exp( 2πijk

2n + 1

).

)

Ejercicio 11.13 ¿Que pasa si se toma un numero par de puntos de interpolacion?

254

Page 261: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 11. Interpolacion. Curvas Bezier

Nota. El interpolante converge a la funcion bajo hipotesis mucho mas debiles que enel caso no periodico. Por ejemplo, basta con que la funcion tenga derivada continua. Noexisten por tanto fenomenos como el de Runge para funciones periodicas con condicionesmınimas de regularidad. �

11.2.3. Interpolacion polinomica a trozos

Los polinomios tienen un importante inconveniente que desaconseja su utilizacion parala interpolacion en un numero elevado de puntos. La Figura 11.6 ilustra esta problematicacon 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 seapracticamente constante en dos zonas con un salto en medio. El polinomio es excesiva-mente rıgido11 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 flexibles.

Uno de los elementos mas populares son los splines. Un spline12 es una funcionpolinomica a trozos que cuenta con cierta regularidad. Es decir, diferentes polinomiossobre 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

11Es un sımil con lo que sucede si se dobla una vara muy rıgida. El problema al utilizar polinomios esque basta modificar un solo dato para que el polinomio se cambie en todo el dominio, en muchas ocasionessin ningun control. Sin embargo, en un interpolante uno deberıa esperar que la modificacion de un puntoafectara solo al entorno de dicho punto.

12aceptaremos el anglicismo a partir de ahora.

255

Page 262: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador11.2 Extensiones adicionales LECCION V

trozos y las poligonales. En este ultimo caso, se trata sencillamente de unir los puntos porsegmentos obteniendose una curva poligonal. Sin embargo para las constantes a trozos nopodemos exigir continuidad y para las poligonales no podemos exigir derivabilidad en lospuntos de contacto (tiene picos).

Los splines cubicos son probablemente los mas utilizados. Partiendo de una subdivisiondel intervalo a = x0 < x1 < · · · < xn = b, se trata de construir una funcion sn tal que

sn(x)|[xi,xi+1] ∈ P3, i = 0, . . . , n− 1,

es decir, sea un polinomio de grado tres en cada subintervalo, cumpliendo que

sn(xi) = yi, , i = 0, . . . , n,

esto es, que tome unos valores prefijados en los puntos de interpolacion y de modo quetanto la funcion sn como sus derivadas primera y segunda sean continuas13 en todo elintervalo [a, b]. Por tanto tenemos que exigir que

lımx→x+

j

s(j)n (x) = lım

x→x−j

s(j)n (x), j = 0, 1, 2.

La continuidad de la primera derivada preserva la existencia de recta tangente (no haypicos) y por tanto la velocidad de recorrido de la curva, mientras que con la continuidadde la derivada segunda garantizamos que curvatura de la curva sea tambien continua entodo el dominio de definicion.

Dado que tenemos n subintervalos, y cuatro parametros sobre cada intervalo (sn es unpolinomio de grado 3 en cada intervalo), disponemos de 4n variables. Por contra, los datosde interpolacion fijan n + 1 restricciones y las condiciones de continuidad del spline y desus 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 fijar dos condiciones adicionales para poderhablar, siquiera plantear, la unicidad del spline.

Estas son algunas de las elecciones habituales

s′′n(x0) = s′′n(xn) = 0, spline natural.

Datos adicionales s′n(x0) = y−1, s′n(xn) = yn+1, spline grapado.

Condiciones de periodicidad: si los datos son periodicos se puede imponer s′n(x0) =s′n(xn), s′′n(x0) = s′′n(xn), 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 eficientes, y por tantocomplejas, que la forma directa que se deduce de su definicion.

Entre las buenas propiedades de los splines destacamos que convergen a la funcion siesta es continua. Aun es mas, si la funcion f que se interpola es regular (de hecho bastacon que su derivada cuarta sea continua)

maxx|sn(x)− f(x)| ≤ C max

j(xj+1 − xj)

4

con C una constante dependiente de f pero independiente de los puntos.

13Si forzaramos la continuidad de la tercera derivada tendrıamos globalmente un polinomio de gradotres.

256

Page 263: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 11. Interpolacion. Curvas Bezier

Nota. Los splines tienen un origen muy natural. Existıa una herramienta de dibujo,ya anticuada, que recibıa el nombre de spline, o trazador en castellano. Consistıa enuna especie de regla hecha de un material flexible que se moldeaba para hacer coincidirel trazado por una serie de puntos. La curva ası trazada es fısicamente equivalente aresolver el problema de construir una curva que pase por una serie de puntos y queminimice la energıa elastica. La solucion matematica a este problema es un spline natural(polinomio cubico a trozos con derivada segunda nula en los extremos) lo que justifica sudenominacion.

Se pueden definir splines de mayor grado, siguiendo exactamente la idea anterior, estoes, 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) evalua una funcion polinomica a trozos. Unode sus argumentos es la propia estructura de la funcion segun una sintaxis propia deMatlab. La segunda instruccion devuelve una estructura de este tipo que contiene el splineque interpola a datos.

A modo de ejemplo, he aquı el spline natural que interpola a los datos desplegados enla Figura 11.714

>> 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 consplines mas generales en una toolbox. Al ejecutar splinetool podemos acceder a unentorno grafico 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{(x0, y0), (x1, y1), . . . , (xn, yn)

}construir una curva en parametricas

x(t) := (x(t), y(t)), t ∈ [0, T ] (11.12)

tal quex(tj) = (xj, yj). (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(tj) = xj, cy(tj) = yj.

14 Los splines siguen conservando cierta rigidez pero se adaptan mucho mejor a los datos.

257

Page 264: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador11.2 Extensiones adicionales LECCION 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 cubicos 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 lospuntos tj en (11.13). Una buena eleccion es tomar

hj :=√

(xj+1 − xj)2 + (yj+1 − yj)2,

que coincide con la longitud del segmento que une (xj, yj) y (xj+1, yj+1), y hacer luego

t0 = 0, tk := h0 + h1 + . . . + hk−1, T = tn.

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. Leebien la ayuda y modifica el programa anterior para que haga posible la lectura de los datoscon 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 hautilizado.

258

Page 265: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION 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 conjuntode puntos que marcan su recorrido, aunque estas curvas no pasan necesariamente portodos los puntos. Estos forman un polıgono de control en el siguiente sentido: la curvaesta contenida en el polıgono formado por esos puntos e imita con cierta libertad lapoligonal que dibujan.

La curva se construye utilizando los polinomios de Bernstein de orden n:

Bnj (t) =

(n

j

)tj(1− t)n−j, j = 0, 1, . . . , n.

Es un simple ejercicio comprobar que los polinomios cumplen las siguientes propiedades:

{Bnj }nj=0 son una base de Pn. Dicho de otra forma, cualquier polinomio se puede

escribir como una combinacion de estos polinomios.

259

Page 266: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador11.3 Curvas Bezier LECCION V

n∑j=0

Bnj (t) = 1, ∀t ∈ R.

A partir de unos puntos

xi = (xi, yi), con i = 0, . . . , n,

se construye ahora la curva de Bezier utilizando estos polinomios:

S(t) :=n∑

j=0

Bnj (t)xj =

( n∑j=0

Bnj (t)xj,

n∑j=0

Bnj (t)yj

), 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 final. Notese que los puntos utilizados para dibujar la curva estan ordenados: hayun punto inicial x0, uno final xn y a xj le sigue xj+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 porel primer y ultimo punto ya que S(0) = x0 y S(1) = xn pero en general S(t) 6= xj paraj 6= 0, n.

0 0.2 0.4 0.6 0.8 10

0.2

0.4

0.6

0.8

1

0 0.2 0.4 0.6 0.8 10

0.2

0.4

0.6

0.8

1

0 0.2 0.4 0.6 0.8 10

0.2

0.4

0.6

0.8

1

0 0.2 0.4 0.6 0.8 10

0.2

0.4

0.6

0.8

1

Figura 11.8: Curvas Bezier para algunas configuraciones de puntos.

260

Page 267: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorLECCION V Capıtulo 11. Interpolacion. Curvas Bezier

Ejercicio 11.16 Utilizando el codigo mostrado en el Ejercicio 11.15, programa las curvasBezier. Compara con las curvas que definen la interpolacion por splines y la polinomica.

Ejercicio 11.17 Implementa la siguiente extension del programa anterior: permitir que elusuario seleccione puntos y pueda moverlos o borrarlos (por ejemplo, con el boton derecho delraton) y ası comprobar la sensibilidad de la curva al polıgono de control.

Una sugerencia: una vez leıdos los puntos, y dibujada la correspondiente curva nos situamosde nuevo en la ventana grafica con ginput y leemos la seleccion hecha por el raton. Ahorahay 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 lacurva y esperamos de nuevo.

• Si pulsamos cerca de un punto con el boton izquierdo entendemos que vamos amover ese punto. Esperamos otra seleccion del raton (otro ginput), reemplazamosel punto seleccionado por el nuevo y redibujamos.

Si pulsamos lejos de todos los puntos, entendemos que anadimos un nuevo punto.Llamemoslo y. En este punto hay un tema no trivial: como ordenamos el nuevo puntoy respecto a los puntos anteriores {xj}.

y

xx j+1

j

θ

x j+2

j

Figura 11.9: Ordenacion de nodos para la curva Bezier.

Una forma de determinar15 este orden es medir el angulo entre los vectores

u = −−→xjy, v = −−−→xj+1y

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‖

.

15Gracias a Jon Garcıa por sugerirnos esta solucion.

261

Page 268: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador11.3 Curvas Bezier LECCION V

Escogeremos entonces j para que | cos(θj)| sea mınimo, y construiremos la curva Beziercon puntos

{x1, . . . ,xj,y,xj+1, . . . ,xn}

{xj,xj+1}.

Nota. Las curvas Bezier fueron introducidas por los ingenieros Pierre Bezier y Paulde Casteljau, que trabajaban entonces en Renault y Citroen. Concretamente, buscabanherramientas para el diseno de parachoques de forma que la curva que diera su formafuera controlada por una serie de puntos y que tuviera buenas propiedades geometric-as. Los algoritmos iniciales (todavıa se utilizan en la practica hoy en dıa) seguıan ideasmuy geometricas16, y se tardo algun tiempo en darle la forma que hemos mostrado, masmatematica. 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-splineson mas flexibles que las curvas Bezier y en su caso lımite incluyen a estas. Por lo tantopueden interpretarse como una generalizacion de las mismas.

Por otro lado existen formas mucho mas eficientes de evaluar y calcular este tipo decurvas que permiten en ultima media su implementacion en una forma mas interactiva,de forma que el usuario mueva los puntos (cambie el polıgono de control) y que la curvase redibuje constantemente. �

16La version original ni siquiera hablaba de polinomios.

262

Page 269: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorBibliografıa

[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] Garcıa de Jalon, J. (2004): Aprenda Matlab 6.5 como si estuviera en primero.Publicacion electronica, disponible enhttp://mat21.etsii.upm.es/ayudainf/aprendainf/varios.htm

[8] Gander, W. y Hrebıcek, J. (2004): Solving problems in Scientific Computing usingMaple and Matlab. Springer–Verlag.

[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), 35–65.

[11] Greenbaum, A. (1997): Iterative Methods for Linear Systems. SIAM.

[12] Hanmerlin, G. y Hoffmann, K.H. (1991): Numerical Mathematics. Springer–Verlag.

[13] Hanselman, D. y Littlefield, B.R. (2000): Mastering Matlab 6. Prentice Hall.

[14] Higham, D.J. y Higham, N.J. (2005): Matlab guide. SIAM.

[15] Hoffman, J., Johnson, C. y Logg, A. (2004): Dreams of Calculus. Springer.

[16] Infante, J.A. y Rey, J.M. (2002): Metodos numericos. Teorıa, problemas y practicascon 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 calculocientıfico. Addison–Wesley Iberoamericana.

Page 270: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador[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): Scientific 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 the20th 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] Suli, E. y Mayers, D. (2003): An Introduction to Numerical Analysis. CambridgeUniversity Press.

264

Page 271: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorIndice de figuras

2.1. Pantalla Principal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.2. Pantalla de ayuda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.3. Ayuda con helpwin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.4. Ayuda on line. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

4.1. Diagrama de un matriz sparse . . . . . . . . . . . . . . . . . . . . . . . . 64

5.1. Resultado de reordenar las filas y columnas con symrcm y symmmd. . . . . 735.2. Eliminacion gaussiana y su representacion como un grafo. . . . . . . . . . 755.3. Historial del residuo para el metodo del Gradiente. . . . . . . . . . . . . . 935.4. Historial del residuo para el metodo del Gradiente Conjugado . . . . . . . 985.5. Efecto del en el Gradiente Conjugado. . . . . . . . . . . . . . . . . . . . . 103

7.1. Reglas de cuadratura: punto medio y trapecio . . . . . . . . . . . . . . . 1167.2. Regla de Simpson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1197.3. Diagrama del metodo de Romberg . . . . . . . . . . . . . . . . . . . . . . 1287.4. Integracion adaptativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1307.5. Integracion adaptativa de

√x . . . . . . . . . . . . . . . . . . . . . . . . 133

7.6. Primeras exponenciales trigonometricas. . . . . . . . . . . . . . . . . . . . 1367.7. Coeficientes de Fourier y transformada discreta de Fourier . . . . . . . . . 1437.8. Ruido y su Transformada de Fourier Discreta . . . . . . . . . . . . . . . . 1447.9. Filtrado del ruido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

9.1. Profile aplicado al metodo de Jacobi. . . . . . . . . . . . . . . . . . . . 1849.2. Una web muy sencilla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

10.1. Ventana grafica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20810.2. Ventana grafica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21010.3. Edicion de un dibujo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21210.4. Una muestra de dibujos. . . . . . . . . . . . . . . . . . . . . . . . . . . . 21410.5. Modificacion del entorno del dibujo. . . . . . . . . . . . . . . . . . . . . . 21810.6. Ejemplo de numeracion con subplot. . . . . . . . . . . . . . . . . . . . . 21910.7. Disposicion simultanea de graficas con subplot. . . . . . . . . . . . . . . 22110.8. Un dibujo en 3D con plot3. . . . . . . . . . . . . . . . . . . . . . . . . . 22210.9. Icono para rotar los dibujos. . . . . . . . . . . . . . . . . . . . . . . . . . 22310.10. Ejemplo de una superficie creada con surf. . . . . . . . . . . . . . . . . . 22410.11. Otro ejemplo de surf. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225

265

Page 272: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador10.12. Utilizacion de nan en un dibujo. . . . . . . . . . . . . . . . . . . . . . . . 22610.13. Algunas opciones con surf. . . . . . . . . . . . . . . . . . . . . . . . . . 22810.14. Esferas en 3D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23010.15. Una superficie con surf y pcolor. . . . . . . . . . . . . . . . . . . . . . . 23110.16. Lıneas de nivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23210.17. Campo de velocidades con quiver . . . . . . . . . . . . . . . . . . . . . . 23310.18. Triangulacion no conforme. . . . . . . . . . . . . . . . . . . . . . . . . . . 23510.19. Numeracion de triangulos . . . . . . . . . . . . . . . . . . . . . . . . . . . 23610.20. Un dominio mallado en triangulos. . . . . . . . . . . . . . . . . . . . . . . 237

11.1. Dos formas de escribir y evaluar un polinomio. . . . . . . . . . . . . . . . 24011.2. Polinomios de interpolacion con diferentes grados y el error cometido. . . 24311.3. Estructura del calculo de las diferencias dividas. . . . . . . . . . . . . . . 24611.4. Ejemplo de Runge. Polinomio de interpolacion y error cometido. . . . . . 25011.5. Ejemplo de Runge con otros nodos. . . . . . . . . . . . . . . . . . . . . . 25111.6. Rigidez polinomica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25511.7. Interpolacion con splines cubicos naturales . . . . . . . . . . . . . . . . . 25811.8. Curvas Bezier para algunas configuraciones de puntos. . . . . . . . . . . . 26011.9. Ordenacion de nodos para la curva Bezier. . . . . . . . . . . . . . . . . . 261

266

Page 273: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorIndice 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. Definicion 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 ficticio . . . . . . . . . . . . 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

Page 274: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorII Programacion Avanzada. Metodos iterativos 51

4. Matlab: programacion avanzada 554.1. Retorno a las matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

4.1.1. Acceso a partes estructuradas de una matriz . . . . . . . . . . . . . 554.1.2. Mas operaciones sobre matrices . . . . . . . . . . . . . . . . . . . . 604.1.3. Matrices sparse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

4.2. Argumentos de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

5. Matrices sparse en Matematicas. Metodos iterativos 715.1. Metodo de Gauss para matrices sparse . . . . . . . . . . . . . . . . . . . . 715.2. Metodos iterativos para sistemas lineales . . . . . . . . . . . . . . . . . . . 76

5.2.1. Definicion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775.2.2. Detalles sobre la implementacion . . . . . . . . . . . . . . . . . . . 785.2.3. Metodos iterativos clasicos . . . . . . . . . . . . . . . . . . . . . . . 795.2.4. Metodos de tipo gradiente . . . . . . . . . . . . . . . . . . . . . . . 88

III Funciones como argumento. RecursividadFormulas de cuadratura. FFT 105

6. Matlab: Funciones como argumentos. Recursividad 1096.1. Funciones inline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1096.2. Funciones como argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . 111

6.2.1. Recursividad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

7. Formulas de cuadratura. FFT 1157.1. Formulas de cuadratura . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

7.1.1. Primeras nociones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1157.1.2. Reglas simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1187.1.3. Retorno a las reglas compuestas . . . . . . . . . . . . . . . . . . . . 1227.1.4. Reglas gaussianas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1257.1.5. Extrapolacion de Richardson . . . . . . . . . . . . . . . . . . . . . . 1267.1.6. Integracion adaptativa . . . . . . . . . . . . . . . . . . . . . . . . . 129

7.2. Transformada rapida de Fourier . . . . . . . . . . . . . . . . . . . . . . . . 1347.2.1. Transformada de Fourier discreta . . . . . . . . . . . . . . . . . . . 1357.2.2. Calculo de la transformada de Fourier Discreta . . . . . . . . . . . . 1407.2.3. Aplicaciones a la eliminacion de ruido . . . . . . . . . . . . . . . . . 1427.2.4. Transformada rapida de Fourier . . . . . . . . . . . . . . . . . . . . 144

IV Calculo simbolico, arrays y celdas en Matlab. Valores yvectores propios. Google. 153

8. Matlab: Calculo simbolico y estructuras de datos. 1578.1. Polinomios y calculo simbolico . . . . . . . . . . . . . . . . . . . . . . . . . 157

8.1.1. Polinomios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

268

Page 275: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador8.2. Procesador simbolico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1618.3. Tensores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1648.4. Vectores de celdas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

9. Calculo numerico de valores y vectores propios. 1719.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1719.2. Matrices semejantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1739.3. Metodo de potencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

9.3.1. Descripcion del metodo . . . . . . . . . . . . . . . . . . . . . . . . . 1749.3.2. Variantes del metodo de potencias . . . . . . . . . . . . . . . . . . . 178

9.4. Metodo de Jacobi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1799.4.1. Descripcion del metodo . . . . . . . . . . . . . . . . . . . . . . . . . 1799.4.2. Variantes del metodo de Jacobi . . . . . . . . . . . . . . . . . . . . 183

9.5. Metodo QR de Francis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1859.5.1. Factorizacion QR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1869.5.2. Metodo QR de Francis . . . . . . . . . . . . . . . . . . . . . . . . . 1929.5.3. Comentarios adicionales . . . . . . . . . . . . . . . . . . . . . . . . 193

9.6. Valores y vectores propios en Matlab . . . . . . . . . . . . . . . . . . . . . 1959.7. Notas historicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1969.8. Google . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

V Salidas graficas en Matlab. Interpolacion 203

10.Matlab: Salidas graficas en Matlab 20710.1. Dibujos bidimensionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207

10.1.1. El comando plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20710.1.2. Comandos asociados a plot . . . . . . . . . . . . . . . . . . . . . . 21310.1.3. Comandos get y set . . . . . . . . . . . . . . . . . . . . . . . . . . 21510.1.4. El comando subplot . . . . . . . . . . . . . . . . . . . . . . . . . . 21910.1.5. Otras salidas graficas . . . . . . . . . . . . . . . . . . . . . . . . . . 220

10.2. Graficas en 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22110.2.1. El comando plot3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 22110.2.2. El comando surf . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22310.2.3. Otros comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23110.2.4. Comandos faciles de usar . . . . . . . . . . . . . . . . . . . . . . . 233

10.3. Campos vectoriales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23310.4. Dibujos sobre dominios mallados en triangulos . . . . . . . . . . . . . . . . 234

11.Interpolacion. Curvas Bezier 23911.1. Interpolacion polinomica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

11.1.1. Interpolacion polinomica de Lagrange . . . . . . . . . . . . . . . . . 23911.1.2. Existencia del polinomio de interpolacion . . . . . . . . . . . . . . . 24011.1.3. Formula de Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . 24211.1.4. Analisis del error de interpolacion . . . . . . . . . . . . . . . . . . . 249

11.2. Extensiones adicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25211.2.1. Interpolacion de Hermite . . . . . . . . . . . . . . . . . . . . . . . . 252

269

Page 276: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

Borrador11.2.2. Interpolacion de funciones periodicas . . . . . . . . . . . . . . . . . 25411.2.3. Interpolacion polinomica a trozos . . . . . . . . . . . . . . . . . . . 255

11.3. Curvas Bezier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259

270

Page 277: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

BorradorIndice 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

Page 278: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

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

Page 279: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

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

Page 280: Matlab en cinco lecciones de Num´erico - Kalan · unos apuntes muy completos de libre divulgaci´on. ... Las aplicaciones de Matlab se fueron extendiendo a otras ramas del calculo

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