Libro matlabweb
Upcoming SlideShare
Loading in...5
×
 

Libro matlabweb

on

  • 563 views

 

Statistics

Views

Total Views
563
Views on SlideShare
563
Embed Views
0

Actions

Likes
0
Downloads
10
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Libro matlabweb Document Transcript

  • 1. Matlab en cinco lecciones de Num´rico e V´ ıctor Dom´ ınguez B´guena a Ma Luisa Rap´n Banzo u Febrero de 2006 Disponible en http://www.unavarra.es/personal/victor dominguez/
  • 2. r do rra Bo Prefacio El origen de este libro es una asignatura de libre elecci´n que uno de los autores imo parti´ durante los cursos 2004–2005 y 2005–2006 en la Universidad P´blica de Navarra. o u Nuestra intenci´n original era tratar temas algo avanzados de C´lculo Cient´ o a ıfico y utilizar Matlab como v´ para su aprendizaje. Los alumnos, obviamente, estaban m´s interesados ıa a en aprender Matlab y ve´ el Num´rico como forma de probar y ensayar las diferentes ıan e herramientas de Matlab que se iban exponiendo en clase. Desafortunadamente, la formaci´n en Num´rico de nuestros alumnos nos oblig´ a relajar considerablemente el contenido o e o matem´tico del curso y a ser m´s modestos, desde el punto de vista te´rico, en nuestros a a o objetivos. El resultado final en su vertiente matem´tica se podr´ enmarcar sin problemas a ıa en un curso introductorio de C´lculo Num´rico. En cuanto a Matlab, creemos que hemos a e tratado todos sus aspectos fundamentales aunque en ocasiones sea de forma superficial. Nuestro objetivo era conseguir no tanto un conocimiento muy profundo de Matlab como el de colocar al alumno en una buena posici´n de arranque para un autoaprendizaje. o El enfoque y los temas tratados son consecuencia de diversos factores entre los que conviene citar nuestro propio bagaje matem´tico1 , el uso que hemos tenido que hacer de a Matlab en nuestra carrera investigadora y, como ya hemos mencionado, los conocimientos de partida que ten´ nuestros propios alumnos. Hemos insistido bastante en la manipıan ´ ulaci´n de vectores y matrices y a la programaci´n en forma vectorizada. Esta es una o o de las diferencias m´s acusadas con los lenguajes de programaci´n tradicionales y una a o implementaci´n eficiente en Matlab pasa necesariamente por la vectorizaci´n. o o Los apuntes est´n organizados en torno a temas o lecciones, cada cual dividido en dos a partes, la primera de Matlab y la segunda con un tema espec´ ıfico de C´lculo Num´rico. a e En la primera parte se presentan los aspectos instrumentales de Matlab que utilizaremos en la implementaci´n de los algoritmos de la parte de Num´rico. La longitud de cada o e parte es variable, y dependiente de la dificultad tratada ya sea en la parte instrumental (Matlab) o en la parte matem´tica. De tanto en tanto nos hemos permitido hacer algo de a Matem´ticas tratando de presentarlas en la forma m´s simple posible. a a A lo largo de estas p´ginas el lector podr´ encontrar ejercicios, algunos de ellos resuela a tos, que tratan de ahondar en puntos espec´ ıficos, matem´ticos e inform´ticos. Finalmente a a se han introducido algunas notas hist´ricas que describen brevemente la evoluci´n que han o o tenido las ideas a lo largo del tiempo. Con ello tratamos de combatir la idea gaussiana, demasiado extendida, de las Matem´ticas como un mundo est´tico, monol´ a a ıtico y perfecto donde la teor´ se presenta cerrada y completa. Las Matem´ticas en general y el C´lculo ıa a a Cient´ ıfico en particular recorren un largo trecho antes de llegar a este estado, durante el cual brotan ideas constantemente, siempre prometedoras en un primer momento, que 1 modelado por nuestra formaci´n cient´ o ıfica, com´n en muchos aspectos. u i
  • 3. r do rra Bo evolucionan con los a˜os, con muchas de ellas desechadas finalmente e incluso algunas n rescatadas a˜os despu´s de considerarse como v´ muertas. n e ıas Hemos adjuntado al final una bibliograf´ utilizada en este texto. Nos gustar´ resaltar ıa ıa tres textos sobre los dem´s. En primer lugar, Numerical Computing with Matlab, de Cleve a Moler, que descubrimos cuando and´bamos en la redacci´n de la Lecci´n II. Su sencillez a o o y la buena elecci´n de ejemplos ha ejercido una influencia considerable en estas notas. o El segundo libro es ya un cl´sico entre los que aprendimos Matlab hace algunos a˜os. a n And´bamos entonces en la b´squeda de recursos en la web cuando nos encontramos con a u unos apuntes muy completos de libre divulgaci´n. Nos referimos al libro de Garc´ de o ıa Jal´n y sus colaboradores, Aprenda Matlab ?.? como si estuviera en primero. Diferentes o versiones de estos apuntes llevan cubriendo de forma incansable la evoluci´n de Matlab o desde la versi´n 4.0. o 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 redacci´n de o este texto. Debemos se˜alar que estas informaciones han sido debidamente contrastadas. n A pesar de algunos problemas iniciales, es seguro que la influencia de esta enciclopedia libre crecer´ exponencialmente en el futuro. a Finalmente, queremos dejar patente nuestro agradecimiento al Profesor Javier Sayas que se ofreci´ muy generosamente a revisar este libro. Sus numerosas y acertadas indicao ciones y sugerencias han contribuido, y mucho, en la redacci´n final de este texto. o Pamplona, Febrero de 2006 2 V´ ıctor Dom´ ınguez B´guena a a u M Luisa Rap´n Banzo http://www.wikipedia.org ii
  • 4. r do rra Bo A Javier Amigo y maestro.
  • 5. r do rra Bo
  • 6. r do rra Bo Cap´ ıtulo 1 Introducci´n o ... and the first lesson of all was the basic trust that he could learn. It is shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult. Dune Frank Herbert 1.1. ¿Qu´ es? e Matlab es un entorno de trabajo para el c´lculo cient´ a ıfico. Programado originalmente por Cleve Moler a finales de los a˜os 70, su finalidad original era proporcionar una forma n sencilla de acceder a las librer´ LINPACK y EISPACK donde est´n implementadas de una ıas a forma altamente eficiente los algoritmos clave del an´lisis matricial1 . De hecho, Matlab es a una abreviatura de Matrix Laboratory Su primera implementaci´n se hizo en Fortran que era, y en buena medida a´n sigue o u si´ndolo, el lenguaje est´ndar en la implementaci´n de m´todos num´ricos2 . Posteriore a o e e mente se reimplement´ en C, que es como se encuentra en la actualidad. o Las aplicaciones de Matlab se fueron extendiendo a otras ramas del c´lculo cient´ a ıfico y de las ciencias aplicadas en general, dot´ndole de una gran popularidad en ambientes a cient´ ıficos (especialmente en Ingenier´ Dichas extensiones se consiguieron en gran parte ıa). mediante la implementaci´n de toolboxes, librer´ escritas en el lenguaje de programaci´n o ıas o propio de Matlab y que ampliaban el rango de problemas que pod´ resolverse. ıan Sin miedo a equivocarse, se pueden enunciar las siguientes ´reas donde Matlab muestra a un gran potencial: a ´lgebra lineal num´rica; e procesamiento de se˜ales (an´lisis, compresi´n de datos,..); n a o 1 por ejemplo, el m´todo de Gauss, el c´lculo de las descomposiciones m´s habituales del ´lgebra e a a a matricial num´rica (LU , LL , QR), m´todos iterativos,... e e 2 Fortran significa Formula translation. Desarrollado por IBM en 1954, es considerado como el primer lenguaje de alto nivel. Las ultimas actualizaciones (Fortran 95 y Fortran 2003) han dado nuevo vigor a ´ este veterano lenguaje de programaci´n. o 1
  • 7. dise˜o de sistemas de control; n salidas gr´ficas; a estad´ ıstica; r do rra Bo simulaci´n de sistemas din´micos. o a La extensa gama de problemas que cubre hace de Matlab un lenguaje dif´ de entender ıcil y manejar en su completitud. Esto no quiere decir que sea inarbodable: el conocimiento base que permite empezar a trabajar es muy sencillo. No obstante el elevado n´mero de u 3 comandos que se encuentra a disposici´n del usuario provoca que en ocasiones existan o problemas no s´lo para encontrar los comandos adecuados sino tambi´n para tener una o e idea de qu´ posibilidades exactamente ofrece Matlab en un problema o tarea en particular. e 1.2. ¿C´mo trabaja? o El lenguaje de programaci´n de Matlab es bastante m´s flexible que el de los lenguajes o a tradicionales. No es preciso la declaraci´n inicial de variables, ´stas se pueden introducir o e en el momento que se necesiten, y por ejemplo, vectores y matrices pueden declararse sin especificar sus dimensiones e incluso cambiar sus tama˜os sobre la marcha. Ello pern mite una programaci´n algo m´s desordenada, aunque debe tenerse bien claro que una o a programaci´n cl´sica, m´s al uso, suele generar c´digo m´s eficiente. o a a o a Por otro lado, una gran cantidad de m´todos num´ricos se encuentran implementados e e de una forma muy eficiente y son accesibles como simples comandos. De esta forma, Matlab se puede utilizar como una caja negra: el usuario pregunta y el ordenador responde sin que ´ste tenga que preocuparse de qu´ tipo de operaciones se han efectuado por el camino. e e De todas formas es conveniente tener una idea de qu´ m´todos se est´n utilizando para e e a as´ ser conscientes de en qu´ condiciones van a funcionar, cu´l es en cada caso el m´toı e a e do adecuado, y especialmente el significado de los, posiblemente, numerosos argumentos opcionales que controlan el funcionamiento del algoritmo. A priori se pueden distinguir dos tipos de funciones en Matlab: funciones compiladas (Built in functions) y funciones no compiladas. Las primeras est´n optimizadas, son proa gramas ya compilados y con el c´digo no accesible para el usuario. Como ejemplos se o pueden citar operaciones fundamentales +, *,. . . . las funciones matem´ticas b´sicas (sin, cos, exp, log,. . . ) a a ´ algoritmos b´sicos del Algebra Lineal (inv, det, lu, chol, qr,...) a s´lidas gr´ficas (plot, surf,...) a a 3 A modo de ejemplo, estos comandos cubren salidas gr´ficas: plot, line, ezplot, ezsurf, surf, a surfc, line, patch, plot3, contour, contourf, ezcontour, pcolor, trimesh, trisurf,... 2
  • 8. r do rra Bo Las funciones no compiladas est´n escritas siguiendo el lenguaje de programaci´n a o propio de Matlab. Estos comandos se guardan en ficheros *.m que es la extensi´n est´ndar o a de los ficheros de Matlab4 . Originalmente, Matlab funcionaba como un interprete. Es decir, cada l´ ınea de c´digo o era traducido antes de su ejecuci´n. Ello hac´ que una programaci´n similar a lenguajes o ıa o cl´sicos de programaci´n diera lugar a c´digo poco eficiente. a o o Este problema se puede subsanar en gran medida recurriendo a la programaci´n veco torizada. El siguiente ejemplo muestra las diferencias con una programaci´n est´ndar o a No vectorizada Vectorizada y=zeros(1,1000); h=2*pi/999; for i=0:999 y(i+1)=sin(h*i); end y=sin(linspace(0,2*pi,1000)); En la primera parte del c´digo, encontramos una estructura t´ o ıpica en los lenguajes de programaci´n: el comando for. Su significado es claro: las l´ o ıneas comprendidas entre el for y end se repiten 1000 veces con la variable i tomando valores de 0 a 999. El resultado final es el vector fila y que recoge el valor del seno en 1000 puntos uniformemente espaciados en [0, 2π]. Por otro lado, el comando linspace devuelve un array que contiene 1000 puntos equidistantes entre 0 y 2π. La funci´n seno es aplicada sobre todo el array devolviendo o un vector con estos valores que se guarda en y. La diferencia entre ambas formas de programar es ahora patente. Mientras que en la primera realizamos 1000 llamadas a la funci´n seno con un argumento por llamada, en la segunda hay una unica llamada donde o ´ se requiere el c´lculo del seno en 1000 puntos, y el resultado se devuelve en un vector con a estos valores (y por tanto tambi´n de longitud 1000). e Desde el punto de vista de Matlab el segundo c´digo es m´s eficiente. Habitualmente, o a la vectorizaci´n lleva consigo una reducci´n del c´digo a la vez que se incrementan las o o o necesidades de memoria. Con Matlab 6.5 se inici´ un proyecto a m´s largo plazo consistente en la aceleraci´n o a o (Performance Acceleration) de las versiones no vectorizadas dirigida a estrechar las diferencias con los lenguajes cl´sicos de alto nivel como Fortran, C o Pascal5 . En cualquier caso, a la posibilidad de ejecutar instrucciones en bloque sobre vectores o matrices, en contraste con operaciones elemento a elemento como en los lenguajes tradicionales, es algo que conviene explotar por las importantes ventajas que proporciona. 4 Tambi´n est´ la extensi´n *.mat, propia de ficheros de datos. e a o De hecho en la version 6.5 apenas hay diferencias en tiempo de ejecuci´n entre los dos c´digos o o expuestos. 5 3
  • 9. 1.3. ¿C´mo aprenderemos? o r do rra Bo Como ya hemos se˜alado anteriormente, aprender a manejar Matlab en su totalidad n est´ fuera de los contenidos de un curso introductorio como ´ste. No as´ aprender los a e ı fundamentos y preparar el terreno para un autoaprendizaje de las partes en las que cada uno est´ interesado. Encontramos en este punto dos dificultades que salvar: saber de la e existencia del comando adecuado y aprender a utilizarlo. En no pocas ocasiones, la primera es la mayor dificultad. No obstante los comandos llevan siempre nombres nemot´cnicos e para facilitar su memorizaci´n. Las funciones de ayuda tambi´n echan una mano. o e Como a programar se aprende programando, comenzaremos escribiendo c´digo desde o los primeros pasos. Los esquemas num´ricos que implementaremos se encuentran pr´ctie a camente en cualquier curso introductorio de An´lisis Num´rico. En cada lecci´n implea e o mentaremos dichos algoritmos, introduciendo ´rdenes, estructuras de decisi´n, datos,... o o seg´n sea necesario. u En los apuntes se incluyen m´ltiples ejercicios cuya realizaci´n ayudar´ al aprendizaje u o a de la asignatura. Estos apuntes no deben tomarse como un manual en el estilo usual, sino como una forma de aprender Matlab y repasar o aprender el An´lisis Num´rico b´sico. a e a Ya existen manuales extensos y concienzudos, en la bibliograf´ citamos algunos de ellos, ıa que pueden servir para ese fin. 4
  • 10. r do rra Bo Lecci´n I o Primeros pasos en Matlab. M´todos directos para sistemas de ecuaciones e lineales 5
  • 11. r do rra Bo
  • 12. r do rra Bo Introducci´n o When asked whether a programming language supports matrices, many people will think of two-dimensional arrays and respond, “Yes.” Yet matrices are more than two-dimensional arrays -they are arrays with operations. It is the operations that cause matrices to feature so prominently in science and engineering G.W. Stewart, Matrix Algorithms Comenzaremos en la primera parte de esta lecci´n tratando nociones b´sicas de Matlab, o a introduciendo el entorno de trabajo y las estructuras b´sicas de programaci´n. En segundo a o lugar entraremos en uno de los detalles fuertes de Matlab, la manipulaci´n de vectores y o matrices. En la parte matem´tica estudiaremos m´todos directos para la resoluci´n de sisa e o temas de ecuaciones lineales. En la implementaci´n de estos algoritmos repasaremos los o conocimientos de Matlab expuestos en la primera parte. 7
  • 13. r do rra Bo
  • 14. r do rra Bo Cap´ ıtulo 2 Matlab: Primeros pasos 2.1. Entorno de trabajo En las primeras secciones comenzaremos explorando Matlab de la forma m´s simple, en a modo comando: el usuario pregunta y Matlab responde. El interfaz de Matlab es bastante pobre, con un aspecto est´tico que en modo alguno es comparable al de programas como e Maple o Mathematica. El modo interactivo de trabajar es sencillo aunque algo inc´modo. A o modo de ejemplo, requiere algo de esfuerzo editar instrucciones ejecutadas con anterioridad ´ y manejarse con bloques de comandos es muy engorroso. Este y otros problemas del modo interactivo se subsanan en gran medida empaquetando instrucciones con ficheros script y/o programando en funciones (subrutinas) que es la forma natural de trabajar en Matlab. En un segundo paso, se puede implementar un interfaz gr´fica, las guides de Matlab, que a hacen m´s amigable la comunicaci´n con el usuario. a o En la Figura 2.1 podemos ver el aspecto inicial de Matlab. Distinguimos las siguientes ventanas Command window: ventana donde podemos ejecutar los comandos; Ventanas auxiliares: command history, workspace, current directory que informan sobre (y permiten editar) los comandos insertados, las variables declaradas y el directorio en el que estamos trabajando. Ventana de ayuda: en una ventana independiente proporciona un acceso completo a las funciones de ayuda de Matlab, incluyendo b´squedas, demostraciones, etc. u ´ Estas son las caracter´ ısticas b´sicas que debemos considerar: a El prompt de Matlab es >>. El usuario escribe a continuaci´n. o 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 may´sculas y min´sculas. u u 9
  • 15. ´ LECCION I 2.1 Entorno de trabajo r do rra Bo Figura 2.1: Pantalla Principal. Todos los comandos de Matlab se escriben en min´sculas y los argumentos se env´ u ıan entre par´ntesis separados por comas. e El car´cter % se utiliza para insertar comentarios. Todo lo que sigue (en la misma a l´ ınea) es ignorado por Matlab. Si se teclea al final de una instrucci´n ’;’ ´sta se ejecuta pero el resultado no se o e visualiza por pantalla. Dos comandos se pueden insertar en la misma l´ ınea separados por “,” o por “;”. La diferencia entre los dos es que con “,” se muestran los resultados de las operaciones mientras que con “;” la operaci´n se ejecuta pero no se visualiza. o 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
  • 16. ´ LECCION I Cap´ ıtulo 2. Matlab: Primeros pasos y observa la salida. Haremos algunos comentarios sobre el ejercicio anterior. El circunflejo ^ es la potenciaci´n: o >> 3^5 r do rra Bo ans= 243 El t´rmino ans es la primera variable que vemos de Matlab. Concretamente, guarda la e ultima salida dada por Matlab (answer): ´ >> 4+6 ans = 10 >> ans*2 ans = 20 >> ans*2 ans = 40 La ra´ cuadrada se puede calcular bien elevando a 1/2 (^(1/2)) o bien utilizando sqrt. ız Ejercicio 2.2 Comprueba la diferencia entre 4/4+6 4/(4+6) 3^5*2 3^(5*2) Nota. La prioridad de ejecuci´n entre operaciones matem´ticas es la habitual: primero o a se calcula la potenciaci´n ^, posteriormente los productos y divisiones *, / y en ultimo o ´ lugar, las sumas y restas + y -. Este orden se puede cambiar utilizando los par´ntesis. e La regla es sencilla: dada una expresi´n, lo primero que se calcula es lo que est´ dentro o a de cada par´ntesis. Esta regla es recursiva, es decir, si dentro de un par´ntesis hay otros e e par´ntesis, para evaluar el primero se empezar´ con los par´ntesis interiores. e a e Los n´meros reales se pueden insertar tambi´n en notaci´n cient´ u e o ıfica, muy adecuada si se trata de n´meros grandes o muy peque˜os (en valor absoluto). As´ se tiene la siguiente u n ı, regla de construcci´n: o m · 10r m er 11
  • 17. ´ LECCION I 2.1 Entorno de trabajo Por ejemplo 0.005 −1201200000 115 · 1012 0.00031415 5e − 3 −1.2012e009 115e12 3.1415e − 004 r do rra Bo Existen adem´s dos n´meros especiales: inf y NaN. El primer signo representa la cana u tidad infinita (∞). El segundo es una abreviatura de “no es un n´mero” (Not a Number) u y es el resultado que se devuelve ante una operaci´n indefinida como 0/0. Este s´ o ımbolo se puede utilizar en ´mbitos, en principio tan extra˜os, como en el dibujo de superficies a n (v´r la Lecci´n V). e o En general los resultados num´ricos se presentan con cuatro cifras decimales correctas, e aunque todas las operaciones se ejecutan en doble precisi´n1 . Si se desean las salidas con o toda la precisi´n disponible se debe insertar la instrucci´n o o >> format long A partir de este punto, el resultado de cualquier operaci´n se mostrar´ con 16 cifras o a significativas. La instrucci´n o >> format short devuelve a la forma est´ndar con cuatro cifras decimales. Existen m´s opciones con format. a a Las siguiente l´ ıneas muestran algunas de ellas: >> pi % el numero pi ans = 3.1416 >> format long >> pi % mayor precision ans = 3.14159265358979 >> format compact % compacto >> pi ans = 3.14159265358979 >> format bank %No fijo de cifras decimales >> pi ans = 3.14 1 Aproximadamente 16 cifras decimales correctas. En el momento de redactar estas l´ ıneas, los procesadores de 32 bits dominan todav´ el parqu´ de ordenadores. Las nuevas generaciones, con procesadores ıa e con 64 bits, duplican la precisi´n de trabajo. o 12
  • 18. ´ LECCION I %salidas en forma fraccionaria % mas espaciada r do rra Bo >> format rat >> pi ans = 355/113 >> format loose >> pi Cap´ ıtulo 2. Matlab: Primeros pasos ans = 355/113 Observa la diferencia de espaciamiento que se obtiene con las opciones compact y loose. N´ meros complejos u La √ aritm´tica compleja se encuentra tambi´n integrada en Matlab. La unidad imagie e o naria ( −1) se representa en Matlab con i ´ 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 Matem´ticas mientras que en diversas ramas de la F´ a ısica y en Ingenier´ de Telecomunicaciones o El´ctrica se prefiere el s´ ıa e ımbolo j (en este caso para no confundir con la intensidad de corriente el´ctrica). De ah´ que Matlab permita e ı ambas representaciones. Todas las operaciones matem´ticas incluyen la aritm´tica compleja en el sentido usual a e >> 1+i +5-6i % suma de dos numeros complejos ans = 6.0000 - 5.0000i >> (5+3i)*(5-3i), (1+2i)/(3-4i) ans = 13
  • 19. ´ LECCION I 2.2 Comandos de ayuda 34.00 ans = r do rra Bo -0.20 + >> conj(3e-3+2e-4i) % conjugado ans = 0.0030 - 0.0002i >> abs(3+4i), angle(2i) % modulo y argumento ans = 5 ans = 1.5708 2.2. Comandos de ayuda La ayuda de Matlab es ciertamente muy clara y completa. Los comandos siempre dispuestos a echarnos una mano son: help: muestra una ayuda por pantalla, en la ventana de comandos, con la informaci´n esencial sobre un comando concreto. o helpwin: similar a help pero despliega la ayuda en una ventana auxiliar, permitiendo as´ una navegaci´n, estilo web, muy c´moda. ı o o lookfor: permite buscar una cadena en la primera l´ ınea de todos los ficheros de ayuda. Por ejemplo, si deseamos ayuda sobre la funci´n sin, podemos ejecutar o >> help sin SIN Sine. SIN(X) is the sine of the elements of X. Overloaded methods help sym/sin.m 14
  • 20. ´ LECCION I Cap´ ıtulo 2. Matlab: Primeros pasos r do rra Bo Figura 2.2: Pantalla de ayuda. o bien >> helpwin sin y obtener la pantalla que se muestra en la Figura 2.3. Adem´s, si aparece el enlace “Go to a online doc for ...”, ´ste nos permite navegar entre una ayuda mucho m´s completa e a donde se muestran ejemplos y detalles sobre la implementaci´n del comando (ver la Figura o 2 2.4 ). Ejercicio 2.3 Utilizando las funciones de ayuda, obtener informaci´n de alguna de estas o funciones elementales de Matem´ticas a sin sec sinh exp cos csc cosh log tan cot tanh log10 asin asec asinh log2 acos acsc acosh sign atan acot atanh Mediante la instrucci´n o 2 Para que esta opci´n est´ disponible es necesario que se haya instalado la ayuda completa de Matlab. o e A partir de la versi´n 6.0 la instalaci´n consta de (al menos) dos CDs, el primero con el programa y las o o librer´ habituales y el segundo con la documentaci´n de la ayuda. ıas o 15
  • 21. ´ LECCION I 2.3 Variables r do rra Bo Figura 2.3: Ayuda con helpwin. Comprueba si aparece la opci´n Go to online doc... o >> help + se pueden adem´s visualizar las operaciones “elementales” seg´n Matlab. a u 2.3. Variables Matlab no necesita la declaraci´n de variables como en un lenguaje tradicional. En prino 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
  • 22. ´ LECCION I Cap´ ıtulo 2. Matlab: Primeros pasos r do rra Bo Figura 2.4: Ayuda on line. 6 El comando who sirve para conocer los nombres de las variables declaradas, mientras que con whos obtenemos una informaci´n m´s precisa: o a >> who Your variables are: a b c >> whos a Name Size a Bytes 1x1 8 Class double array Grand total is 1 element using 8 bytes Para borrar una variable se utiliza la instrucci´n clear, por ejemplo, o 17
  • 23. ´ LECCION I 2.3 Variables >> a=4; >> whos a Size a Bytes 1x1 Class 8 double array r do rra Bo Name 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´ como ıa funci´n seno. Para recuperar el valor original basta ejecutar o >> clear sin Almacenamiento de variables en ficheros Matlab ofrece la posibilidad de grabar las variables que deseemos en un fichero. De esta forma, podemos recuperarlas m´s adelante, ya sea en la misma sesi´n o en otra diferente3 . a o 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 variables indicadas. Para recuperar, basta ejecutar >> load datos 3 Se entiende por sesi´n el tiempo que transcurre entre que se abre y se cierra Matlab. Al cerrar el o programa, todas las variables locales se pierden. 18
  • 24. ´ LECCION I 2.4. Cap´ ıtulo 2. Matlab: Primeros pasos Ficheros script y funciones La forma m´s eficiente de empaquetar series de instrucciones simples y mec´nicas es a a utilizando ficheros script. Tareas m´s elaboradas, con, por ejemplo, variables de entrada a y salida, requieren del uso de funciones. r do rra Bo 2.4.1. Ficheros script Un fichero script es un simple documento de texto que contiene una sucesi´n de coo mandos de Matlab. Esencialmente es equivalente a teclear estas instrucciones directamente en la ventana de comandos. Describiremos el manejo de este tipo de ficheros mediante un sencillo ejemplo. Comenzamos 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”es ı la extensi´n est´ndar de Matlab). Es importante saber cu´l es el directorio de trabajo5 , o a a pues es donde se guardar´ por defecto el fichero. a Tecleamos ahora en el editor a=1+i; b=1-i; disp(’a*b=’) disp(a*b) disp(’a/b=’) disp(a/b) disp(’sqrt(a)=’) disp(sqrt(a)) El comando disp (de display) muestra vectores por pantalla de forma compacta. Dado que para Matlab un cadena de caracteres es simplemente un vector de car´cteres, se consigue a con ello mostrar por pantalla mensajes de forma concisa. Una vez que el documento est´ grabado, para ejecutar las ´rdenes que contiene basta a o teclear el nombre del fichero en la ventana de comandos: >> prueba Se puede modificar las veces que se precise las variables a y b en el fichero script sin tener que teclear de nuevo todas las instrucciones. 2.4.2. Funciones En principio existen dos tipos de funciones: las funciones inline, que se insertan en la l´ ınea de comandos y las que se escriben en un documento de texto externo. Esta ultima ´ forma, que es la evoluci´n natural de los ficheros script, es m´s flexible y es en la que nos o a centraremos a continuaci´n. Dejaremos pendiente para la Lecci´n III la descripci´n de las o o o funciones inline. Como antes, para crear un fichero que contenga a una funci´n se puede teclear: o 4 5 Tambi´n es posible crear este fichero a golpe de rat´n. e o Por defecto es C:MATLAB6p5work. 19
  • 25. ´ LECCION I 2.4 Ficheros script y funciones >> edit mifuncion En el editor puedes insertar este simple ejemplo: % MIFUNCION % % Y=MIFUNCION(X) devuelve % % Y=X^2-COS(X) % function y=mifuncion(x) r do rra Bo 01 02 03 04 05 06 07 08 09 10 11 y=x^2-cos(x); return La funci´n se declara con function, la variable de entrada es x y se declara como variable o de salida y. Se termina la ejecuci´n de la funci´n cuando se ejecuta un return o bien se o o llega al final de la funci´n6 . o Ahora, para calcular el valor de π 2 − cos(π) podemos ejecutar la orden: >> mifuncion(pi) ans = 10.8696 Nota. Los n´meros correlativos situados a la izquierda no forman parte del c´digo u o de la funci´n. Han sido insertados con el fin de numerar las l´ o ıneas y as´ facilitar los ı comentarios que podamos hacer sobre el programa. Una funci´n puede no tener salidas, por ejemplo, o 01 02 03 04 05 06 07 08 09 10 11 12 13 14 % INFORMACION % % INFORMACION devuelve informacion sobre % la precision de la maquina % function informacion disp(’precision de la maquina’) disp(eps) disp (’mayor numero real’) disp(realmax) disp (’menor numero real’) disp(realmin) return 6 En este sentido, el return del ejemplo anterior es superfluo. 20
  • 26. ´ LECCION I Cap´ ıtulo 2. Matlab: Primeros pasos o bien devolver m´ltiples salidas: u % MIFUNCION2 % % [Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve % % Y1=X1+X2+X3; % Y2=X1-X2+X3; % function [y1,y2]= mifuncion2(x1,x2,x3) r do rra Bo 01 02 03 04 05 06 07 08 09 10 11 12 13 y1=x1+x2+x3; y2=x1-x2+x3; return Observa c´mo se recogen los resultados o >> [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 pre´mbulo de las funciones, es decir las l´ a ıneas anteriores a la declaraci´n de la funci´n y precedidas con “%”, constituyen la ayuda de la o o funci´n: o >> help mifuncion2 MIFUNCION2 [Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve Y1=X1+X2+X3; Y2=X1-X2+X3; 21
  • 27. ´ LECCION I 2.5 Vectores y matrices Aunque muy recomendables7 , su inclusi´n en una funci´n es opcional. La ayuda puede o o estar antes o despu´s de la declaraci´n de la funci´n. En cualquiera de los dos casos, e o o Matlab despliega como ayuda todas las l´ ıneas que esten precedidas con % hasta que se encuentra con la primera l´ ınea no comentada. r do rra Bo Nota. Para ser consecuentes, lo correcto es denominar de igual modo a la funci´n y o al archivo que la contiene. Sin embargo esto no es obligatorio, es decir, se pueden dar nombres distintos, pero en este caso Matlab da preferencia al nombre del archivo. Aunque Matlab distingue entre may´sculas y min´sculas en sus comandos, esto no es u u extensible para funciones programadas en m-files, al menos en Windows. Es decir, para ejecutar una funci´n en un archivo, digamos, operaciones, se puede utilizar OPERACIONES, o Operaciones y cualquier combinaci´n con may´sculas y min´sculas. Esto es debido a que o u u a el sistema de archivos de Windows tampoco hace esa distinci´n8 . Versiones m´s avanzadas o de Matlab, 7.0 en adelante, muestran sin embargo un aviso si no existe una concordancia exacta min´sculas-may´sculas entre el nombre del fichero y el comando utilizado para u u llamarlo. Todas las variables se env´ por valor, no por referencia. Es decir, si una funci´n ıan o modifica una variable de entrada, esta modificaci´n se pierde cuando finalice su ejecuci´n, o o recuperando el valor original. Por ultimo, en un fichero se pueden incluir varias funciones. En este caso s´lo la primera ´ o funci´n es accesible desde el exterior (l´ o ınea de comandos, otras funciones,...) mientras que el resto de funciones presentes en ese fichero son internas, es decir, utilizables unicamente ´ por las funciones presentes en el archivo. Esto es importante a la hora de realizar una programaci´n modular. Si un conjunto de funciones son s´lo utilizadas por una funci´n o o o principal, se pueden insertar en el mismo fichero que ´sta. Evitamos as´ llenar la carpeta e ı de trabajo, o de nuestro proyecto, con ficheros y m´s ficheros. a 2.5. Vectores y matrices Dado que principalmente trabajaremos s´lo con arrays de una y dos dimensiones o hablaremos en lo que sigue de los objetos matem´ticos correspondientes: vectores y maa trices. Todo lo que sigue se puede adaptar a arrays con m´s dimensiones, aunque por a simplificar, nos centraremos ahora en el manejo de vectores y matrices y dejaremos pendiente para la Lecci´n IV el uso de arrays multidimensionales (tensores). o 2.5.1. Definici´n de matrices y vectores o Un vector o una matriz se puede definir dando sus elementos entre corchetes y separando filas mediante “;”. Por ejemplo, las instrucciones 7 No hay que subestimar nunca la capacidad de olvido de uno mismo: el c´digo claro y legible de hoy o es ilegible semanas despu´s. Las ayudas facilitan la edici´n de los programas no s´lo para un usuario e o o externo sino para el propio programador. 8 Es decir, si existe un fichero llamado operaciones.m no es posible crear otro con nombre Operaciones.m 22
  • 28. ´ LECCION 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]; matrices y vectores    3 −1 1 2 4 3 4  , a2 =  −1 0 1  , 5 1 2 1 5   1 b =  3 , 1 r do rra Bo definen las  1  2 a= 4 b2 = −1 1 −2 2 . Matlab distingue entre vectores fila y columna por lo que habr´ que tenerlo en cuenta por a ejemplo cuando se desee hacer operaciones como sumas o productos. Desde una vertiente pr´ctica, si se va a trabajar con una matriz grande, por ejemplo a de tama˜o 20 × 10, y sus valores se van a introducir m´s adelante, se puede empezar con n a >> a=zeros(20,10); A partir de este instante se pueden insertar los elementos, accediendo a cada posici´n o mediante par´ntesis e >> 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 posici´n no definida de la o a u matriz, Matlab ir´ adaptando el tama˜o seg´n juzgue apropiado9 , y no dar´ ning´ n a n u error. El siguiente ejemplo ilustra esta caracter´ ıstica >> clear c % c esta borrado >> c(1,2)=4 % c es ahora 1 x 2 c = 0 >> c(3,3)=2 4 % c pasa a ser 3 x 3 c = 0 0 0 4 0 0 0 0 2 Esta habilidad, aunque permite una programaci´n muy flexible y descuidada, debe utio lizarse con mesura dado que puede provocar errores de ejecuci´n muy dif´ o ıciles de detectar. 9 Ello obliga a que haya que redimensionar constantemente la memoria otorgada a la variable a. Esto supone un costo adicional, inapreciable con ejemplos peque˜os, pero importante para grandes cantidades n de memoria. Por tanto es mejor declarar primero las dimensiones de la matriz e informar as´ a Matlab de ı cu´nta memoria tiene que reservar. a 23
  • 29. ´ LECCION I 2.5 Vectores y matrices 2.5.2. Operaciones Todas las operaciones habituales entre matrices, tales como la suma, producto, potenciaci´n, c´lculo de determinantes, inversas..., est´n ya implementadas en Matlab. No hay o a a por tanto necesidad de programarse estas tareas. Por ejemplo, si a y a2 son matrices de tama˜os compatibles, las instrucciones n r do rra Bo a*a2 a^2 a+a2 devuelven el producto matricial de a y a2, el cuadrado de a (es decir, a*a) y la suma de a y a2. Es importante observar la diferencia con estas l´ ıneas a.*a2 a.^2 En el primer caso, se devuelve la matriz resultado de multiplicar elemento a elemento a y a2 (por tanto deben tener el mismo tama˜o) y en el segundo, una matriz cuyas n entradas son el cuadrado de las de a. Esto es una constante en Matlab: el signo “.” indica que la operaci´n (un producto, una potencia o una divisi´n) se hace elemento a o o elemento, mientras que en caso contrario se calcula la operaci´n matem´tica, en este o a caso el producto matricial. Ejercicio 2.4 Introduce en a y a2 dos matrices de igual tama˜o. Observa el resultado de n ejecutar a+a2 a*a2 a.*a2 Define un vector b fila o columna y ejecuta b.^3 b’ Comprueba si estas operaciones est´n bien definidas a a*2 a+1 ¿Qu´ hacen exactamente? ¿Por qu´ crees que no es necesario “.” en la primera instrucci´n?. e e o 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), aa2 es equivalente a inv(a)*a2 En cuanto a su relaci´n con ./ y . es la misma que ha surgido antes, esto es, aplicado o sobre matrices procede a realizar los cocientes elemento a elemento. Requiere por tanto que ambas matrices tengan el mismo tama˜o. n Ejercicio 2.5 Ejecuta las instrucciones >> 3/5 >> 35 y observa el resultado. ¿Tiene sentido desde el punto de vista anterior?. Ejercicio 2.6 Dado b una matriz, ¿qu´ hace 1/b?. e 24
  • 30. ´ LECCION I Cap´ ıtulo 2. Matlab: Primeros pasos Nota. El operador backslash “” se utiliza profusamente para resolver sistemas de ecuaciones lineales, bajo la idea de que Ax = b ⇔ x = A−1 b. As´ si b es n × 1 y a es n × n, ı, r do rra Bo >> x=ab; devuelve en x la soluci´n del sistema correspondiente. o El funcionamiento real de dista mucho de ser tan simple. Esto es, no calcula la inversa de a para multiplicarla por b, sino que resuelve el sistema de ecuaciones por alguna variante del m´todo de Gauss. Se puede utilizar helpwin mldivide (o helpwin e mrdivide para /) para leer en detalle c´mo procede este comando. o 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 2.5.3. 0.5000 1.0000 Detalles adicionales C´mo obtener las dimensiones de vectores y matrices o Los comandos de Matlab size y length nos proporcionan esta informaci´n: o >> a3=[1 2; 3 6; 5 -1]; >> size(a3) ans = 3 2 >> length(a3) 25
  • 31. ´ LECCION I 2.5 Vectores y matrices ans = 3 r do rra Bo >> a3=a3’; % cambiamos la forma de a3 >> size(a3) ans = 2 3 >> [m,n]=size(a3); % m son las filas y n las columnas >> m ans = 2 >> n ans = 3 >> length(a3) ans = 3 El comando size devuelve un vector de tama˜o 2×1 con el n´mero de filas y columnas n u del vector/matriz. El resultado es diferente seg´n se aplique a vectores fila o columna. La u orden length devuelve la longitud de una matriz o vector. Su significado en el caso de un vector est´ clara mientras que para matrices devuelve el m´ximo entre el n´mero de filas a a u y el n´mero de columnas. u Matrices especiales Matlab dispone de una serie de comandos que permiten construir matrices con una estructura particular. Cabe se˜alar las siguientes ´rdenes: n o 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 m´s ex´ticas como hilb, invhilb, pascal, magic. a o 26
  • 32. ´ LECCION I Cap´ ıtulo 2. Matlab: Primeros pasos Existen dos formas de introducir vectores cuyos valores siguen una distribuci´n regular o a:b:c construye el vector de valores [a a+b a+2*b .... a+k*b] donde a+k*b es el mayor n´mero natural que cumple a+k*b≤ c. La instrucci´n a:c toma b = 1. u o linspace(a,b,n) devuelve una partici´n uniforme de [a, b] en n puntos. o r do rra Bo 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 eliminaci´n de filas o columnas, ı o cambios de tama˜o, etc, se hace v´ instrucciones muy simples en Matlab. Aunque pueda n ıa resultar algo extra˜o al principio, un poco de pr´ctica es suficiente para que el usuario se n a 27
  • 33. ´ LECCION I 2.5 Vectores y matrices adapte a la nueva sintaxis, tan diferentes a la de un lenguaje tradicional, y pueda utilizarlo en sus c´digos. o Comencemos viendo un ejemplo: r do rra Bo >> 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 4 7 10 0 0 0 0 3 6 9 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
  • 34. ´ LECCION 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)] r do rra Bo ans = 0 0 3 6 En general, si p es un vector de n´meros enteros, v(p) devuelve [v(p(1)), v(p(2)), u ..., 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 >> p=[5 1 2 3 3 3]; >> v(p) 0.2000 % no importa que esten repetidos ans= 0.5000 0.1000 0.2000 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) ¿Qu´ hacen exactamente?. e Igualmente es f´cil a˜adir filas y columnas a una matriz: a n >> a=[1 2 3 4; 5 6 7 8] a = 1 5 2 6 3 7 >> a=[a; [1 -1 2 4]] 4 8 % adosamos una fila nueva a = 29 0.3000
  • 35. ´ LECCION I 2.6 Bucles y estructuras de decisi´n o 1 5 1 2 6 -1 3 7 2 % una nueva columna r do rra Bo >> a=[a [0; 2; 4] ] 4 8 4 a = 1 5 1 2 6 -1 3 7 2 4 8 4 0 2 4 Si se desea eliminar una fila o columna se puede utilizar el s´ ımbolo vac´ []. Por ıo ejemplo, >> a(:,2)=[] % suprime la segunda columna a = 1 5 1 3 7 2 4 8 4 0 2 4 Ejercicio 2.8 Programa una funci´n cuyas entradas sean una matriz cuadrada y un t´rmino o e independiente compatible y que devuelva la matriz ampliada del sistema de ecuaciones lineales. Esto es, una matriz con la matriz original y una ultima columna con el t´rmino independiente. ´ e 2.6. Bucles y estructuras de decisi´n o Claves en cualquier lenguaje de programaci´n, Matlab dispone de varias de ellas entre o las que sobresalen for e if, un est´ndar en el mundo de la inform´tica. a a 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 c´digo entre for y end son ejecutadas repetidao mente con j tomando los valores del vector inicio:paso:final (v´ase la Secci´n 2.5.3) e o Por ejemplo, >> for j=1:3; 1 disp(j); end 30
  • 36. ´ LECCION I Cap´ ıtulo 2. Matlab: Primeros pasos 2 3 disp(j-2); end r do rra Bo >> for j=6:-2:2; 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; 2 disp(j); end 5 3 1 Asociados a for, y en general a cualquier bucle, encontramos los comandos break y continue. El primero fuerza la salida inmediata del bucle mientras que el segundo reinicializa la iteraci´n con el siguiente valor del ´ o ındice. Ejercicio 2.9 La matriz de Hilbert de orden n es  1 1 ··· ··· 2  1 1 ··· ···  2 3 A= . .  . .. ... ...  . 1 2n−2 1 n 1 n 1 n+1 . . . 1 2n−1       Construye la matriz anterior mediante un fichero script y el uso de dos “for” anidados. 2.6.2. Operadores l´gicos y estructuras de decisi´n o o Los operadores l´gicos m´s b´sicos en Matlab son o a a == igualdad, ~= desigualdad, >= mayor o igual, <= menor o igual, 31 > & mayor, “y” l´gico, o < | menor, “o” l´gico o
  • 37. ´ LECCION I 2.6 Bucles y estructuras de decisi´n o El resultado de una comparaci´n es 1 si es verdadero, 0 si es falso: o >> a=1; b=2; c=3; >> a>0 ans = r do rra Bo 1 >> a>0 & b<3 ans = 1 >> a<0 | b<1 ans = 0 >> test= (a~=0) ans = 1 >> whos test Name Size test Bytes 1x1 1 Class logical array Grand total is 1 element using 1 bytes Estos “0” y “1” no son valores num´ricos sino l´gicos como se comprueba con la ultima e o ´ instrucci´n10 . Cuando se aplica a un vector, devuelve un vector de verdadero/falso de la o misma longitud que el vector original: >> b=[1 2 -3 -1 2 -4]; p=(b>=1) % entradas de b>=1 p= 1 1 0 0 1 0 En el ejemplo anterior, p(i)==1 si b(i)≥1 y cero en caso contrario. Ahora, podemos aislar los elementos mayores o iguales que 1 simplemente con 10 Ocupan un unico byte mientras que un n´mero real utiliza ocho bytes. ´ u 32
  • 38. ´ LECCION I Cap´ ıtulo 2. Matlab: Primeros pasos >> b(p) 1 2 2 Desde este punto de vista es correcta y recomendable utilizar la instrucci´n o % elementos de b mayores o iguales que 1 r do rra Bo >> b(b>=1) 1 2 2 que adem´s resulta muy natural (y f´cil de entender). a a Nota. El comando logical puede utilizarse para construir vectores y estructuras l´gicas o a partir de vectores de n´meros enteros: u >> b=[2 4 6 8 10]; p=[1 0 0 1 >> b(p) % Dara error 1]; ??? Subscript indices must either be real positive integers or logicals. >> p=logical(p); >> b(p) ans = 2 8 10 La estructura de decisi´n, como en muchos otros lenguajes, es if. Su sintaxis es la o siguiente: if simple: si la operaci´n l´gica efectuada es verdadera, se ejecutan las l´ o o ıneas de c´digo comprendidas entre if y end o 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, comprendidas entre else y end son ejecutadas en caso de que la operaci´n l´gica efectuada en el o o if sea falsa: if (x<0 & x>-10) f=x^2; % x entre -10 y 0 else f=sin(x^2); % x menor que -10 o mayor que 0 end 33
  • 39. ´ LECCION I 2.6 Bucles y estructuras de decisi´n o if de decisi´n m´ltiple: o u r do rra Bo 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 instrucci´n es equivalente a anidar diferentes estructuras if, de la sigu´ o 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 m´s clara y concisa. a Nota. Con la instrucci´n switch se puede implementar una estructura de decisi´n que o o es esencialmente equivalente a un if anidado. Est´ disponible tambi´n el bucle while que procede a ejecutar un bucle (que se cierra a e tambi´n con un end) mientras una condici´n sea verdadera. Por tanto, es algo m´s flexible e o a que un for. En general todos los bucles y estructuras que requieran cerrarse, lo hacen con end. El uso de break y continue es exactamente el mismo. 34
  • 40. ´ LECCION 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 ejemplo ´ b(4:end) selecciona todos los elementos de b desde la posici´n cuarta en adelante. o Ejercicio 2.10 ¿Qu´ hace el siguiente fragmento de c´digo? e o r do rra Bo 01 02 03 04 05 06 r=[]; aux=0; while aux<0.8 aux=rand(1); r=[r aux]; end r(end)=[]; Ejercicio 2.11 Con la ayuda de Matlab, programa un par de ejemplos donde utilices switch y while. Ejercicio 2.12 (Un poco de todo) Implementa una funci´n de nombre findnonzeros o que dado un vector de entrada devuelva el n´mero de elementos no nulos y un vector que u contenga dichos elementos. Soluci´n. Una implementaci´n posible es la siguiente o o 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 % FINDNONZEROS % % [N,P]=FINDNONZEROS(X) devuelve % % N el numero de elementos no nulos en el vector X % P un vector con los elementos no nulos de X % function [n,p]=findnonzeros(x) p=[]; % p es vacio for i=1:length(x) if (x(i)~=0) % si x(i) no es cero p=[p x(i)]; % apuntamos i al vector p end end n=length(p); return Observa como se recogen los resultados de la funci´n, n y p, o >> 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
  • 41. ´ LECCION I 2.6 Bucles y estructuras de decisi´n o p = Columns 1 through 5 0.3000 0.1000 0.6000 0.1000 r do rra Bo 0.1000 Columns 6 through 7 0.2000 0.4000 Otra posible implementaci´n (mucho m´s elaborada y m´s propia de Matlab) es la siguo a a iente 01 02 03 04 05 06 07 08 09 10 11 12 % FINDNONZEROS % % [N,P]=FINDNONZEROS(X) devuelve % % N el numero de elementos no nulos en el vector X % P un vector con los elementos no nulos de X % function [n,p]=findnonzeros(x) p=x(x~=0); n=length(p); return Haz un esfuerzo en entender bien los comandos anteriores. Tras la suficiente pr´ctica, a esta versi´n se ve m´s clara y natural que la anterior. Observa c´mo se toman los elementos o a o no nulos del vector x (l´ ınea 10). 36
  • 42. r do rra Bo Cap´ ıtulo 3 M´todos directos para sistemas de e ecuaciones lineales 3.1. M´todo de Gauss e El m´todo de Gauss, tambi´n conocido como eliminaci´n gaussiana, es el algoritmo e e o m´s sencillo para la resoluci´n de sistemas de ecuaciones lineales. Consta de dos partes a o bien diferenciadas: i) Transformaci´n del sistema lineal en otro equivalente, es decir, con la misma soluo ci´n, donde la matriz es triangular superior. o ii) Resoluci´n del sistema triangular por sustituci´n regresiva. o o El paso i) se acomete v´ dos operaciones elementales: ıa (a) Sumar a una ecuaci´n otra multiplicada por un n´mero. o u (b) Intercambiar dos ecuaciones. Si s´lo utilizamos la operaci´n (a) hablaremos del m´todo de Gauss sin pivotaje, y o o e con pivotaje parcial si tambi´n realizamos las operaciones (b)1 cuando la elecci´n de e o las filas que se conmutan sea una muy particular. Representando el sistema de ecuaciones en la forma matricial, todo lo anterior se reescribe en t´rminos de operaciones matriciales (sumar a una fila otra fila e intercambiar e 2 filas ). 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 t´rmino independiente y x el vector de soluciones. e Los elementos de A se denotar´n por aij , y con bi los de b. a 1 Existe una tercera operaci´n (c), que consiste simplemente en multiplicar filas por constantes no o nulas. Esta operaci´n recibe el nombre de reescalado (de filas) y en problemas pr´cticos se suele utilizar o a con el fin de mejorar la estabilidad del sistema frente a errores de redondeo. 2 Otra posibilidad es intercambiar columnas, que se corresponde con reordenar las inc´gnitas). En este o caso se habla de pivotaje total. 37
  • 43. ´ LECCION I 3.1 M´todo de Gauss e 3.1.1. M´todo de Gauss sin pivotaje e El pseudoc´digo se expone a continuaci´n o o M´todo de Gauss e r do rra Bo 01 02 03 04 05 06 07 08 09 10 11 12 for i = 1 : n − 1 for k = i + 1 : n ki = aki /aii for j = i + 1 : n akj = akj − ki aij end bk = bk − ki bi end end xn = bn /ann for i = n − 1 : −1 : 1 n x i = bi − 13 aij xj /aii j=i+1 15 end Las l´ ıneas 01--09 se corresponden con la reducci´n a la forma triangular de la matriz o y las l´ ıneas 11--15 con la resoluci´n del sistema triangular resultante. El elemento aii se o denomina pivote y debe ser distinto de cero para que el algoritmo funcione, dado que en caso contrario la operaci´n en 03 est´ mal definida. o a 3 o El algoritmo efect´a O(n /3) productos3 y otras tantas sumas para la reducci´n a la u forma triangular y O(n2 /2) sumas y productos para la resoluci´n del sistema triangular. o Por tanto el costo se concentra en la primera fase del algoritmo y duplicar la dimensi´n o del sistema exige multiplicar por ocho el tiempo de c´lculo (y por cuatro el costo en a memoria). Ejercicio 3.1 Implementa una funci´n cuyas entradas sean la matriz de coeficientes y el o t´rmino independiente y devuelva la soluci´n del sistema por el m´todo de Gauss. e o e Soluci´n. El siguiente programa es una soluci´n del ejercicio o o 01 02 03 04 05 % GAUSS % % % X=GAUSS(A,B) % Solucion del sistema Ax=b con el metodo de Gauss sin pivotaje 3 es decir, el n´mero de multiplicaciones es n3 /3 + αn2 + βn + γ, donde α, β y γ son constantes u adecuadas. Con n creciente, el primer t´rmino es el dominante. e 38
  • 44. ´ LECCION I 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Cap´ ıtulo 3. M´todos directos para sistemas de ecuaciones lineales e function x = gauss(a,b) n=length(a); r do rra Bo % transformacion del sistema en uno triangular for i=1:n-1 for k=i+1:n l=a(k,i)/a(i,i); for j=i+1:n a(k,j)=a(k,j)-l*a(i,j); end b(k)=b(k)-l*b(i); end end % resolucion del sistema triangular x=zeros(n,1); % tambien vale x=b*0; x(n)=b(n)/a(n,n); for i=n-1:-1:1 s=0; for j=i+1:n s=s+a(i,j)*x(j); % sumatorio end x(i)=(b(i)-s)/a(i,i); end return El c´digo anterior es correcto y ciertamente recuerda a la sintaxis que usar´ o ıamos en una programaci´n en un lenguaje tradicional como C o Pascal. Sin embargo desde el punto de o vista de Matlab es claramente redundante y muy mejorable. Los siguientes ejercicios ahondan en estos aspectos por lo que resolverlos es muy recomendable. Ejercicio 3.2 Reescribe el programa utilizando instrucciones y sintaxis propia de Matlab. Soluci´n. Las filas 14-16 del programa (04--06 del algoritmo) se pueden implementar o como una diferencia de dos vectores, a(k,i+1:n) y a(i,i+1:n), con cualquiera de estas dos instrucciones a(k,i+1:n) =a(k,i+1:n) - l*a(i,i+1:n) a(k,:) =a(k,:) - m*a(i,:) La segunda es m´s c´moda de utilizar pero multiplica por dos el n´mero de operaciones a o u 4 en la ejecuci´n del m´todo . o e 4 ¿Por qu´?. e 39
  • 45. ´ LECCION I 3.1 M´todo de Gauss e De forma an´loga, el sumatorio de las l´ a ıneas 25-29 del c´digo (13 del algoritmo del o m´todo de Gauss) es simplemente el producto escalar, y de hecho tambi´n matricial, de e e dos vectores, el vector fila a(i,i+1:n) y el vector columna x(i+1:n). Esto es el c´digo o de 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); r do rra Bo Ejercicio 3.3 (Avanzado) Podemos avanzar a´n m´s hacia la consecuci´n de algoritmos u a o matriciales. Consideremos la partici´n de A o a11 c1 d1 A11 A= , b= b1 b1 donde c1 , d1 son vectores (n − 1) × 1 y A11 una matriz (n − 1) × (n − 1). Entonces, el primer paso del m´todo de Gauss se puede escribir e a11 c1 0 A11 − (a11 )−1 c1 d1 , A(1) b= b1 b1 − a−1 b1 d1 . 11 b(1) El segundo paso del m´todo de Gauss se aplica ahora sobre la matriz A(1) (de tama˜o (n−1)× e n (n − 1)) y el vector b(1) (de tama˜o (n − 1) × 1) y as´ se procede sucesivamente. Implementa n ı esta resoluci´n alternativa del m´todo de Gauss. o e (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) ¿Qu´ hacen?) e Nota sobre la vectorizaci´n o La noci´n de vectorizaci´n, trabajar con vectores y matrices en lugar de elemento a eleo o mento, no es nueva ni en el An´lisis Num´rico ni en la computaci´n a alto nivel. El objetivo a e o que se persigue es que las todas las operaciones se reduzcan a operaciones matem´ticas a sencillas, como productos escalares, productos matriciales, b´squeda de m´ximos y m´ u a ınimos en un vector/matriz, suma de vectores y matrices... cuya implementaci´n se optio miza tomando en consideraci´n el entorno en el que se trabaja, tanto en software como o en hardware. Este conjunto de instrucciones se conocen como BLAS (basic linear algebra subprograms). Se distinguen tres niveles. El nivel uno est´ formada por operaciones entre a vectores, tales como la suma o el producto escalar de dos vectores, de O(n) operaciones, el nivel dos se ocupa de operaciones matriz-vector con O(n2 ) operaciones y el nivel tres son operaciones entre matrices, O(n3 ) operaciones. En m´quinas con m´ltiples procesadores a u estos subprogramas deben adaptarse a dividir la tarea entre los procesadores disponibles de forma ´ptima y a buscar algoritmos que soporten este tipo de trabajo5 . o 5 Se deben buscar en primer lugar algoritmos que permitan dividir la tarea principal en subtareas equiparables, y de forma que finalicen en tiempos similares puesto que basta con que una de las subtareas se retrase respecto a las dem´s para que el conjunto de procesadores deba parar a esperar al rezagado a con la consiguiente p´rdida de tiempo (y dinero). e 40
  • 46. ´ LECCION I Cap´ ıtulo 3. M´todos directos para sistemas de ecuaciones lineales e Uno de los detalles m´s sencillos que hay que plantear es la estrategia de almacea namiento de las matrices en memoria. Se puede optar por un almacenamiento por filas, como hace C, a11 a12 a13 a21 a22 a23 ⇒ a11 → a12 → a13 → a21 → a22 → a23 r do rra Bo A= donde con la notaci´n anterior queremos decir que aij y aij+1 ocupan posiciones conseco utivas en memoria. Sin embargo Fortran o Matlab proceden por columnas A= a11 a12 a13 a21 a22 a23 ⇒ a11 → a21 → a12 → a22 → a13 → a23 . Seg´n sea el caso se trata de primar algoritmos que accedan a la matriz por filas o por u columnas para que el procesador trabaje con posiciones consecutivas de memoria6 . En esta din´mica, la resoluci´n del sistema triangular seg´n el algoritmo expuesto en el Ejercicio a o u 3.3 est´ mejor adaptado a la arquitectura de Matlab puesto que todas las operaciones se a hacen sobre columnas de la matriz a. 3.1.2. M´todo de Gauss con pivotaje parcial e Para evitar que el m´todo de Gauss se colapse, es decir, que encuentre en un paso i e que el elemento aii es nulo (l´ ınea 03 del algoritmo), se introduce la noci´n de pivotaje. La o idea es muy sencilla: en el caso de que en el i–´simo paso el pivote sea nulo, se procede a e intercambiar la fila i por una fila k tal que aki = 0 para cierto k > i. Si esto no es posible, el sistema no es compatible determinado, es decir, o no tiene soluci´n o tiene infinitas o soluciones. Desde un punto de vista pr´ctico, el m´todo de Gauss con pivotaje procede a intera e cambiar siempre filas de forma que en cada paso |aki | = m´x |a i |, a =i,...,n esto es, el pivote es el mayor posible. Ello dota al sistema de una mayor estabilidad frente a los errores de redondeo. El algoritmo resultante es el siguiente (denotamos por a ↔ b el intercambio de valores de a y b). 6 Cuando un procesador moderno lee algo en memoria, suele cargar a su memoria internar, la memoria cach´, posiciones adicionales y consecutivas de memoria bajo la convicci´n de que es probable que las e o requiera en el siguiente paso. 41
  • 47. ´ LECCION I 3.1 M´todo de Gauss e M´todo de Gauss con pivotaje parcial e 01 02 03 Encontrar k ∈ {i, . . . , n} tal que |aki | = m´x |a i | a j= ,...,n for j = i : n aij ↔ akj end bi ↔ bk r do rra Bo 04 05 08 07 08 09 10 11 12 13 14 15 16 for i = 1 : n − 1 %intercambio filas y termino independiente for k = i + 1 : n ki = aki /aii for j = i + 1 : n akj = akj − ki aij end bk = bk − ki bi end end Ejercicio 3.4 Implementa una funci´n con el m´todo de Gauss con pivotaje a partir de la o e funci´n definida en el Ejercicio 3.2. o Para este fin la instrucci´n max te puede resultar util. Espec´ o ´ ıficamente, >> [m,i]=max(v) devuelve en m el mayor valor del vector v y en i su posici´n, esto es, m = v(i). A˜ade tambi´n o n e un control sobre el tama˜o de a(i, i) de forma que si ´ste es pr´ximo a cero7 se termine la n e o ejecuci´n y se devuelva un mensaje de error. o (Ayuda. La instrucci´n [m,r]=max(abs(a(i:n,i))) te devolver´ en r la posici´n del m´ximo o a o a en el vector columna abs(a(i:n,i)). Por tanto, la fila en la matriz a con el mayor valor en la columna i es i+r-1.) El intercambio de filas de las 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 los valores elemento a elemento. En la segunda forma se hace de forma global mediante aux=a(i,i:n); a(i,i:n)=a(k,i:n); a(k,i:n)=aux; La tercera forma probablemente ser´ la que resulte m´s extra˜a pero vuelve a ser natural a a n en Matlab. Basta hacer a([i,k],i:n)=a([k,i],i:n) F´ ıjate que tiene perfecto sentido sint´ctico de acuerdo a las reglas de manipulaci´n de a o vectores y matrices expuestas en la primera parte de esta lecci´n. o 7 ¿Cu´ndo se decide que un n´mero es cero? En la pr´ctica depende de los tama˜os del resto de a u a n elementos de la matriz. 42
  • 48. ´ LECCION I 3.1.3. Cap´ ıtulo 3. M´todos directos para sistemas de ecuaciones lineales e M´todo de Gauss con pivotaje parcial ficticio e Desde un punto de vista pr´ctico no hace falta intercambiar f´ a ısicamente las filas de la matriz. En lugar de ello se puede utilizar un vector de ´ ındices p de forma que p(i) sea la posici´n f´ o ısica en memoria de la fila i. Inicialmente, las filas est´n sin reordenar, es decir, se empieza declarando a r do rra Bo p=1:n; Intercambiar las filas i y k es equivalente a intercambiar los valores de p en las posiciones iyk p([i k])=p([k i]) y se procede a hacer ceros en las filas p(i+1),. . . , p(n). El acceso la fila i se consigue con a(p(i),:) y la b´squeda del m´ximo valor para el intercambio de filas con u a [m,r]=max(abs(a(p(i:n),i)));r=r+i-1; La fila con el m´ximo elemento en valor absoluto es la p(r). a Para la resoluci´n del sistema triangular despejamos igual que en el m´todo de Gauss, o e desde la n-´sima inc´gnita a la primera, con e o 22 23 24 25 x(p(n))=b(p(n))/a(p(n),n); for i=n-1:-1:1 x(p(i))=(b(p(i))-a(p(i),i+1:n)*x(i+1:n))/a(p(i),i); end Desde un punto de vista estrictamente matem´tico se trata de llevar la matriz a una a forma que, si bien no es triangular, una reordenaci´n adecuada de las filas la transforma o en triangular. El vector p recoge en qu´ orden se deben despejar las inc´gnitas a la hora e o de resolver el sistema reducido. En concreto el orden viene dado por p(n), p(n-1),. . . , p(1). En cualquier caso, a(p,:) es una matriz triangular8 . Ejercicio 3.5 Implementa el m´todo de Gauss con pivotaje parcial ficticio. e Ejercicio 3.6 Las l´ ıneas 22–25 proceden a resolver el sistema triangular accediendo a los elementos por filas. Adapta el algoritmo para la resoluci´n de este sistema por columnas, tal o como se hizo en el Ejercicio 3.3. Ejercicio 3.7 Sea A una matriz inversible de tama˜o n × n y A−1 su inversa. Si ai es la n columna i−´sima de A−1 , esto es, e A−1 = [a1 |a2 | · · · |an ], 8 La importancia de estas t´cnicas ha decrecido con las ultimas generaciones de ordenadores, donde la e ´ manipulaci´n de enormes cantidades de memoria est´ muy optimizada. o a 43
  • 49. ´ LECCION I 3.2 Descomposiciones matriciales entonces  r do rra Bo  0  .  .  .    Aai = ei =  1  → i.  .   .  . 0 Utilizando alguna de las diferentes versiones del m´todo de Gauss, implementa el c´lculo de la e a inversa mediante la resoluci´n de los n sistemas de ecuaciones. Observa que los n comparten o la misma matriz de coeficientes. 3.2. Descomposiciones matriciales Uno de los aspectos que mejores resultados dio a lo largo del siglo XX, en los albores del ´ An´lisis Num´rica, fue la constataci´n de que numerosos algoritmos del Algebra Lineal, a e o pod´ reescribirse como factorizaciones de matrices en producto de otras matrices con ıan ´ caracter´ ısticas muy particulares. Este es el caso del algoritmo de Gram-Schmidt, la matriz original escrita como el producto de una ortogonal por una triangular, o el caso que nos ocupa, el m´todo de Gauss, visto como la b´squeda de la factorizaci´n de A como el e u o producto de una matriz triangular inferior por una superior. La utilidad que se concedi´ a este tipo de factorizaciones fue en un primer momeno to m´s bien te´rica pero r´pidamente se encontr´ aplicaciones pr´cticas y su uso en la a o a o a actualidad es profuso. Estudiaremos en lo que sigue la factorizaci´n LU y variantes y dejaremos para m´s o a adelante (Lecci´n IV) otro tipo de factorizaciones. o 3.2.1. Descomposici´n LU o Supongamos que se dispone de una descomposici´n o A = LU donde L y U son matrices triangulares inferior y superior respectivamente. En este caso, la resoluci´n del sistema lineal Ax = b es equivalente a resolver dos sistemas de ecuaciones o triangulares Ly = b, U x = y. el primero triangular superior y el segundo triangular inferior. Puesto que el costo de resoluci´n de cada sistema es O(n2 ) operaciones (total de sumas y productos) obtenemos o una ventaja decisiva en la resoluci´n del sistema. o Ejercicio 3.8 Implementa la resoluci´n de un sistema de ecuaciones Lx = b donde L es o triangular inferior con 1s en la diagonal. Si abordamos directamente la resoluci´n de la ecuaci´n A = LU , nos encontramos o o 2 con un sistema no lineal con n + n inc´gnitas (las entradas de L y U ) y n2 ecuaciones o (una por cada elemento de a). Por tanto, el sistema resultante no deber´ admitir soluci´n ıa o 44
  • 50. ´ LECCION I Cap´ ıtulo 3. M´todos directos para sistemas de ecuaciones lineales e r do rra Bo unica. Si exigimos que L tenga 1s sobre la diagonal, el n´mero de inc´gnitas pasa a ser ´ u o 2 de n y por tanto tenemos ya un sistema cuadrado (aunque no lineal). Se trata entonces de estudiar el siguiente problema: dada una matriz A de tama˜o n × n, encontrar L y U n de la forma     1 u11 u12 · · · u1n  21 1   u22 · · · u2n      L= . U = , . .. ... .  , . . .   .   . . . unn n1 n2 · · · 1 y tales que A = LU. El c´lculo de esta descomposici´n se puede llevar a cabo sin m´s que exigir que el a o a producto LU sea igual al de A. As´ empezamos despejando la primera fila de U (que es ı igual que la de A por ser 11 = 1). Una vez conocida esa fila, se puede despejar la primera columna de L, utilizando que el producto de L por la primera columna de U (que consta de un unico elemento no nulo y ya es conocido del paso anterior) da la primera columna de ´ A. Procedemos sucesivamente de esta forma, construyendo U por filas y L por columnas. Descomposici´n LU (M´todo de Doolittle) o e 01 02 for k = 1 : n for j = k : n k−1 03 ukj = akj − 04 05 06 end kk = 1 for i = k + 1:n kp upj p=1 k−1 07 ik = aik − ip upk /ukk p=1 08 09 end end El n´mero de operaciones del algoritmo resulta ser igual al del m´todo de Gauss, u e con lo cual no hemos conseguido una ventaja significativa. Sin embargo, disponer de esta descomposici´n es especialmente util si se requiere resolver varios sistemas de ecuaciones o ´ lineales con la misma matriz pero con t´rminos independientes diferentes. Las operaciones e que conllevan un mayor coste son las correspondientes al c´lculo de las matrices L y a U , pero unicamente hay que realizar esta descomposici´n una vez para posteriormente ´ o resolver en cada caso dos sistemas triangulares. Ejercicio 3.9 Implementar la descomposici´n LU en Matlab mediante una funci´n cuya o o entrada sea una matriz cuadrada y su salida sean las matrices L y U correspondientes. (Ayuda: la funci´n por tanto devuelve dos valores.) o 45
  • 51. ´ LECCION I 3.2 Descomposiciones matriciales Al observar el algoritmo del m´todo, las operaciones recuerdan a las efectuadas por el e m´todo de Gauss. Esto no es tan sorprendente cuando se analizan con detenimiento los e calculados realizados. Se puede ver entonces que en el c´lculo de la descomposici´n LU se a o est´n haciendo exactamente las mismas operaciones que al aplicar el m´todo de Gauss. a e En efecto, definamos r do rra Bo (1) aij = aij (k+1) i, j = 1, . . . , n (k) = aij − aij (k) ik akj , 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 factorizaci´n LU , los elementos de la o primera fila de U y de la primera columna de L vienen dados por (1) (1) u1j = a1j , i1 = ai1 (1) . a11 En el siguiente paso, se observa que i2 = 21 u1j (1) (1) 21 a1j (1) u2j = a2j − (1) = a2j − (2) = a2j (2) a − i1 a ai2 − i1 u12 a = i2 (2) 12 = i2 . (2) u22 a22 a22 Reiterando el mismo razonamiento concluimos que (j) uij = (i) aij , i ≤ j, ij = aij (j) , i > j. ajj Por tanto U es de hecho la matriz triangular que queda al aplicar el m´todo de Gauss e mientras que L est´ formada por los elementos que se han utilizado para hacer ceros en a el proceso. Esto es, el elemento i, j de L, denotado por ij , coincide con la constante ij calculado en la l´ ınea 03 del m´todo de Gauss y por tanto no hay una contradicci´n de e o notaciones. En particular, la propiedad anterior propone una forma alternativa de calcular la descomposici´n LU de una matriz es la siguiente modificaci´n del programa del Ejercicio 3.1: o o 11 12 13 14 15 16 17 for i=1:n-1} a(i,i+1:n)=0; %hacemos cero la columna i for k=i+1:n} l(k,i)=a(k,i)/a(i,i); a(k,i+1:n)=a(k,i+1:n)-l(k,i)*a(i,i+1:n); end end La matriz U estar´ entonces almacenada en a. ıa Ejercicio 3.10 Una forma compacta de devolver la descomposici´n LU es insertar L en la o parte triangular inferior de a. De esta forma, tras aplicar el m´todo, a tiene en la parte superior e la matriz U , mientras que por debajo de la diagonal encontramos L (exceptuando su diagonal de 1s). Implementa esta modificaci´n. o 46
  • 52. ´ LECCION I 3.2.2. Cap´ ıtulo 3. M´todos directos para sistemas de ecuaciones lineales e Casos particulares M´todo de Cholesky e En una gran variedad de problemas pr´cticos aparecen matrices sim´tricas definidas a e positivas. Este tipo de matrices puede descomponerse en la forma r do rra Bo A = LL donde   11  21  L= .  . . 22 n1 n2 . . .   .  .. . ··· nn Gracias a la simetr´ de la matriz, tanto el n´mero de operaciones como de posiciones ıa u de memoria requeridos pueden reducirse a la mitad. El algoritmo resultante es conocido como el m´todo de Cholesky. e M´todo de Cholesky e 01 for k = 1:n k−1 02 kk 2 kr akk − = r=1 for j = k + 1:n 03 k−1 04 jk = ajk − jr kr / kk r=1 05 06 end end Ejercicio 3.11 Implementa una funci´n que tenga como entrada una matriz A y devuelva o la matriz L correspondiente. Debe avisar si la descomposici´n no ha podido llevarse a cabo. o Implementa tambi´n una segunda funci´n que tenga como entradas la matriz L triangular e o y un t´rmino independiente b y que devuelva la soluci´n del sistema e o (LL )x = b. Para ello se requiere la resoluci´n de los sistemas triangulares o Ly = b, L x = y. LU con permutaci´n o El m´todo de Gauss con pivotaje parcial es equivalente a la decomposici´n e o P A = LU 47
  • 53. ´ LECCION I 3.2 Descomposiciones matriciales donde P es el resultado de permutar las filas (o columnas) de la identidad. Alternativamente, equivale a una descomposici´n de la forma o A = LU r do rra Bo donde L = P −1 L, de forma que L es una permutaci´n de la matriz triangular inferior9 . o La siguiente subrutina devuelve esa descomposici´n. o 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 % % % % % % % LUPERMUTACION [L,U]=LUPERMUTACION(A) devuelve U triangular superior, L permutacion por filas de una matriz triangular inferior con 1s en la diagonal de forma que A=L*U function [l,u]= LUPermutacion(a) n=length(a); p=1:n; for i=1:n-1 [maximo,r]=max(abs(a(p(i:n),i)));r=r+i-1; p([i r])=p([r i]); for k=i+1:n l(p(k),i)=a(p(k),i)/a(p(i),i); a(p(k),i:n)=a(p(k),i:n)-l(p(k),i)*a(p(i),i:n); end end for i=1:n l(p(i),i)=1; end u=a(p,:); return 3.2.3. Comandos correspondientes en Matlab Todas las factorizaciones vistas con anterioridad est´n, por supuesto, implementadas a en Matlab. Algunos de los comandos relacionados son 9 Esto es, es el resultado de reordenar las filas de L. 48
  • 54. ´ LECCION I Cap´ ıtulo 3. M´todos directos para sistemas de ecuaciones lineales e [l,u]=lu(a) devuelve u triangular superior, l permutaci´n de una triangular inferior o con 1s en la diagonal de forma que a=l*u. [l,u,p]=lu(a) devuelve u triangular superior, l triangular inferior con 1s en la diagonal y p matriz de permutaci´n de forma que p*a=l*u. o r do rra Bo r=chol(a) devuelve r triangular superior de forma que a=r’*r. Observa que con las notaciones introducidas r es precisamente la traspuesta de la matriz L, expuesta en nuestro algoritmo. El comando asume que la matriz es sim´trica por lo que s´lo trabaja con la parte superior de la matriz. e o Otra descomposici´n habitual10 es la denominada QR que devuelve Q ortogonal (es decir, o Q Q = In ) y R triangular superior de forma que A = QR. El comando encargado de esta tarea es qr. Con estas instrucciones la soluci´n de un sistema utilizando la descomposici´n LU se o o ejecuta con las siguientes l´ ıneas [l,u]=lu(a); x=u(lb); La colocaci´n de los par´ntesis es esencial. Con ulb se calcula (u−1 l)−1 b que obviao e mente no tiene nada que ver con la soluci´n del sistema. No hay que preocuparse por el o hecho de que las matrices sean triangulares (o permutaci´n de una triangular). Matlab, y o en concreto la instrucci´n detecta esto y resolver´ el sistema por sustituci´n progresiva o a o (o regresiva), sin intentar realizar la eliminaci´n gaussiana. o Nota hist´rica11 o Ideas similares a la eliminaci´n gaussiana pueden encontrarse muchos siglos atr´s, con o a referencias que se remontan a las matem´ticas babil´nicas y chinas. Carl Friedreich Gauss a o introdujo el m´todo que lleva su nombre entorno a 1800 cuando trataba de resolver un e problema de ajuste por m´ ınimos cuadrados relacionado con el c´lculo de la ´rbita del a o asteroide Palas. Parece ser que Joseph Louis Lagrange hab´ utilizado ideas similares 50 ıa a˜os antes para dilucidar si una forma cuadr´tica (hoy dir´ n a ıamos matriz) era definida positiva. El matem´tico alem´n Carl Gustav Jacob Jacobi extendi´ la idea de la eliminaci´n a a o o gaussiana a matrices arbitrarias. Es rese˜able que la noci´n de matriz tal como la conocemos ahora era desconocida n o para Gauss y Lagrange. El concepto de matriz, y el ´lgebra asociada (esto es, las operaa ciones) habr´ de esperar a los trabajos de James J. Sylvester (que en 1848 introdujo el ıan t´rmino matriz) y de Arthur Cayley (que siete a˜os despu´s defini´ el producto matricial e n e o identific´ndolo con el c´lculo de la composici´n de aplicaciones lineales y defini´ la ina a o o versa de una matriz). Importantes fueron tambi´n las contribuciones del f´ e ısico Hermann 10 Veremos dos algoritmos para obtener esta descomposici´n en la Lecci´n IV. Aunque para la resoluci´n o o o de sistemas de ecuaciones lineales la descomposici´n QR es m´s estable num´ricamente que la LU, se o a e suele optar por esta ultima por tener un menor coste computacional (aproximadamente la mitad). ´ 11 Las principales referencias utilizadas para esta nota han sido “Very Early Days of Matrix Computations”, Beresford Parlett en SIAM News, 3, no 9; “Matrix Algorithms”, G.W. Stewart; “Computer solutions of large system of equations”, G. Merant y “An introduction to Numerical Analysis”, E. S¨li y u D. Mayers. Estas referencias est´n completamente detalladas en la bibliograf´ a ıa. 49
  • 55. ´ LECCION I 3.2 Descomposiciones matriciales r do rra Bo Grassmann (introdujo la primera ´lgebra vectorial no conmutativa, basada en el producto a vectorial de dos vectores; consider´ tambi´n el producto de un vector fila por un vector o e columna que daba lugar a una matriz de rango uno), Willard Gibbs y Paul A. Dirac. La equivalencia entre la descomposici´n LU y la eliminaci´n gaussiana parece que fue o o probada por primera vez por Paul S. Dwyer en 1944. Curiosamente, la descomposici´n o de Cholesky es anterior. Publicado p´stumamente en 1924 en una revista de Geodesia o (Andr´-Louis Cholesky muri´ en 1918). El trabajo original trataba sobre la resoluci´n e o o de un problema de ajuste por m´ ınimos cuadrados y pas´ desapercibido hasta que fue o rescatado por John Todd a finales de los a˜os 1940. n Los primeros an´lisis sobre la estabilidad num´rica de la eliminaci´n gaussiana, es a e o decir la viabilidad de su programaci´n, se remontan a los trabajos de Harold Hotelling, o Alan Turing12 , John von Neumann y Herman Heine Goldstine. Los resultados iniciales eran descorazonadores. Harold Hotelling prob´ en torno a 1940 que el error de redondeo o n podr´ crecer como 4 donde n era el orden de la matriz. Este resultado colocaba al m´todo ıa e de Gauss como un m´todo inviable para la resoluci´n de grandes sistemas lineales. Turing e o lleg´ a resultados similares de manera informal. El an´lisis de Neumann y Goldstine ya o a probaba que el m´todo era estable para matrices definidas positivas13 . James H. Wilkinson, e reconocido universalmente como el padre del an´lisis moderno de estabilidad (frente a los a errores de redondeo), extendi´ el an´lisis a matrices generales y mostr´ que el pivotaje o a o mejoraba enormemente la estabilidad del m´todo. Lo m´s curioso es que el an´lisis inicial e a a estaba enfocado m´s hacia el c´lculo de la inversa de la matriz que al m´todo de Gauss. a a e Como curiosidad final, Cleve Moler, programador original de Matlab, cita14 a Wilkinson y Todd entre las personas que tuvieron una gran influencia en su formaci´n y por ende o en los or´ ıgenes de Matlab. 12 La vida de Alan Turing es una de las m´s tr´gicas en historia de las matem´ticas. Dotado de una ina a a teligencia precoz, realiz´ contribuciones importantes en l´gica y computaci´n. Trabaj´ durante la segunda o o o o guerra mundial en Bletchley Park en el descifrado de los c´digos alemanes encriptados con la m´quina o a Enigma mediante la utilizaci´n del primer ordenador electr´nico en el mundo (Colossus). El papel que o o este trabajo an´nimo tuvo en la victoria aliada, los alemanes siempre estuvieron seguros de que su c´digo o o era indescifrable, s´lo ha empezado a reconocerse en fechas recientes. La presi´n y aislamiento a la que o o Turing fue sometido por su homosexualidad, llegando incluso a ser detenido por ello, le llev´ al suicidio o en 1954 despu´s de haberse sometido a un tratamiento con bromuro para curarle de su enfermedad. e 13 En los primeros a˜os se sugiri´ incluso resoluci´n de un sistema Ax = b mediante las ecuaciones n o o normales A Ax = A b (A A es sim´trica y definida positiva). e 14 http://www.mathworks.com/company/newsletters/news notes/clevescorner/dec04.html 50
  • 56. r do rra Bo Lecci´n II o Programaci´n avanzada en Matlab. o M´todos iterativos para sistemas de e ecuaciones lineales 51
  • 57. r do rra Bo
  • 58. r do rra Bo Introducci´n o Homer: Marge? Since I’m not talking to Lisa, would you please ask her to pass me the syrup? Marge: Dear, please pass your father the syrup, Lisa. Lisa: Bart, tell Dad I will only pass the syrup if it won’t be used on any meat product. Bart: You dunkin’ your sausages in that syrup homeboy? Homer: Marge, tell Bart I just want to drink a nice glass of syrup like I do every morning. Marge: Tell him yourself, 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 I heard 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 m´s avanzados en el tratamiento de a vectores y matrices en Matlab, haciendo hincapi´ especial en la manipulaci´n de matrices e o sparse. Veremos tambi´n c´mo se pueden implementar funciones donde el n´mero de e o u argumentos de entrada y salida son variables. En la parte matem´tica, tocaremos la teor´ b´sica de m´todos iterativos para sistemas a ıa a e de ecuaciones lineales. Empezaremos con los m´todos cl´sicos: Jacobi, Gauss–Seidel y e a relajaci´n de Young, para pasar luego a m´todos m´s modernos y elaborados: el m´todo o e a e del Gradiente y especialmente, el m´todo del Gradiente Conjugado. e En esta lecci´n nos permitiremos hacer algo de Matem´ticas. Animamos a que el lector o a no se asuste por ello y a que trate de entender los enunciados y las demostraciones que se ´ ofrecen. Para ello se asumen unos conocimientos m´ ınimos en Algebra Lineal. 53
  • 59. r do rra Bo
  • 60. r do rra Bo Cap´ ıtulo 4 Matlab: programaci´n avanzada o 4.1. Retorno a las matrices A estas alturas el lector ya deber´ estar convencido sobre las capacidades de Matlab ıa en lo que se refiere al manejo de enormes cantidades de memoria. En esta secci´n expono dremos algunos comandos adicionales y entraremos con cierto detalle en la manipulaci´n o 1 de matrices sparse . 4.1.1. Acceso a partes estructuradas de una matriz En ocasiones es importante tomar partes precisas de una matriz que no son necesariamente partes de filas, columnas o simplemente submatrices (estas acciones ya se trataron en la primera lecci´n). Para este fin nos pueden servir las siguientes instrucciones o diag triu tril La primera toma la diagonal de una matriz mientras que la segunda y tercera toman la parte triangular superior (upper) e inferior (lower) respectivamente. Adem´s estos coa mandos son algo m´s flexibles de lo que pueda parecer a simple vista como veremos a a continuaci´n. o Empecemos introduciendo una matriz >> a=[11 12 13; 21 22 23; 31 32 33]; El resultado de los siguientes comandos es, a la luz de lo anterior, esperable >> diag(a) ans = 11 22 33 1 Aceptaremos este anglicismo en lo que sigue. En ocasiones este vocablo se traduce por matrices huecas o matrices dispersas. 55
  • 61. ´ LECCION II 4.1 Retorno a las matrices >> triu(a) ans = 12 22 0 13 23 33 r do rra Bo 11 0 0 >> tril(a) ans = 11 21 31 0 22 32 0 0 33 El usuario puede especificar qu´ diagonal se escoge, o a partir de qu´ diagonal se toma e e la matriz triangular. La diagonal principal es la cero y las subdiagonales inferiores (respectivamente superiores) est´n numeradas consecutivamente con n´meros enteros negativos a u (respectivamente positivos). El siguiente ejemplo ilustra estas caracter´ ısticas. >> diag(a,-1) ans = 21 32 >> tril(a,-1) ans = 0 21 31 0 0 32 0 0 0 >> triu(a,0) ans = 11 0 0 12 22 0 13 23 33 Ejercicio 4.1 Programa una funci´n que dada una matriz a devuelva un vector d con los o elementos de la diagonal, una matriz triangular superior u con todos los elementos de a situados 56
  • 62. ´ LECCION II Cap´ ıtulo 4. Matlab: programaci´n avanzada o encima de la diagonal superior y l una matriz triangular inferior con todas las entradas de debajo de la diagonal principal. Ejercicio 4.2 ¿Qu´ sucede si aplicamos los comandos anteriores a matrices rectangulares?. e r do rra Bo Con diag podemos tambi´n construir a partir de un vector una matriz diagonal e >> diag([1 2]) % es lo mismo que diag([1 2],0) ans = 1 0 0 2 >> diag([1 2],1) ans = 0 0 0 1 0 0 0 2 0 Ejercicio 4.3 ¿C´mo utilizar´ el comando diag para generar una matriz con la diagonal o ıas de una dada?. Nota. El comando blkdiag permite construir matrices diagonales por bloques: >> blkdiag(1,[1 2; 3 4], 5) ans= 1 0 0 0 0 1 3 0 0 2 4 0 0 0 0 5 Trasposici´n de matrices o Dada una matriz A, la matriz traspuesta A es la matriz resultante de intercambiar las filas con las columnas de A. Esto es, las filas de A pasan a ser las columnas de A . Esta operaci´n se denota en Matlab con “ ’ ” : o >> a=[1 2 3; 0 2 4]; >> a’ ans = 57
  • 63. ´ LECCION II 4.1 Retorno a las matrices 1 2 3 0 2 4 r do rra Bo Obviamente, tambi´n se aplica sobre vectores: e >> b=[1;2;3]; % vector COLUMNA con tres elementos >> b’ % vemos ahora un vector FILA ans = 1 2 3 De nuevo nos encontramos con esta propiedad sobre la que ya hemos incidido: Matlab distingue entre vectores 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 tambi´n el operador “.’”. Sobre matrices reales funciona exace tamente igual que el comando anterior, pero no as´ sobre n´meros complejos. Adem´s de ı u a trasponer, “’”, conjuga todas las entradas. Es decir, cambia el signo a la parte imaginaria de cada elemento. Matem´ticamente hablando, ´ste es el operador de trasposici´n o cona e o jugaci´n, denotado habitualmente en matem´ticas con “A∗ ”. Por contra, “.’” se limita a o a intercambiar filas por columnas en la matriz: >> clear i % i es ahora la unidad imaginaria >> a=[i 1-2i; 1 0.3+4i]; >> a.’ ans = 0 + 1.0000i 1.0000 - 2.0000i 1.0000 0.3000 + 4.0000i >> a’ ans = 0 - 1.0000i 1.0000 + 2.0000i 1.0000 0.3000 - 4.0000i Dada una matriz a, si ejecutamos a(:), obtenemos el vector columna que se construye concatenando las columnas de a. T´cnicamente hablando, nos est´ mostrando la e a matriz tal como se guarda en memoria. Por ejemplo, 58
  • 64. ´ LECCION II Cap´ ıtulo 4. Matlab: programaci´n avanzada o >> a=[1 2 3; 0 2 4]; >> a(:) ans = r do rra Bo 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 funci´n es un vector, sin importar si ´ste es fila o o e columna. La instrucci´n o >> b=b(:); har´ de b un vector columna, sea cual sea su formato inicial. Si lo que se desea es a un 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 modo de ejemplo, >> a=zeros(4,3); >> a(:)=[1 2 3 4 5 6 7 8 9 10 11 12] a = 59
  • 65. ´ LECCION II 4.1 Retorno a las matrices 1 2 3 4 5 6 7 8 9 10 11 12 r do rra Bo >> a2=zeros(2,6); >> a2(:)=a(:) a2= 1 2 3 4 5 6 7 8 9 10 11 12 Nota. El comando reshape permite modificar las dimensiones de una matriz (o array en general). Es m´s flexible que el comando “:”. a 4.1.2. M´s operaciones sobre matrices a Hasta ahora las operaciones matriciales que han centrado nuestra atenci´n son las funo damentales: suma y producto. En Matlab est´n tambi´n implementadas otras operaciones a e ´ comunes en el Algebra Lineal. Entre todas ellas destacamos dot: Calcula el producto escalar de dos vectores: >> dot([1 2 3],[4 5 6]) ans = 32 Devuelve el produto 1 · 4 + 2 · 5 + 3 · 6 = 32. Este comando no distingue entre vectores filas y columnas, y es aplicable siempre que tengan la misma longitud. La funci´n se puede aplicar a matrices bien por columnas, ´sta es la forma est´ndar2 , o e a 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 2 7 9 Recuerda la predilecci´n de Matlab por las columnas. o 60
  • 66. ´ LECCION II Cap´ ıtulo 4. Matlab: programaci´n avanzada o >> dot(a,a2,2) % producto por filas ans = r do rra Bo 6 15 sum: calcula la suma de las entradas un vector. Es aplicable tambi´n a matrices, en el e sentido del comando anterior >> v=[1 2 3]; a=[1 2 3; 4 5 6]; >> sum(v) ans = 6 >> sum(a) % suma por columnas ans = 5 7 >> sum(a,2) 9 % suma por filas ans = 6 15 prod: Como sum pero con el producto. max: Calcula el m´ximo en un vector. Puede devolver su posici´n en el vector. Aplicado a o sobre matrices funciona de la misma forma que dot o sum. Esto es, devuelve el m´ximo de cada columna por defecto, o de cada fila si as´ se le indica a ı >> v=[-2 -5 -3]; a=[2 3 8; -4 2 9]; >> max(v) ans= -2 >> [p,m]=max(abs(v)); [p,m] 61
  • 67. ´ LECCION II 4.1 Retorno a las matrices ans = 5 2 >> max(a) r do rra Bo 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 raz´n por la que se utiliza [] en la l´ o ınea anterior es que esta instrucci´n tambi´n o e se puede utilizar para comparar dos arrays del mismo tama˜o n >> a1=[3 1 2; 5 3 2]; a2=[4 2 1; 1 2 3]; >> max(a1,a2) ans = 4 5 2 3 2 3 Al insertar el vac´ indicamos a Matlab que no existe un segundo vector y que debe ıo proceder a buscar el m´ximo de a en su segunda dimensi´n, esto es, el m´ximo por a o a filas. 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
  • 68. ´ LECCION II Cap´ ıtulo 4. Matlab: programaci´n avanzada o 3.7417 6.0000 3.0000 >> [norm(a) norm(a,1) norm(a,inf)] % normas matriciales ans = r do rra Bo 5.4650 6.0000 7.0000 o En la Secci´n 5.2.3 comentaremos brevemente la definici´n de estas normas. o rank: rango num´rico de una matriz. Esto es, el n´mero m´ximo de filas o columnas e u a 3 linealmente independientes . cond: Calcula norm(a)*norm(inv(a)), el condicionamiento de una matriz4 . El condicionamiento da una medida de la sensibilidad del sistema a perturbaciones en el t´rmino independiente. e rcond: estimador del inverso del condicionamiento de una matriz. Es sensiblemente m´s a econ´mico de calcular que cond. o Nota. Cuando el comando dot se aplica a dos vectores complejos, procede siempre a conjugar el primer vector. Es decir, matem´ticamente a n ui v i . dot(u, v) i=1 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 ¿C´mo sumar´ los elementos de una matriz?. ¿C´mo encontrar´ el m´ o ıas o ıas ınimo y el m´ximo?. ¿Y su posici´n? a o 3 Una matriz tiene, en general, rango m´ximo por los errores de precisi´n de la m´quina. Este comando a o a hace una estimaci´n del rango, eliminando este factor. o 4 En realidad no construye la inversa de la matriz por ser costoso. 63
  • 69. ´ LECCION II 4.1 Retorno a las matrices 4.1.3. Matrices sparse r do rra Bo Las matrices sparse son una importante clase de matrices que surge en diferentes a ´mbitos del An´lisis Num´rico y de las Matem´ticas y ciencias en general (elementos a e a finitos, teor´ de grafos,...). ıa e En la Figura 4.1 se puede ver un ejemplo de una matriz sparse sim´trica donde los puntos indican las entradas diferentes de cero. Desde una ´ptica puramente computacional o hace falta desarrollar sistemas de almacenamiento especiales dado que la inmensa mayor´ ıa de las entradas no deben ser almacenadas porque son nulas. Figura 4.1: Diagrama de un matriz sparse 400 × 400 con 2690 elementos no nulos. Matlab provee de forma muy sencilla ese almacenamiento. Con >>a=sparse(100,100); b=sparse(100,1); declaramos a como una matriz sparse 100×100 y un vector columna b de 100 elementos. Todas las entradas son inicialmente ceros, pero se guarda la estructura b´sica para a introducir los elementos no nulos >> a=sparse(100,100) a = All zero sparse: 100-by-100 >> a(4,4)=1; a(8,9)=-4; a(80,45)=-1; a(99,100)=4; >> a a = 64
  • 70. ´ LECCION II Cap´ ıtulo 4. Matlab: programaci´n avanzada o (4,4) (8,9) (80,45) (99,100) 1 -4 -1 4 r do rra Bo Para transformar una matriz llena (convencional) en una matriz sparse podemos utilizar tambi´n este comando e >> a=diag([1 2 3 4 5]); >> a=sparse(a) a = (1,1) (2,2) (3,3) (4,4) (5,5) 1 2 3 4 5 Con full realizamos la operaci´n inversa: transforma una matriz sparse en una matriz o llena, >> a=full(a) a = 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 5 La instrucci´n spalloc tiene un funcionamiento muy similar a sparse. Es util si se sabe o ´ el n´mero de elementos no nulos que tendr´ dicha matriz. Concretamente u a >> a=spalloc(8,7,12) declara una matriz 8 × 7 con a lo sumo 12 elementos no nulos. Al informar de cu´ntos a elementos no nulos se esperan Matlab hace una gesti´n m´s eficiente de la memoria. o a El comando nnz (Non zeros) nos informa del n´mero de elementos no nulos de una u matriz, mientras que su esquema (pattern), como el que aparece en la Figura 4.1, se obtiene con spy: >> a=sparse(10,10); >> a(1,4)=1; a(2,8)=-4; a(3,9)=1; a(7,8)=5; >> nnz(a) ans= 65
  • 71. ´ LECCION II 4.2 Argumentos de funciones 4 >> spy(a) r do rra Bo La gr´fica se despliega en una ventana separada. a Todas las operaciones que hemos visto est´n adaptadas al nuevo entorno. As´ los a ı, operadores : triu tril diag devuelven vectores/matrices sparse. Las operaciones * + .* dot ’ est´n asimismo optimizadas. El problema de generar c´digo eficiente no es tan simple a o como pudiera parecer. Por ejemplo, si se aplica la funci´n dot a dos vectores sparse es o preciso saber antes qu´ entradas hay que multiplicar. De otra forma podr´ e ıamos estar dedicando un alto porcentaje de nuestro esfuerzo en simplemente calcular productos por cero. Afortunadamente, Matlab hace ese trabajo por nosotros. Por otro lado, aparecen una nueva serie de comandos, que devuelven matrices sparse, entre los que merece la pena destacar spdiags maneja las diagonales de una matriz de forma an´loga a diag; a speye devuelve una matriz diagonal con unos, o similar (an´loga a eye); a spones matriz de 1s, similar a ones; sprand, sprandn construyen una matriz sparse con entradas aleatorias (similar a rand); Ejercicio 4.5 Con la ayuda de Matlab averigua la sintaxis concreta de los comandos anteriores y comprueba con alg´n ejemplo c´mo funcionan. u o 4.2. Argumentos de funciones Veremos a continuaci´n c´mo se pueden programar funciones en las que tanto el o o n´mero de argumentos de entrada como de salida sean variables. Esta caracter´ u ıstica dota de una mayor flexibilidad a la programaci´n en Matlab. o Los comandos esenciales que precisamos son varargin nargin varargout nargout La instrucciones nargin y nargout informan respectivamente sobre el n´mero de variables u de entrada y el n´mero de variables de salida (number of input arguments y number of u output arguments). Una funci´n puede aceptar una serie de argumentos fijos, al estilo de las funciones que o programamos en la lecci´n anterior, y un conjunto de argumentos opcionales, que pueden o 66
  • 72. ´ LECCION II Cap´ ıtulo 4. Matlab: programaci´n avanzada o 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 continuaci´n un ejemplo de utilizaci´n conjunta de estas nuevas instruco o ciones. En la cabecera se informa de qu´ hace la funci´n, dependiendo de los argumentos e o de entrada y salida. r do rra Bo 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 % DESCOMPOSICIONLU % % [L,U] = DESCOMPOSICIONLU(A) % Devuelve U triang superior, L permutacion de una % triang inferior con 1s en la diagonal tal que A=LU % % [L,U,X] = DESCOMPOSICIONLU(A,B) % Devuelve U triang superior, L permutacion de una % triang. inferior con 1s en la diagonal tal % que A=LU y la solucion del sistema AX=B function varargout=DescomposicionLU(a,varargin) [l,u]=lu(a); % descomposicion LU if nargin==1 & nargout==2 varargout{1}=l; varargout{2}=u; elseif nargin==2 & nargout==3 b=varargin{1}; % leemos el primer argumento opcional... varargout{1}=l; varargout{2}=u; varargout{3}=u(lb); % solucion del sistema end Como puede comprobarse, la funci´n precisa de un argumento obligatorio, la matriz o a, uno opcional, el t´rmino independiente, y devuelve dos o tres argumentos seg´n se e u requiera. Observa los resultados que se han obtenido para varios ejemplos: >> a=[1 3; 2 4]; >> [l,u]=DescomposicionLU(a) l = 0.5000 1.0000 1.0000 0 u = 5 Las variables varargin y varargout son de un tipo especial denominado cell array. En la Lecci´n o IV estudiaremos su funcionamiento con m´s detalle. a 67
  • 73. ´ LECCION II 4.2 Argumentos de funciones 2 0 4 1 >> [l,u,x]=DescomposicionLU(a,[1 2].’) r do rra Bo l = 0.5000 1.0000 1.0000 0 u = 2 0 4 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 funci´n anterior implementa una funci´n que opere seg´n la o o u “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
  • 74. ´ LECCION II % % Cap´ ıtulo 4. Matlab: programaci´n avanzada o una triang. inferior con 1s en la diagonal tal que A=LU y la solucion del sistema AX=B Nota: Realizar la comparaci´n A’==A para testar si la matriz es sim´trica. ¿Qu´ devuelve esta o e e comparaci´n? ¿C´mo se puede utilizar para comprobar si efectivamente la matriz es sim´trica? o o e ¿Y para ver que es definida positiva?. r do rra Bo 69
  • 75. ´ LECCION II 4.2 Argumentos de funciones r do rra Bo 70
  • 76. r do rra Bo Cap´ ıtulo 5 Matrices sparse en Matem´ticas. a M´todos iterativos para sistemas de e ecuaciones lineales 5.1. M´todo de Gauss para matrices sparse e Esta secci´n se centra en el estudio del m´todo de Gauss para matrices sparse. Mostraremos o e los problemas que presenta la aplicaci´n de este algoritmo a este tipo de matrices, espeo cialmente el efecto relleno y algunas estrategias de reordenamiento que mitigan estos efectos adversos. Sirve asimismo para ahondar en la problem´tica de los m´todos directos a e y allanar y fundamentar los m´todos iterativos que se tratan en las siguientes secciones. e Recordemos que en Matlab la resoluci´n de sistemas de ecuaciones utilizando o >> x=ab; se basa en el m´todo de Gauss (o alguna de sus variantes). Puede plantearse la cuesti´n de e o si es adecuado utilizar “” para matrices con formas especiales como por ejemplo matrices triangulares o permutaciones de ´stas, para las que la eliminaci´n gaussiana no es necee o saria puesto que las variables se pueden despejar de forma progresiva. Afortunadamente Matlab detecta estas estructuras b´sicas y resuelve de una manera ´ptima el sistema. Si a o se consulta la ayuda para este comando se puede leer que se reconoce si una matriz es, por ejemplo, sparse o llena, sim´trica o no sim´trica, triangular o permutaci´n de ´sta, e e o e bandeada (los elementos concentrados en torno a la diagonal), de Hessenberg1 (con todos los elementos por debajo de la subdiagonal principal nulos), etc., y aplica el m´todo die recto m´s conveniente en cada caso. Testar si una matriz pertenece a uno de estos tipos a se puede realizar en un n´mero de operaciones despreciable respecto a las del m´todo de u e Gauss. Hemos visto al final de la Lecci´n I que el m´todo de Gauss es matem´ticamente o e a equivalente a calcular dos matrices L y U triangular inferior y superior respectivamente con 1s en la diagonal de L de forma que A = LU. 1 Ver Lecci´n IV o 71
  • 77. ´ LECCION II 5.1 M´todo de Gauss para matrices sparse e Si se dispone de esta descomposici´n, la resoluci´n del sistema de ecuaciones se reduce a o o la resoluci´n de dos sistemas triangulares, o Ax = b, Ly = b, U x = y, o en c´digo de Matlab2 o r do rra Bo [l,u]=lu(a); x=u(lb); Una caracter´ ıstica muy habitual del m´todo de Gauss para matrices sparse es el efecto e relleno (en ingl´s fill in), esto es, la inserci´n de nuevos elementos en el proceso. Por e o ejemplo, tras un unico paso del m´todo de Gauss ´ e     x x x x x x x x x x x x  x x   x x x x x       x   x x x x x x   ∼   x   x x x x x x       x   x x x x x x  x x x x x x x y la matriz es ahora llena. Sin llegar a esos extremos, es habitual que las necesidades de memoria se multipliquen al aplicar la eliminaci´n gaussiana. En la descomposici´n o o LU esto se refleja en un incremento en el n´mero de entradas no nulas de la matriz con u los problemas que ello lleva consigo (mayores requerimientos de memoria, mayor costo computacional,...). Vamos a ver como podemos reducir este molesto comportamiento con un reordenamiento adecuado de filas (ecuaciones) y columnas (inc´gnitas). Dado que en aplicao 3 ciones pr´cticas las matrices sim´tricas son muy comunes nos restringiremos en lo que a e sigue a esta familia de matrices. Con el fin de preservar la simetr´ cualquier intercambio ıa, de filas debe ser seguido por el intercambio de columnas correspondientes:     x 0 0 x x x x 0 0 x  0 x x 0 0   x x 0 0 0       0 x x 0 x  1↔ 3  0 0 x x x  −→      x 0 0 x 0   0 0 x x 0  x 0 x 0 x x 0 x 0 x En los comandos symrcm symmmd est´n implementados dos algoritmos de reordenaci´n muy populares: el algoritmo de a o Cuthill-McKee inverso y el algoritmo de m´ ınimo grado. El primero reordena de forma que los t´rminos no nulos de la matriz tienden a estar concentrados cerca de la diagonal. e El algoritmo de m´ ınimo grado por su parte tiende a mover los elementos no nulos hacia el final de la matriz de forma que la estructura inicial de la matriz es esencialmente diagonal y el efecto relleno surge cuando el m´todo de Gauss est´ ya muy avanzado. e a 2 Recuerda la colocaci´n de los par´ntesis. o a O al menos matrices con estructura sim´trica, esto es, a(i, j) = 0 ⇔ a(j, i) = 0. Todo lo que sigue es e igualmente v´lido para este tipo de matrices. a 3 72
  • 78. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos r do rra Bo Figura 5.1: Resultado de reordenar las filas y columnas con symrcm y symmmd. Este tipo de t´cnicas tuvieron su origen en la resoluci´n de ecuaciones en derivadas e o parciales mediante m´todos num´ricos. Un buen ejemplo lo encontramos en la Figura 5.1 e e obtenido al aplicar estas dos reordenaciones a una matriz proveniente de la resoluci´n de la o ecuaci´n de Laplace por elementos finitos. Observa como se reduce el n´mero de entradas o u en las matrices L y U cuando se aplica alguno de los algoritmos anteriores (referido en la figura como nz). La descomposici´n LU debe calcularse sin pivotaje puesto que en otro caso el reoro denamiento que introduce el m´todo de Gauss con pivotaje arruina el orden introducido e con los algoritmos de reordenamiento anteriores. Para ello se debe utilizar el comando >> [l,u]=lu(a,0); El segundo argumento, que s´lo est´ disponible si la matriz a es sparse, fija un umbral o a para la realizaci´n del pivotaje parcial. El valor 1 es el de defecto. De esta forma, valores o pr´ximos a cero obligan a que el pivotaje se produzca s´lo cuando el desequilibrio entre o o 73
  • 79. ´ LECCION II 5.1 M´todo de Gauss para matrices sparse e el pivote y el resto de elementos de la columna sea muy acusado. Surge seguidamente la cuesti´n de estabilidad del m´todo sin pivotaje. Afortunadamente para matrices definidas o e positivas o diagonal dominantes, el m´todo de Gauss sin pivotaje es estable num´ricae e mente. La soluci´n del (o de los) sistemas se lleva a cabo con o Soluci´n con reordenamiento... o r do rra Bo 01 02 03 04 p=symmmd(a); [l,u]=lu(a(p,p)); x=lb(p); x=ux; x(p)=x; % % % % permutacion. vale tb p=symrcm(a); l y u son ahora "mas sparse" resolvemos los dos sistemas triangulares reordenamos las incognitas En la l´ ınea 01, el vector p recoge una permutaci´n de 1:n (n es el n´mero de filas y o u columnas de a) que reduce el efecto relleno de L y U . La matriz a(p,p) es el resultado de reordenar ecuaciones e inc´gnitas. La l´ o ınea 04 reordena las inc´gnitas para recupero arlas en su orden original. Observa que la l´ ınea 03 podr´ sustituirse simplemente por ıa x=u(lb(p)); Nota. A partir de la versi´n 7.0, el comando symmmd que contiene el algoritmo de m´ o ınimo grado se ha declarado obsoleto y ser´ eliminado en futuras versiones. Se recomienda a utilizar symamd. Comentarios finales Si la matriz es adem´s sim´trica definida positiva podemos utilizar la descomposici´n a e o de Cholesky, A = LL donde L es triangular inferior con elementos sobre la diagonal estrictamente positivos. El sistema se reduce ahora a dos sistemas triangulares Ly = b, L x = y. La instrucci´n correspondiente en Matlab es chol, que devuelve R triangular supeo rior de forma que A=R R (es decir, en la notaci´n de estos apuntes, L = R ). As´ el algoritmo anterior, con o ı, reordenaci´n adecuada, queda ahora o Soluci´n con reordenamiento... o 01 02 03 04 p=symmmd(a); r=chol(a(p,p)); x=r’b(p); x=rx; x(p)=x; % % % % permutacion. vale tb p=symrcm(a); r es ahora "mas sparse" resolvemos los dos sist. triang. reordenamos las incognitas 74
  • 80. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos 4 2 1 1 0 x x 0 0 x 0 0 x 0 0 x 0 0 x 1 5 3 x 0 0 0 0 x x x x x 0 x x 0 0 x x 0 x 0 0 x 0 0 x x 0 0 0 0 2 x x 0 0 0 3 0 x x x x x x x x x 5 0 x x x x 4 3 0 x x 0 0 5 0 x x x x 1 x 0 0 0 0 x x 0 0 0 3 0 x x 0 0 5 x x x x x 0 x x x x x 0 0 0 0 x x 0 0 0 x x x x 0 r do rra Bo x x x 0 x 4 2 4 2 1 5 3 x x 0 x 0 4 2 3 5 2 2 1 x 0 0 0 x 3 5 0 x x 0 x 0 x x 0 0 2 4 0 0 0 x x x x 0 x x 1 x 0 0 0 0 3 5 0 x x 0 x 0 x x 0 0 2 4 0 0 0 x x x x 0 x x 1 x 0 0 0 0 3 5 0 x 0 0 0 0 x x 0 x x x x x x 1 x 0 0 0 0 3 1 4 2 4 0 0 0 x x 5 0 x 0 0 0 0 x x 0 0 4 0 0 0 x x x x x x x x 0 0 0 0 0 x 0 0 0 0 x x 0 0 0 0 0 x 0 Figura 5.2: Eliminaci´n gaussiana y su representaci´n como un grafo. Efecto del reordeo o namiento. La orden x=ab realiza todo el proceso anterior de forma autom´tica si a es sparse. a Sin embargo en la forma que lo hemos expuesto podemos resolver reiteradamente sistemas de ecuaciones con la misma matriz de coeficientes al disponer de la descomposici´n LU ´ LL . o o Queda m´s all´ de los contenidos de este curso explicar c´mo funcionan los algorita a o mos implementados en symrcm y symmmd. Se puede se˜alar no obstante que ambos n se basan en identificar la estructura de una matriz con la de un grafo no dirigido, donde dos nodos i y j est´n conectados si y s´lo si a(i,j)=0. El proceso de elima o inaci´n gaussiana se ve como la eliminaci´n sistem´tica de nodos y la creaci´n de o o a o nuevos enlaces entre los nodos restantes. Concretamente, si hacemos un cero con la fila i en la fila j, aparecen nuevos enlaces entre los nodos que estaban unidos con el nodo i y los conectados con j. El problema se reescribe ahora en t´rminos de retirar e los nodos en el orden adecuado de forma que se minimice el n´mero de nuevos ejes u creados (Figura 5.2). Los gr´ficos de la Figura 5.1 han sido creados a trav´s del siguiente fichero script. a e % 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 x x x x x
  • 81. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e [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 r do rra Bo % 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. M´todos iterativos para sistemas lineales e Cuando un sistema de ecuaciones lineales es de tama˜o moderado4 , casi nadie duda n en utilizar el m´todo de Gauss en alguna de sus m´ltiples variantes (incluidas las dee u scomposiciones matriciales). Sin embargo, la utilizaci´n de m´todos iterativos se torna o e imprescindible en problemas con matrices grandes, especialmente si son sparse, donde el m´todo de Gauss presenta las siguientes dificultades: e Es caro: O(4n3 /3) operaciones Es destructivo: retoca la matriz del sistema, y esto puede tener consecuencias muy poco deseables, como hemos visto con matrices sparse. Adem´s requieren en muchas a ocasiones guardar una copia de la matriz. 4 Es dif´ definir qu´ se entiende por tama˜o moderado. Ciertamente, tama˜os enormes en la d´cada ıcil e n n e de los a˜os 70 son ahora perfectamente manejables en un peque˜o PC. n n 76
  • 82. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos Para obtener una soluci´n hace falta realizar todo el proceso: en pasos intermedios o no se dispone de ninguna aproximaci´n de la soluci´n. o o Los m´todos iterativos se introducen como un intento de salvar estas dificultades. e r do rra Bo 5.2.1. Definici´n o Esencialmente, un m´todo iterativo toma un sistema lineal e Ax = b y construye una sucesi´n de vectores de forma que o xm → x, cuando m → ∞. La forma de construir esta sucesi´n depende, obviamente de la matriz A, del t´rmino o e independiente y de c´mo se arranque el m´todo num´rico (vector inicial). o e e Existen multitud de esquemas diferentes pero la mayor´ comparten las siguientes ıa desventajas: No siempre convergen en un n´mero razonable de iteraciones, y en muchas ocasiones u ni siquiera convergen. Los resultados te´ricos sobre convergencia son a menudo pobres. Esto es, en general o existe convergencia en situaciones mucho m´s generales de lo que la teor´ predice. a ıa Adem´s, chequear estas hip´tesis puede resultar tan costoso como resolver el mismo a o sistema. El ultimo punto merece cierto comentario. Los sistemas lineales provienen en general ´ de problemas f´ ısicos de los que se dispone de informaci´n a priori, entre las que se pueden o encontrar las hip´tesis que aseguran la convergencia de un m´todo iterativo. Por ejemplo, o e se puede saber que una matriz es definida positiva, y no hay necesidad por tanto de hacer esta comprobaci´n. o Por contra, los m´todos iterativos tienen las siguientes e importantes ventajas: e Son m´todos no destructivos. No modifican la matriz del sistema y, en general, e precisan s´lo multiplicar por la matriz del sistema o por partes de ella. o Suelen ser m´s estables frente a los errores de redondeo5 . a Se dispone en cada paso de una aproximaci´n de la soluci´n. o o 5 Carl Friedrich Gauss, que introdujo un m´todo precursor del m´todo conocido actualmente como e e m´todo de Gauss–Seidel, comentaba en una carta a su colega Christian Ludwig que los c´lculos se e a pod´ realizar a´n cuando “se estuviese medio dormido” o “pensando en cosas m´s importantes”. No ıan u a hay que olvidar que en su ´poca todos los c´lculos se hac´ a mano. En nuestros d´ se plantea el e a ıan ıas, mismo problema con los errores de redondeo. 77
  • 83. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e 5.2.2. Detalles sobre la implementaci´n o r do rra Bo En un m´todo iterativo no podemos esperar calcular la soluci´n exacta, sino hallar e o una aproximaci´n con una tolerancia prefijada. Por tanto debemos fijar un criterio de o parada que d´ por terminado el m´todo cuando la soluci´n se considere suficientemente e e o buena. Esto no es grave. Los sistemas de ecuaciones lineales suelen provenir de m´todos e que calculan soluciones aproximadas de problemas f´ ısicos e ingenieriles. No tiene pues sentido obcecarse en calcular la soluci´n exacta de un problema aproximado. o As´ hemos de elegir un criterio de parada que termine la ejecuci´n cuando la soluci´n ı o o es suficientemente buena. Una posibilidad es medir la diferencia entre dos iteraciones consecutivas xm+1 − xm en alguna norma que queda a elecci´n del programador o del usuario. Si la diferencia es o peque˜a, se considera que estamos cerca de la soluci´n y se finaliza el m´todo. n o e De nuevo nos encontramos con el problema de definir peque˜o. Por ejemplo, una n diferencia de 1.4 entre dos iteraciones puede ser grande si la soluci´n tiene un tama˜o o n n x ≈ 10−1 o peque˜a si x ≈ 1010 . Por ello se puede hacer un promedio entre el error absoluto y el relativo. Concretamente, si x e y son dos iteraciones consecutivas, se puede fijar el criterio 01 02 03 04 05 aux=norm(x-y); % norma 2 entre x e y if (aux<eps1+eps2*norm(x)) disp(’Convergencia alcanzada...’ .......... end En la l´ ınea 02 tenemos en cuenta tanto el error absoluto (eps1) como el error relativo (eps2). Estos valores son par´metros que fijan el criterio de parada y pueden ser dados a por el usuario. Otros criterios se basan en calcular r = b−Ax y calcular el tama˜o. Es decir, medimos n cu´nto le falta a x para ser soluci´n del sistema. El vector r recibe el nombre de residuo. a o Nos encontramos de nuevo con dos componentes del residuo, el primero relacionado con su tama˜o relativo, con respecto al t´rmino independiente, y otra absoluta. Ambos n e se pueden controlar con 01 02 03 04 05 aux=norm(b-a*x); % residuo if (aux<eps1+eps2*norm(b)) disp(’Convergencia alcanzada...’ .......... end Este criterio puede ser preferible si se dispone ya del residuo y no hay que calcularlo ex profeso. En muchos casos se toma simplemente eps1= 0. Por otro lado, y desde un punto de vista computacional, debemos evitar que el m´todo e entre en un bucle infinito. Es decir, fijar un n´mero m´ximo de iteraciones de forma que u a si se supera, se termine el m´todo con un mensaje de error6 . Que un residuo sea peque˜o e n 6 Existe otro problema: que la soluci´n crezca de forma que supere la cantidad m´xima representable o a en coma flotante (overflow). Matlab devolver´ inf o -inf. ıa 78
  • 84. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos o que dos iteraciones consecutivas cercanas indiquen proximidad a la soluci´n exacta no o siempre es cierto, pero suele ser muy buena se˜al. n 5.2.3. M´todos iterativos cl´sicos e a r do rra Bo El estudio y desarrollo de los m´todos iterativos cl´sicos, tambi´n denominados afines e a e por su forma de construcci´n, surgi´ con fuerza en los a˜os 50, aunque el origen de alguno o o n de ellos se remonta al siglo XIX. El desarrollo de estos m´todos fue paralelo al desarrollo e de los ordenadores y vino muy condicionado por el tipo de problemas que se deseaban resolver. Estos problemas eran principalmente los provenientes de ecuaciones en derivadas parciales que daban lugar a matrices grandes y sparse. El uso de los m´todos iterativos e afines en nuestros d´ es menos habitual, habiendo sido superados por los m´todos de tipo ıas e Krylov de los que el Gradiente Conjugado es sin lugar a dudas el representante m´s popa ular. De hecho, los m´todos cl´sicos se utilizan en la actualidad como precondicionadores e a de los m´todos m´s modernos y potentes, es decir, como un preproceso que acelera la e a convergencia de los mismos. Sin embargo su simplicidad y el modo que tienen de ilustrar el dise˜o y funcionamiento de un m´todo iterativo fundamentan su exposici´n en estos n e o apuntes. Conocimientos previos Comenzaremos introduciendo algunas normas vectoriales que nos servir´n para medir a el tama˜o de los vectores y matrices. Dado un vector n x := (x1 , x2 , . . . , xn ) ∈ Rn consideramos las normas x x 1 ∞ := |x1 | + |x2 | + . . . + |xn |, x 2 := x2 + x2 + . . . + x2 , 1 2 n m´x |xi |. a := i=1,...,n Es f´cil ver que efectivamente las tres expresiones definen una norma en Rn . Las relaciones a entre ellas vienen dadas por las cotas √ √ x 2 ≤ x 1 ≤ n x 2, x ∞ ≤ x 1 ≤ n x ∞, x ∞ ≤ x 2 ≤ n x ∞. Observa que sin embargo estas constantes de equivalencia dependen de n. Todas ellas est´n implementadas en Matlab, como ya se vio en la Secci´n 4.1.2. a o Cada norma vectorial define a su vez una norma sobre las matrices A = sup Ax x =1 denominada norma matricial inducida. En la expresi´n anterior sup es el supremo o sobre todos los vectores de norma 1, que es de hecho un m´ximo (el supremo se alcanza). a Se puede comprobar que n A 1 |aij |, = m´x a j=1,...,n n A i=1 79 ∞ |aij |. = m´x a i=1,...,n j=1
  • 85. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e La norma concreto · 2 tiene una expresi´n m´s complicada que dificulta su c´lculo pr´ctico. En o a a a A 2 ρ(A A) = r do rra Bo donde ρ(B), denominado radio espectral, denota el mayor de los valores absolutos de los valores propios de B (ver Lecci´n IV). Si A es sim´trica, se tiene simplemente que o e A 2 = ρ(A). En cualquier caso, el comando norm de Matlab aplicado a matrices devuelve las correspondientes normas matriciales: >> norm(a,1) >> norm(a,inf) >> norm(a,2) % norma 1 % norma infinito % norma 2. Vale tambien norm(a) Una norma vectorial y su norma matricial inducida se relacionan mediante Ax norma vectorial ≤ A x norma matricial . norma vectorial Es decir, A mide el m´ximo alargamiento que multiplicar por A puede producir en un a vector medido en la norma · . Definici´n y condiciones de convergencia o Los m´todos iterativos lineales (o basados en iteraciones afines) comienzan considerane do una partici´n de A tal que o A=M −N con M invertible. As´ si x es soluci´n de Ax = b, ı, o M x = N x + b. El m´todo iterativo consiste en e Tomar x0 una aproximaci´n de la soluci´n. Si no se conoce se puede tomar por o o ejemplo el vector nulo. Resolver en cada paso m M xm+1 = N xm + b. (5.1) Es f´cil ver que si la sucesi´n construida en (5.1) converge a alg´n x, entonces el vector a o u es la soluci´n del sistema. A´n es m´s, se comprueba f´cilmente que o u a a xm+k+1 − x = (M −1 N )(xm+k − x) = . . . = (M −1 N )k (xm+1 − x). Denotando por B = M −1 N se tiene el siguiente resultado Teorema 5.1 El m´todo iterativo converge si y s´lo si existe k tal que B k < 1. e o 80
  • 86. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos r do rra Bo Observa que en el resultado anterior no se especifica la norma utilizada. Otro detalle al que a veces se presta poca atenci´n es que la convergencia del m´todo ocurre sea cu´l sea o e a x0 , es decir, independientemente de c´mo se arranque el m´todo y de cu´l sea el t´rmino o e a e independiente. Claramente si se tiene una estimaci´n buena de la soluci´n el m´todo o o e converger´ en menos iteraciones, pero no es una condici´n imprescindible para asegurar a o la convergencia7 . No es dif´ ver que ıcil ρ(B) ≤ B para cualquier norma inducida, y por tanto8 ρ(B) = (ρ(B k ))1/k ≤ ( B k )1/k ∀k ∈ N. Es m´s, se puede probar que, de nuevo para toda norma inducida, a l´ ım B k 1/k k→∞ = ρ(B) Por tanto se concluye que una condici´n equivalente de convergencia es que todos o los valores propios de B = M −1 N tengan valor absoluto menor estrictamente que 1. Teorema 5.2 El m´todo iterativo converge si y s´lo si ρ(B) < 1. e o 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 asint´tica de convergencia. La estimaci´n o o anterior justifica esta denominaci´n dado que mide la reducci´n media del error esperada o o en cada iteraci´n. o Nota. Si M = A entonces N = 0, por tanto B = 0 y trivialmente ρ(B) = 0. Es decir, hay convergencia en una unica iteraci´n. Esta iteraci´n consiste en resolver ´ o o directamente el sistema de ecuaciones. En general, uno asegura la convergencia cuando M recoge la informaci´n m´s imporo a tante de A, de forma que N = M − A tenga un tama˜o peque˜o comparado con M . Por n n otro lado, se debe tener en cuenta la definici´n del m´todo (5.1) y que por tanto en cada o e iteraci´n hay que resolver un sistema de ecuaciones. As´ interesa que M sea sencilla desde o ı, el punto de vista de la resoluci´n del sistema lineal (por ejemplo, diagonal, triangular,...) o y que simult´neamente recoja la mayor informaci´n posible de A. a o 7 Esta propiedad se pierde cuando se resuelven ecuaciones y sistemas no lineales. En este caso, los m´todos num´ricos convergen s´lo si se arranca suficientemente cerca de la soluci´n. e e o o 8 Si λ es valor propio de B, λ2 lo es de A2 . 81
  • 87. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e M´todos de Jacobi, de Gauss–Seidel y de relajaci´n de Young e o Sea el sistema Ax = b donde  r do rra Bo   A=   . . . a1n . . . a2n   .  .. .  . . . . . ann a11 a12 a21 a22 . . . . . . an1 an2 La familia de m´todos que vamos a exponer se basa en considerar la siguiente descome posici´n de A o A=D−L−U donde   a11   D =  a22 ..      , L =    . ann 0 −a21 . . . ··· ··· .. . 0 0 . . .  0 0 . . .      , U =    −an1 −an2 · · · 0 0 −a12 0 0 . . . . . . 0 0 · · · −a1n · · · −a2n . .. . . . ··· 0    .  El m´todo de Jacobi consiste en tomar en la definici´n del m´todo iterativo M = D e o e y N = L + U , es decir, Dxm+1 = (L + U )xm + b. Para calcular xm+1 hay que resolver por tanto un sistema diagonal cuyo coste es despreciable. Visto componente a componente, tenemos que si (m) (m) xm = x1 , x2 , . . . , x(m) n entonces (m+1) xi = 1 bi − aii (m) aij xj ∈ Rn , i = 1, . . . , n. j=i Para algunos tipos especiales de matrices se sabe que el m´todo converge e incluso se e dispone de informaci´n sobre la velocidad de convergencia. o Una matriz es estrictamente diagonal dominante por filas si |aii | > |aij |, ∀i |aij |, ∀j. j=i y por columnas si |ajj | > i=j Teorema 5.3 Si la matriz es estrictamente diagonal dominante por filas o columnas el m´toe do de Jacobi converge. Ejercicio 5.1 (matem´tico) Probar el teorema anterior. ¿Cu´ndo converger´ m´s r´pido? a a a a a (Ayuda. Construir la matriz B = D−1 (L + U ). Probar que B ∞ < 1 si es dominante por filas o ´ B 1 < 1 si es dominante por columnas. Aplicando el Teorema 5.2, se deduce el resultado.) 82
  • 88. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos Para dar una descripci´n del m´todo de Jacobi en pseudoc´digo fijamos o e o x = aproximaci´n inicial, o eps1 = tolerancia absoluta, mmax = eps2 = n´mero m´ximo de iteraciones, u a tolerancia relativa, r do rra Bo y tomamos como criterio de parada la norma eucl´ ıdea de la diferencia entre dos iteraciones sucesivas del m´todo. La elecci´n de la norma es libre, queda a elecci´n del programador e o o (pod´ ıamos tomar por ejemplo la norma 2 o la norma infinito). Una primera versi´n de nuestro algoritmo es la siguiente o Jacobi 01 02 03 for m=1:mmax error=0; y=x for i=1:n 04 x i = bi − n aij yj /aii j=1 j=i 05 06 07 08 09 10 11 end if x − y 2 <eps1+eps2*norm(x) return end end disp(’numero m´ximo de iteraciones alcanzado’) a return Ejercicio 5.2 Implementa el m´todo de Jacobi en Matlab. e Soluci´n. Empezaremos fijando la cabecera que contendr´ la ayuda de la funci´n. Nos o a o va a servir de qu´ estructura vamos a dar a la entrada y salida de datos. Dicho esto, la e implementaci´n de este m´todo que proponemos es la siguiente o e 01 02 03 04 05 06 07 08 09 10 11 12 % JACOBI % % X = % % %[X,IT]= % % %[X,IT]= % %[X,IT]= % JACOBI(A,B) aplica el metodo de Jacobi para la resolucion del sistema AX=B JACOBI(A,B) devuelve en IT el numero de iteraciones calculadas JACOBI(A,B,ITMAX) ITMAX es el numero max. de iteraciones JACOBI(A,B,ITMAX,... EPS1,EPS2 son las tolerancias EPS1,EPS2 absoluta y relativa 83
  • 89. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e % %[X,IT]= JACOBI(A,B,ITMAX,... % EPS1,EPS2,X0) arranca el metodo con X0 % function [x, varargout]=jacobi(a,b,varargin) r do rra Bo 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 % valores por defecto n=length(a); mmax=100; eps1=1e-4; % tolerancia absoluta eps2=1e-4; % tolerancia relativa x=zeros(n,1); if nargin>2 mmax=varargin{1}; end if nargin>3 eps1=varargin{2}; end if nargin>4 eps2=varargin{3}; end if nargin>5 x(:)=varargin{4}; %x es un vector columna end % Metodo de Jacobi for m=1:mmax error=0; y=x; for i=1:n v=[1:i-1 i+1:n]; x(i)=(b(i)-a(i,v)*y(v))/a(i,i); end error=norm(x-y); % otras normas con norm(x-y,1),norm(x-y,inf) if (error<eps1+eps2*norm(x)) break end end if (m==mmax) disp(’numero maximo de iteraciones sobrepasado’) end %salida if (nargout>1) varargout{1}=m; 84
  • 90. ´ LECCION II 59 60 Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos end return Recuerda que el comando break, utilizado en la l´ ınea 48 provoca la salida autom´tica a del bucle, dando por finalizado la ejecuci´n del m´todo y pasando a la parte del c´digo o e o encargada de devolver los resultados obtenidos. r do rra Bo Ejercicio 5.3 Programa una nueva opci´n de salida que devuelva un vector error de lono gitud m − 1 de forma que error(m) sea la diferencia entre xm y xm+1 . Observa que el c´digo realmente dedicado al m´todo de Jacobi se reduce a apenas diez o e l´ ıneas (39-50) con el resto de la subrutina dedicada al control del algoritmo y a la salida y entrada de datos. Se observa adem´s que la l´ a ınea 43 permite implementar en una unica ´ l´ ınea (44) el producto de la l´ ınea 04 del pseudoc´digo. o El c´digo anterior, sin embargo, es optimizable. El ejercicio siguiente ahonda en un o aspecto en particular Ejercicio 5.4 Otra forma alternativa de implementar el m´todo es reemplazar las l´ e ıneas 42-45 por el producto x=(b-a*y+d.*y)./d o bien x=y+(b-a*y)./d donde d es un vector columna que contiene la diagonal de la matriz. Observa que realizamos operaciones de m´s (multiplicamos por la diagonal para luego restar su contribuci´n), pero a o el costo es despreciable y la operaci´n es ahora puramente matricial. Implementa esta nueva o forma y comprueba el resultado. ¿Obtienes mejoras en el redimiento del m´todo9 ? e El m´todo de Gauss–Seidel10 consiste en tomar M = D − L y N = U , es decir e (D − L)xm+1 = U xm + b. (5.2) Para calcular xm+1 hay que resolver un sistema, en este caso triangular. Repasando con cuidado las operaciones, observamos que (m+1) xi 1 = bi − aii i−1 n (m+1) aij xj (m) − j=1 aij xj , i = 1, . . . , n. j=i+1 9 Deber´s probar con matrices grandes. La orden rand te puede servir para ese fin. Una forma de a asegurar la convergencia es generar matrices estrictamente diagonal dominantes. ¿C´mo se puede hacer o esto?. 10 El nombre de este algorimo es muy curioso. Seg´n diversos autores (ej. George E. Forsythe ´ Gerard u o Meurant), Carl Friedrich Gauss no dise˜´ exactamente este m´todo y Philipp Ludwig von Seidel, que lo no e estudi´ a finales del siglo XIX, desaconsejaba su uso. Gauss desarroll´ un m´todo muy similar cuando o o e trataba de resolver un problema de geodesia que llevaba a un sistema lineal que no era compatible determinado. 85
  • 91. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e Escrito en forma algor´ ıtmica, Gauss–Seidel for m=1:mmax error=0; y=x for i=1:n r do rra Bo 01 02 03 i−1 x i = bi − 04 n aij xj − j=1 05 06 07 08 09 10 11 aij yj /aii j=i+1 end if x − y <eps1+eps2*norm(x) return end end disp(’numero m´ximo de iteraciones alcanzado’) a return As´ pues, la unica diferencia con el m´todo de Jacobi es que Gauss–Seidel procede a ı ´ e utilizar la nueva componente calculada xi tan pronto es posible mientras que Jacobi s´lo o la utiliza en la nueva iteraci´n. Es por ello que Gauss–Seidel es (casi siempre) superior a o Jacobi. No hay razones matem´ticas que permitan apoyar esta impresi´n. De hecho existen a o matrices para las que Jacobi converge y Gauss–Seidel diverge, aunque hace falta construir un ejemplo ad hoc, no es f´cil encontrar tal ejemplo, para comprobar esta afirmaci´n. a o Desde un punto de vista pr´ctico, si Jacobi converge es altamente probable que lo haga a tambi´n Gauss–Seidel y generalmente, ´ste lo har´ en menos iteraciones. e e a Teorema 5.4 El m´todo de Gauss–Seidel converge si e la matriz es estrictamente diagonal dominante por filas o columnas; o la matriz es sim´trica definida positiva. e Ejercicio 5.5 Programa el m´todo de Gauss–Seidel modificando de forma apropiada la fune ci´n del Ejercicio 5.2. o Ejercicio 5.6 De manera similar a lo que se propuso en el Ejercicio 5.4, podemos implementar la parte central del m´todo de Gauss–Seidel mediante e x=l(b-u*y) o bien con el doble n´mero de operaciones con u x=y+l(b-a*y) donde 86
  • 92. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos l=tril(a,0); u=triu(a,1); Implementa el m´todo resultante. ¿Qu´ ventajas y desventajas observas en cada de estas e e implementaciones?. (Ayuda: recuerda los comandos diag, triu y tril de la Secci´n 4.1.3) o r do rra Bo Ejercicio 5.7 El m´todo de Gauss–Seidel tiene una curiosa asimetr´ la primera componente e ıa: de cada xm+1 se calcula utilizando los valores de la anterior iteraci´n xm , mientras que la ultima o ´ componente utiliza todas las componentes de la nueva iteraci´n xm+1 . Se puede plantear el o m´todo de Gauss–Seidel inverso que es el que resulta de intercambiar los papeles de L y U en e o ıproca. ¿Mejora la velocidad de convergencia del (5.2). Ahora la situaci´n es justamente la rec´ m´todo? e Ejercicio 5.8 El m´todo de Gauss–Seidel simetrizado o c´ e ıclico trata de solventar la asimetr´ ıa se˜alada en el ejercicio anterior. Consiste en encajar dos iteraciones, una con Gauss–Seidel y n otra con el m´todo de Gauss–Seidel inverso. Es decir, dado xm , se aplica un paso del m´todo e e de Gauss–Seidel para obtener un nuevo vector xm+1/2 . Seguidamente se calcula un paso del m´todo Gauss–Seidel inverso y as´ obtiene la nueva aproximaci´n xm+1 . e ıse o Implementa este m´todo. ¿Se reduce el n´mero de iteraciones necesarias para alcanzar la e u convergencia? ¿Y el costo por iteraci´n? ¿Te parece rentable esta aproximaci´n?. o o El ultimo representante de esta familia de m´todos cl´sicos que estudiaremos es el ´ e a m´todo de relajaci´n de Young. Introducido y estudiado independientemente por e o David M. Young (en su tesis doctoral) y Stanley P. Frankel sobre 1950, es una simple modificaci´n del m´todo de Gauss–Seidel que trataba, como buena parte de los m´todos o e e propuestos en estos a˜os, de acelerar la convergencia de los m´todos de Gauss–Seidel y n e Jacobi. La modificaci´n propuesta consiste en realizar un promedio sobre la aproximaci´n que o o proporcionar´ Gauss–Seidel y la iteraci´n anterior. ıa o Concretamente, la expresi´n es o (m+1) xi = (1 − (m) ω)xi ω bi − + aii i−1 n (m+1) aij xj j=1 (m) − aij xj , i = 1, . . . , n. j=i+1 Si ω = 1 recuperamos el m´todo de Gauss–Seidel. El objetivo es escoger ω adecuadamente e para acelerar la convergencia del m´todo. e No es f´cil encontrar el valor ´ptimo de ω, aunque necesariamente ω ∈ (0, 2) pues en a o caso contrario el m´todo diverge. e Si la matriz es sim´trica definida positiva o tridiagonal el m´todo de relajaci´n converge e e o para cualquier ω ∈ (0, 2). Tambi´n converge si es estrictamente diagonal dominante (por e filas o columnas). Sin embargo, salvo para matrices tridiagonales, poco se puede decir acerca de la elecci´n ´ptima del par´metro ω, y a´n en este caso, la determinaci´n exacta o o a u o del par´metro ´ptimo exige resolver un problema bastante complicado. a o Desde un punto de vista pr´ctico, el par´metro se estima mediante ensayo–error. De a a forma algo sorprendente, en problemas pr´cticos es muy habitual que ω > 1. De ah´ el a ı nombre que se le da a veces de Sobrerrelajaci´n (overrelaxed). o 87
  • 93. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e Por ultimo, aunque no sea inmediato, se puede comprobar que este m´todo encaja en ´ e el marco anterior, sin m´s que tomar a M= 1 D − L, ω N= 1−ω D+U ω r do rra Bo Ejercicio 5.9 Implementa el m´todo de relajaci´n de Young a partir del m´todo de Gauss– e o e Seidel. Incluye como nuevo argumento de entrada el par´metro ω. Un posible valor por defecto a podr´ ser ω = 1 con lo que tendr´ ıa ıamos el m´todo de Gauss–Seidel. e Ejercicio 5.10 De nuevo, la parte central del m´todo de relajaci´n se puede implementar e o en la forma x=y+m(b-a*y) donde m es una matriz adecuada. ¿Cu´l es esa matriz?. a 5.2.4. M´todos de tipo gradiente e Comenzaremos recordando algunos conceptos e introduciendo algunas notaciones que facilitar´n la exposici´n de los m´todos de tipo gradiente. a o e Recordemos que todos los vectores se consideran como vectores columna. Dada A una matriz sim´trica definida positiva, la operaci´n que a cada par de vectores x, y le e o asigna el n´mero real u 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 sim´trica); e 3. x Ax > 0, si x = 0 (por ser A definida positiva). En particular, si In es la identidad n × n, x In y = x y es simplemente el producto escalar habitual en Rn de x e y. Denotaremos x⊥y ⇐⇒ x y=0 y diremos en este caso que x e y son ortogonales. La misma notaci´n se puede extender o al producto definido por A, de forma que x ⊥A y ⇐⇒ x Ay = 0 y en este caso x e y se dicen A−ortogonales. 11 Es interesante observar cu´ntas propiedades del producto escalar eucl´ a ıdeo (el habitual en Rn ) dependen unicamente de que se cumplan estas tres propiedades y por tanto son extensibles a estos casos m´s ´ a generales. 88
  • 94. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos La norma asociada al producto escalar anterior se conoce como norma de energ´ ıa y su expresi´n viene dada, obviamente, por o √ x A := x Ax. r do rra Bo Todas las normas son equivalentes en Rn , pero para esta norma se tiene adem´s la estia maci´n o λn x 2 ≤ x A ≤ λ1 x 2 donde λ1 ≥ λ2 ≥ .... ≥ λn > 0 son los valores propios, todos reales por ser A sim´trica y e positivos por ser definida positiva. La cantidad κ(A) = λ1 , λn que ser´ relevante en lo que sigue, es el condicionamiento de la matriz12 . Obviamente, a κ(A) ≥ 1. Construimos la funci´n o F (x) = 1 x Ax − x b 2 conocida como funcional de energ´ Tras unos simples c´lculos, se comprueba que ıa. a F = Ax − b. Por tanto, el unico posible extremo de F es la soluci´n de Ax − b = 0. Adem´s, como la ´ o a matriz hessiana de F es la propia matriz A, que es definida positiva, este extremo ser´ un a m´ ınimo. Hemos llegado por tanto a la siguiente conclusi´n: o resolver Ax = b es equivalente a encontrar el m´ ınimo de F En esta observaci´n se basan los m´todos de descenso: en lugar de resolver el sistema de o e ecuaciones Ax = b, nos preocupamos en buscar el m´ ınimo de F . Es esencial que A sea definida positiva para que estos argumentos sean v´lidos. a M´todos de descenso. Aspectos generales e La idea de estos m´todos es sencilla. Dado un valor inicial consiste en ir movi´ndose e e en trayectorias zigzagueantes hasta alcanzar el m´ ınimo. Concretamente, dada una aproximaci´n, fijamos una direcci´n de desplazamiento, calculamos cuanto nos movemos, deo o scender en el lenguaje habitual, y nos desplazamos a un nuevo punto. De esta forma construimos una sucesi´n xm que deber´ converger a x, siguiendo estos o ıa pasos. Calcular una direcci´n de descenso dm . o Descender una cantidad ξm , tomando como nueva aproximaci´n o xm+1 = xm + ξm dm . 12 El condicionamiento se define tambi´n para matrices arbitrarias reemplazando los valores propios por e los denominados valores singulares, o m´s en general, defini´ndolo como el producto de la norma de A a e por la norma de su inversa. En general el condicionamiento de la matriz mide la sensibilidad del sistema de ecuaciones lineales asociado a variaciones del t´rmino independiente. e 89
  • 95. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e Se procede as´ hasta que hay convergencia. ı Dos aspectos determinan el m´todo: qu´ direcci´n se toma y cu´nto se desciende. Tanto e e o a en el m´todo del Gradiente como en el m´todo del Gradiente Conjugado, que veremos a e e continuaci´n, se toma ξm de forma que o r do rra Bo F (xm+1 ) = m´ F (xm + α dm ) ın α∈R es decir, se trata de minimizar, una vez escogida la direcci´n de descenso dm , el funcional o de energ´ Definiendo ıa. g(α) = F (xm + α dm ) podemos comprobar que g (α) = α dm Adm − dm (b − Axm ) rm y por tanto la cantidad de descenso viene dada por ξm := r m dm , dm Adm (5.3) (obtenido al imponer g (α) = 0). El vector rm = b − Axm es el residuo de xm , que ya ha surgido en estas notas. Se puede probar f´cilmente que a rm+1 = b − Axm+1 = b − Axm − ξm Adm = rm − ξm Adm . En consecuencia, el residuo en pasos sucesivos satisface una relaci´n similar a la que o cumple xm . Sin embargo, este tipo de recurrencia puede verse afectada por errores de redondeo, por lo que en ocasiones el residuo se recalcula cada cierto n´mero de iteraciones u de acuerdo a su definici´n para cancelar cualquier error de redondeo. o El algoritmo resultante es el siguiente: M´todo de descenso e 01 02 03 04 05 06 07 x0 inicial, r0 = b0 − Ax0 for m=0:mmax Escoger dm r dm ξm := m dm Adm xm+1 = xm + ξm dm rm+1 = rm − ξm Adm end Claramente, la l´ ınea 03 queda pendiente y en ultima medida define el m´todo. ´ e 90
  • 96. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos M´todo del Gradiente e Dado que − F (xm ) = b − Axm = rm , la direcci´n de m´ximo descenso es la del o a residuo. Por tanto, ´sta parece una buena elecci´n para dm . El m´todo as´ definido es el e o e ı m´todo del gradiente. e r do rra Bo M´todo del Gradiente e 01 02 03 x0 inicial; r0 = b − Ax0 ; for m=0:mmax pm = Arm rm rm r m pm xm+1 = xm + ξm rm rm+1 = rm − ξm pm if rm+1 ≤ eps b break end ξm = 04 05 06 07 08 09 10 end En el paso 06 estamos calculando el residuo de la soluci´n. El criterio de parada se o toma ahora a partir del residuo. En concreto hemos escogido el basado en el tama˜o n relativo del residuo (eps b ). La norma que utilizamos es la eucl´ ıdea, que es connatural al m´todo. e Ejercicio 5.11 Programa el M´todo del Gradiente. e Soluci´n. Una posible implementaci´n del m´todo es la que sigue o o e 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 % GRADIENTE % % X = GRADIENTE(A,B) % % % X = GRADIENTE(A,B,ITMAX) % % X = GRADIENTE(A,B,ITMAX... % EPS) % % X = GRADIENTE(A,B,ITMAX... % EPS, X0) % %[X,IT] = GRADIENTE(A,B,ITMAX... % EPS,XO) 91 Aplica el met. del gradiente para la resolucion del sistema AX=B ITMAX: numero max. de iteraciones EPS tolerancia relativa X0 es el valor inicial Devuelve en IT el numero de iteraciones calculadas
  • 97. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e %[X,IT,R]= GRADIENTE(A,B,ITMAX) % EPS,XO) R es un historial del metodo: R(i) es el residuo en el paso i function [x,varargout]= gradiente(a,b,varargin); r do rra Bo 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 n=length(a); x=zeros(n,1); mmax=40; tol=1e-6; if nargin>2 mmax=varargin{1}; end if nargin>3 tol=varargin{2}; end if (nargin>4) x=varargin{4}; end r=b-a*x; res(1)=dot(r,r); aux=norm(b); for m=1:mmax p=a*r; xi=res(m)/dot(r,p); x=x+xi*r; r=r-xi*p; res(m+1)=dot(r,r); % guardamos los residuos if (sqrt(res(m+1))<tol*aux); break end end if (m==mmax) disp(’numero maximo de iteraciones sobrepasado’) end if nargout>1 varargout{1}=m; end if nargout>2 varargout{2}=sqrt(res(:)); end return El vector res guarda el residuo en cada iteraci´n para as´ tener un historial de como o ı ha ido la convergencia. Prueba el m´todo con un sistema donde la matriz sea sim´trica definida positiva (nota: e e para toda matriz B, B B es sim´trica (semi) definida positiva.) e 92
  • 98. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos La gr´fica mostrada en la Figura 5.3 se ha construido utilizando las instrucciones a 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) r do rra Bo >> >> >> >> Hemos utilizado una escala logar´ ıtmica para medir la norma del residuo. Observa su fuerte comportamiento oscilatorio. 10 10 10 10 10 10 10 Residuo 4 3 2 1 0 −1 −2 0 10 20 30 40 50 60 70 Iteraciones Figura 5.3: Historial del residuo para el m´todo del Gradiente. e Ejercicio 5.12 En este ejercicio tratamos de nuevo aspectos de la implementaci´n en Mato lab. Concretamente, ¿qu´ pasa si el usuario desea especificar el vector de arranque (x0 en e la notaci´n del m´todo) pero desea dejar el n´mero m´ximo de iteraciones y la tolerancia o e u a por defecto?. Como est´ndar en Matlab, se env´ vac´ ([ ]), de forma que los argumentos a ıa ıo intermedios se ignoran. Por ejemplo, >> x=gradiente(a,b,[],1e-5) especificar´ la tolerancia pero no el n´mero m´ximo de iteraciones. Implementa las modifiıa u a caciones necesarias en el programa anterior para que la funci´n soporte este est´ndar. o a (Ayuda: La funci´n isempty puede resultarte util.) o ´ Breves notas sobre el estudio del M´todo del Gradiente e La clave del an´lisis es la relaci´n a o 1 F (xm+1 ) − F (x) = 2 (xm+1 − x) A(xm+1 − x) = 93 1 2 xm+1 − x em+1 2 A
  • 99. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e donde claramente em+1 es el error entre la soluci´n exacta y la num´rica medido en la o e norma de energ´ de A. Por tanto, como F (xm+1 ) ≤ F (xm ), ıa em+1 A ≤ em A r do rra Bo luego en cada iteraci´n hay una reducci´n del error en la norma de energ´ Sin embargo, o o ıa. en ning´n caso implica que el residuo se reduzca en cada iteraci´n, como bien podemos u o u a o comprobar en la Figura 5.3. A´n es m´s, de la elecci´n hecha de ξm se sigue que F (xm+1 ) := m´ F (xm + α rm ) ın α∈R y por tanto em+1 A ≤ m´ x − xm − α rm ın α∈R A = m´ em − αAem ın A α∈R Observa que hemos utilizado la cota M x vectorial y su norma matricial inducida. A ≤ M A x A, ≤ m´ I − αA ın α∈R A em A. caracter´ ıstica de toda norma Proposici´n 5.5 Sean λ1 y λn el mayor y menor valor propio de A. Entonces o m´ I − αA ın α∈R A = m´ I − αA ın α∈R 2 = λ1 − λ n < 1. λ1 + λ n La convergencia se escribe de forma muy c´moda en t´rminos del condicionamiento o e λ1 o de la matriz κ(A) = λn , deduciendo la expresi´n em+1 A ≤ κ(A) − 1 em κ(A) + 1 A. Es inmediato observar que El factor de reducci´n del error es siempre menor que uno, luego hay convergencia o para toda A sim´trica definida positiva. e Si κ(A) >> 1, la convergencia puede ser muy lenta. Ejercicio 5.13 (puramente matem´tico) Se puede probar que dada A sim´trica definida a e positiva existe B sim´trica definida positiva tal que BB = B 2 = A, conocida como ra´ e ız cuadrada de A. Utilizando este resultado prueba la identidad I − αA A = I − αA 2 utilizada en la Proposici´n 5.5. o (Ayuda: Observa que x I − αA A A = Bx 2 . Utiliza ahora que = sup x (I − αA)x A = sup A =1 Bx =1 y completa la demostraci´n). o 94 B(I − αA)B −1 (Bx) 2
  • 100. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos Ejercicio 5.14 (demostraci´n de la Proposici´n 5.5) Para toda matriz sim´trica C o o e se cumple que C 2 = m´x |λj | a j con λj el valor propio j−´simo. Por tanto e r do rra Bo I − αA A = I − αA 2 = m´x |1 − αλj |. a j Define gc (α) = |1 − c α| y traza la gr´fica de estas funciones para varios valores de c. Deduce a que α = 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 obtendr´s obtendr´s algo similar a esto a a 1 0.5 0 0 1 2 α 3 4 5 ¿Cu´les son las gr´ficas de los valores extremos?) a a El Gradiente Conjugado El m´todo del Gradiente Conjugado trata de resolver alguna de las dificultades obsere vadas con el m´todo del Gradiente, como por ejemplo el comportamiento oscilatorio del e residuo. Observemos que en un m´todo de descenso, y por la elecci´n de ξm hecha en (5.3), e o rm+1 dm = rm dm − ξm dm Adm = 0, por lo que rm+1 ⊥ dm . Esto es, en un m´todo de descenso el residuo del paso m + 1 es e ortogonal a la direcci´n de descenso anterior. o Sin embargo, en general ya no es cierto que rm+1 ⊥ dm−1 y por tanto se pierde esta propiedad de ortogonalidad. 95 (5.4)
  • 101. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e Una forma de evitar, o de mitigar, el aspecto oscilante del m´todo del Gradiente, es e exigir que la direcci´n de descenso dm satisfaga (5.4). Es decir, tomamos o rm+1 = rm − ξm Adm , r do rra Bo y concluimos que dm−1 rm+1 = 0 ⇐⇒ dm−1 ⊥ Adm ⇐⇒ dm−1 ⊥A dm . En vista de lo anterior optamos por tomar como direcci´n de descenso una perturbaci´n o o de la direcci´n natural rm (el residuo) en la direcci´n del descenso anterior (dm−1 ) que o o satisfaga la propiedad de ortogonalidad anterior. Es decir, tomamos dm = rm + τm dm−1 con τm adecuado. Exigiendo que se satisfaga (5.4) deducimos que dm ⊥A dm−1 ⇐⇒ rm Adm−1 + τm dm−1 Adm−1 = 0 ⇐⇒ τm = − rm Adm−1 . dm−1 Adm−1 Como elecci´n inicial de la direcci´n de descenso tomamos simplemente r0 , el residuo o o de la aproximaci´n inicial. Con todo esto, la primera versi´n del m´todo del Gradiente o o e Conjugado es la que sigue Gradiente Conjugado - Primera versi´n o 01 02 03 x0 inicial; r0 = b − Ax0 ; d0 = r0 ; for m=0:mmax pm = Adm r m dm dm pm 04 ξm = 05 06 07 08 09 xm+1 = xm + ξm dm rm+1 = rm − ξm pm if rm+1 ≤ eps b break end r pm τm+1 = − m+1 dm pm dm+1 = rm+1 + τm+1 dm 10 11 12 13 end disp(’Numero maximo de iteraciones alcanzado’) Como puede verse, las modificaciones sobre el m´todo del Gradiente son m´ e ınimas y est´n concentradas en las l´ a ıneas 04, 10 y 11. En cuanto al n´mero de operaciones, u 96
  • 102. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos coincide con las del m´todo del Gradiente: en cada paso es necesario calcular un producto e matriz–vector (l´ ınea 03) y tres productos escalares (04 y 10). Listaremos a continuaci´n algunas propiedades entre los residuos y las direcciones de o descenso que permiten dar una expresi´n distinta del m´todo, y deducir alguna de las o e propiedades de convergencia. r do rra Bo Lema 5.6 Para todo m ≥ 0 r m dm = r m r m . Por tanto ξm = rm rm . dm Adm Demostraci´n. Como rm ⊥ dm−1 , o rm dm = rm rm + τm rm dm−1 . (5.5) =0 El segundo resultado es inmediato de la definici´n de ξm . o 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 . Demostraci´n. Los puntos i) y ii) ya se han probado. Para probar iii) basta comprobar o que rm+1 rm = rm rm − ξm dm Arm = rm rm − ξm dm Adm + ξm τm dm Adm−1 =0 = rm rm − ξm dm Adm . El resultado es ahora una consecuencia del Lema 5.6. Lema 5.8 Para todo m ≥ 0 τm+1 := Demostraci´n. Como o −Adm = rm+1 rm+1 . rm rm 1 (rm+1 − rm ), ξm se tiene τm+1 = − rm+1 Adm r rm+1 1 rm+1 (rm+1 − rm ) 1 rm+1 rm+1 = = = m+1 dm Adm ξm dm Adm ξm dm Adm rm rm donde hemos utilizado que rm+1 ⊥ rm , y en el ultimo paso, la expresi´n alternativa de ´ o ξm . Los Lemas 5.6 y 5.8 dan expresiones m´s simples de los par´metros ξm y τm . De hecho a a m´s econ´micas, dado que rm rm es conocido del paso anterior y por tanto no es preciso a o calcularlo de nuevo. En total dos productos escalares por iteraci´n. o 97
  • 103. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e Ejercicio 5.15 Modifica el algoritmo del Gradiente Conjugado con las nuevas expresiones de ξm y τm . Observa que podemos evitar en esta versi´n un producto escalar por iteraci´n. o o El resultado sorprendente, y que descubre parte de las buenas propiedades del Gradiente Conjugado, es que estas propiedades de ortogonalidad se extienden a todo el conjunto de residuos y direcciones generados en los pasos anteriores. r do rra Bo Lema 5.9 Para todo m ≤ n i) dm ⊥A d , ∀ ≤ m − 1; ii) rm+1 ⊥ d , ∀ ≤ m; iii) rm+1 ⊥ r , ≤ m. La tercera propiedad implica en particular la convergencia del Gradiente Conjugado en aritm´tica exacta en a lo sumo n pasos dado que no puede haber n+1 vectores ortogonales e n en R y por tanto rn+1 = 0. Sin embargo, en aplicaciones pr´cticas puede requerir m´s a a de n iteraciones por los errores introducidos por la precisi´n de la m´quina. o a Ejercicio 5.16 Modifica el programa gradiente para implementar en una funci´n de nomo bre gradconjugado el m´todo del Gradiente Conjugado. e 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 10 10 10 10 10 10 10 Residuo 4 3 2 1 0 −1 −2 0 2 4 6 8 Iteraciones 10 12 14 Figura 5.4: Historial del residuo para el m´todo del Gradiente Conjugado e puede comprobar la convergencia es m´s r´pida y hemos reducido notablemente el molesto a a comportamiento oscilatorio del residuo. 98
  • 104. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos An´lisis del m´todo a e r do rra Bo a o En esta secci´n probaremos el Lema 5.9. El lector m´s interesado en la implementaci´n o del m´todo puede saltar esta secci´n sin mayor problema. Animamos, no obstante, a e o su lectura pues ilustra un conjunto de t´cnicas habituales en otras familias de m´todos e e iterativos. Adem´s sirve de ejemplo que demostrar el buen funcionamiento de un esquema a num´rico m´s elaborado, generalmente obtenido mediante modificaciones intuitivas de e a algoritmos m´s simples, puede requerir un an´lisis nada trivial. Tampoco es extra˜a la a a n situaci´n contraria: un m´todo puede fallar por razones no inmediatamente comprensibles. o e En la demostraci´n juega un papel muy importante el subespacio o Km (A, r0 ) := R r0 , Ar0 , . . . , Am r0 esto es, el subespacio formado por todas las combinaciones lineales α0 r0 + α1 Ar1 + . . . + αm Am r0 , αi ∈ R. Estos subespacios reciben el nombre de subespacios de Krylov y son clave en multitud de m´todos num´ricos para la resoluci´n de sistemas lineales. Antes de proseguir haremos e e o unos simples comentarios: 1. El subespacio tiene a lo sumo dimensi´n m + 1. o 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 f´cil comprobar que rm , dm ∈ Km (A, r0 ). a a o La demostraci´n del Lema 5.9 se llevar´ a cabo por inducci´n sobre m. Para m = 0 es o un simple ejercicio de comprobaci´n (en este caso r0 = d0 y por tanto ii) y iii) coinciden). o Supongamos pues que el resultado est´ probado para m. Concretamente, supongamos que a para m i) dm ⊥A d , ∀ ≤ m − 1 y {d0 , d1 , . . . , dm } es una base de Km (A, r0 ). ii) rm+1 ⊥ d , ∀ ≤ m. iii) rm+1 ⊥ r , ≤ m y {r0 , r1 , . . . , rm+1 } es una base ortogonal de Km+1 (A, r0 ). Veamos que los puntos i)–iii) se satisfacen entonces para m + 1. i) dm+1 ⊥A d , ∀ ≤ m: 99
  • 105. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e Este resultado est´ probado ya para a = m. Para ≤ m − 1, utilizamos que dm+1 = rm+1 + τm+1 dm . Por tanto, basta probar que dm ⊥A d . r do rra Bo rm+1 ⊥A r , El segundo es ya conocido (hip´tesis de inducci´n). Por otro lado o o rm+1 ⊥A r ⇐⇒ rm+1 ⊥ Ar . Como Ar ∈ K +1 (A, r0 ) y una base de este subespacio es {r0 , r1 , . . . , r +1 } ⊂, concluimos que Ar = α0 r0 + α1 r1 + . . . + α +1 r +1 con αj ∈ R adecuados. El resultado se sigue ahora de iii) puesto que rm+1 ⊥ rk , para todo k ≤ m. Por ultimo si dm+1 = 0 entonces {d0 , . . . , dm+1 } es una base de Km+1 (A, r0 ) por ´ ser A−ortogonales y por tanto linealmente independientes. ii) rm+2 ⊥ d , ∀ ≤m+1 Para = m, m + 1 es cierto por construcci´n (v´ase Lema 5.7). Para el resto de o e valores ≤ m − 1, utilizamos rm+2 = rm+1 − ξm+1 Adm+1 . Por inducci´n, rm+1 ⊥ d , mientras que para el otro t´rmino observamos que o e (Adm+1 ) ⊥ d ⇐⇒ dm+1 ⊥A d , y ´sto es lo que acabamos de probar en el apartado anterior. e iii) rm+2 ⊥ r , Tomemos ∀ ≤ m + 1. ≤ m. Entonces rm+2 ⊥ r ⇐⇒ ⇐⇒ (rm+1 − ξm+1 Adm+1 ) ⊥ r ⇐⇒ (Adm+1 ) ⊥ r (dm+1 ) ⊥A r . donde hemos aplicado la hip´tesis de inducci´n en el segundo paso. Ahora, como o o r ⊂ K (A, r0 ), por el punto i) podemos escribir r = β0 d0 + β1 d1 + . . . + β d . (5.6) El resultado se sigue de la propiedad i) ya que dm+1 ⊥A dk para k ≤ m. Finalmente, si rm+1 = 0 entonces {r0 , . . . , rm+1 } es una base de Km+1 (A, r0 ) por ser ortogonales. 100
  • 106. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos Un examen m´s cuidadoso de la demostraci´n anterior comprueba que ´sta falla en el a o e caso de que en un paso rm+1 ´ dm+1 sean nulos. En cualquiera de estos casos o Km (A, r0 ) = Km+1 (A, r0 ). r do rra Bo Ahora bien esto sucede si y s´lo si ha habido convergencia en el paso m (si dm+1 = 0 y o por tanto rm = 0) o en el paso m + 1 (si rm+1 = 0). Esto es, si la direcci´n de descenso es o la nula simplemente es porque ya hemos alcanzado la soluci´n, y viceversa, si el residuo o es nulo, la direcci´n de descenso para la siguiente iteraci´n es la nula. o o Notas finales El Gradiente Conjugado fue propuesto por Magnus R. Hestenes y Eduard Stiefel en 1952. Lo m´s curioso es que el m´todo fue desarrollado de forma independiente por estos a e n dos autores. Seg´n cuenta Marvin Stein13 , un estudiante postdoctoral en aquellos a˜os que u program´ el algoritmo por primera vez para Hestenes, Stiefel coincidi´ con Hestenes en o o una conferencia en UCLA (University of California, Los Angeles) y le coment´ a grandes o trazos el m´todo en el que estaba trabajando. Stiefel estaba impresionado sobre las buenas e propiedades que mostraba este m´todo hasta que revisando las tarjetas perforadas que e conten´ el programa implementado cay´ en la cuenta de que se trataba del mismo ıan o m´todo sobre el que independiente ´l estaba trabajando14 . e e Hemos visto que el m´todo del Gradiente Conjugado es un m´todo directo, en tanto e e en cuanto da la soluci´n en un n´mero finito de pasos, concretamente n, el n´mero de filas o u u de la matriz. Sin embargo, se programa como un m´todo iterativo, de forma que se busca e la convergencia en muchas menos iteraciones. En cada iteraci´n se tiene la estimaci´n o o em+1 A ≤2 κ(A) − 1 κ(A) + 1 m e0 A donde de nuevo em := xm − x es el error en el paso m−´simo y e0 el error inicial. e El resultado anterior es algo incompleto pero sirve para hacer patente la sensibilidad del m´todo ante el condicionamiento de una matriz que, aunque menor que en el caso del e m´todo del Gradiente (por la ra´ cuadrada), sigue siendo importante. Si la matriz tiene e ız un condicionamiento moderado, el m´todo del Gradiente Conjugado dar´ una soluci´n e a o aceptable en unas pocas iteraciones. Sin embargo, esto no suele ser un caso habitual. Las matrices que surgen en la resoluci´n de ecuaciones en derivadas parciales, por ejemplo o elementos o vol´menes finitos, suelen ser, adem´s de matrices sparse, mal condicionadas, u a por lo que el m´todo del Gradiente Conjugado requiere de bastantes iteraciones15 . e Estas razones hicieron que el Gradiente Conjugado se tomara como un m´todo m´s, e a sin concederle especial relevancia y confundi´ndose con la multitud de m´todos para la e e resoluci´n de sistemas de ecuaciones lineales que iban surgiendo a su alrededor. Esta o 13 An´cdota recogida por Yousef Saada y Henk A. van der Vorstb en “Iterative solution of linear systems e in the 20th century” publicado en “Journal of Computational and Applied Mathematics” en el a˜o 2000. n 14 Esta coincidencia no es de todas formas un caso aislado en las Ciencias en general y en las Matem´ticas a en particular. En ocasiones parece como si las ideas estuviesen flotando en el ambiente a la espera de que alguien diera el paso final de plasmarlas. 15 O(n1/3 ) en problemas en 3D, O(n1/2 ) en 2D es un comportamiento t´ ıpico. 101
  • 107. ´ LECCION II 5.2 M´todos iterativos para sistemas lineales e situaci´n se prolong´ durante casi 20 a˜os hasta que las ideas del precondicionamieno o n to cambiaron radicalmente esta situaci´n y encumbraron al Gradiente Conjugado a su o posici´n actual16 . o El precondicionamiento consiste, a grandes rasgos, en cambiar el sistema por uno equivalente17 r do rra Bo Ax = b, L−1 AL− y = L−1 b, c B x = L− y y aplicar el m´todo al sistema By = c. Para su implementaci´n basta con conocer simplee o mente la matriz producto M = LL que recibe el nombre de precondicionador de A. En general, la matriz L−1 AL− no se construye, porque el producto por el precondicionador hace que se pierdan algunas de las buenas propiedades de la matriz original. Ahora bien, y he aqu´ la ventaja del m´todo, s´lo necesitamos calcular productos por M −1 , que ı e o se reducen sistemas lineales con M como matriz de coeficientes. Obviamente, y de forma similar a como proced´ ıamos con la descomposici´n de Cholesky, esto equivale resolver dos o sistemas lineales con L y L . La buena noticia es que es posible construir matrices para las que estos sistemas son f´ciles de resolver. Por ejemplo, L puede ser sparse y triangular. a El m´todo del Gradiente Conjugado rara vez se programa sin precondicionar. De e hecho, el comando de Matlab con el Gradiente Conjugado implementado es pcg de preconditioned conjugate gradient. En ultima medida, el ´xito del Gradiente Conjugado origin´ el nacimiento de una ´ e o familia entera de m´todos, los conocidos como m´todos de Krylov, que trataban de e e extender las buenas propiedades del m´todo a matrices m´s generales. Por ejemplo, BiCG, e a BiCGSTAB, CGS, QMR, GMRES, MINRES, etc. Algunos de estos m´todos requieren e que la matriz sea sim´trica y otros son v´lidos para matrices arbitrarias. e a Un precondicionador universal, es v´lido en muchos casos, es la descomposici´n de a o Cholesky incompleta. Va m´s all´ de los contenidos de este curso describir detalladamente a a en qu´ consiste pero podemos dar una idea. Se trata de, grosso modo, aplicar el m´todo e e de Cholesky pero restringiendo la creaci´n de nuevas entradas. El resultado es una matriz o L tal que LL ≈ A en alg´n sentido. Por tanto, L−1 AL− ≈ In y su condicionamiento u es moderado, o al menos mejor que el de A. En Matlab se encuentra implementada en el comando cholinc. El siguiente ejercicio ilustra el efecto del precondicionamiento en la convergencia del Gradiente Conjugado y con ello trata de convencer de la necesidad de utilizarlo en la resoluci´n de (muy) grandes sistemas de ecuaciones. o 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 sim´trica definida positiva proveniente de resolver la ecuaci´n e o de Poisson (una ecuaci´n en derivadas parciales) por el m´todo de elementos finitos en un o e 16 La American Mathematic Society lo sit´o entre los diez algoritmos m´s relevantes del siglo XX, junto u a con, por ejemplo, la Transformada R´pida de Fourier (FFT) o el algoritmo QR para el c´lculo de valores a a y vectores propios. 17 Utilizamos la notaci´n L− = (L−1 ) , es decir invertir y trasponer (o equivalentemente, trasponer e o invertir). 102
  • 108. ´ LECCION II Cap´ ıtulo 5. Matrices sparse en Matematicas. Metodos iterativos Metodo del gradiente 0 10 sin precondicionar precondicionado −1 10 r do rra Bo −2 10 −3 10 −4 10 Residuo −5 10 −6 10 −7 10 −8 10 0 50 100 150 200 250 Iteraciones Figura 5.5: Efecto del en el Gradiente Conjugado. dominio en forma de ‘L’. La matriz tiene aproximadamente 2100 filas con 14500 elementos no nulos18 . Con el comando spy se puede ver la forma de a, su tama˜o y el n´mero de entradas n u no nulas. Aplica el comando pcg que contiene implementado el Gradiente Conjugado. Por ejemplo, con >>[x,flag, relres,iter,resvec] = pcg(a,b,1e-7,100); aplicas el m´todo con una tolerancia relativa de 10−7 y un n´mero m´ximo de 100 iteraciones. e u a En relres se recoge el residuo relativo de la soluci´n calculada ( b − Ax / b ), en resvec o un historial del residuo en cada paso y en flag una variable que informa sobre qu´ ha sucedido e en la aplicaci´n del m´todo. As´ flag==1 indica que se ha alcanzado el n´mero m´ximo de o e ı u a iteraciones sin convergencia, mientras que si flag==0 entonces ha habido convergencia. Para ver el historial de la convergencia del m´todo se puede ejecutar e >> semilogy(resvec); Observa que es necesario o aumentar el n´mero de iteraciones m´ximas o disminuir la tolerancia u a para obtener convergencia. A continuaci´n vamos a utilizar un precondicionador muy sencillo basado en la descomo posici´n de Cholesky incompleta. Teclea o >> R=cholinc(a,’0’); De nuevo, con los comandos habituales puedes ver tanto la forma como el n´mero de entradas u no nulas de R. Modificando las instrucciones anteriores con 18 Por cierto, el logo de Matlab es la soluci´n de un problema de este tipo. o 103
  • 109. 5.2 M´todos iterativos para sistemas lineales e ´ LECCION II >>[x2,flag2, relres2,iter2,resvec2] = pcg(a,b,[],100,R’,R); est´s aplicando el m´todo del Gradiente Conjugado precondicionado con R R. ¿Disminuye el a e n´mero de iteraciones? (ver iter2). ¿Y el tiempo de c´lculo?. ¿Puedes ser ahora m´s exigente u a a con la tolerancia?. r do rra Bo Ejercicio 5.18 Con la orden helpwin lee la ayuda que proporciona Matlab para pcg. ¿Qu´ otros e m´todos iterativos est´n implementados?. Consulta tambi´n la ayuda de cholinc y luinc. e a e 104
  • 110. r do rra Bo Lecci´n III o Funciones como argumento. Recursividad F´rmulas de cuadratura. FFT o 105
  • 111. r do rra Bo
  • 112. r do rra Bo Introducci´n o Hobbes clearly proves that every creature Lives in a state of war by nature; So naturalists observe a flea Has smaller fleas that on him prey, And these have smaller still to bite’em, And so proceed ad infinitum. Swift, Poetry: a Rhapsody En esta lecci´n abordaremos dos nuevos aspectos de Matlab: el env´ de funciones o ıo como argumentos de otras funciones y la recursividad, esto es, la habilidad de que las funciones se llamen a s´ mismas. Adem´s mostraremos una forma alternativa de definir ı a funciones en la ventana de comandos. En la segunda parte hablaremos de las reglas de cuadratura cl´sicas para la aproxia maci´n de integrales y veremos una implementaci´n sencilla de un m´todo de integraci´n o o e o adaptativa. Finalizaremos con la transformada discreta de Fourier, y su c´lculo media ante la transformada r´pida de Fourier (FFT). La implementaci´n de estos algoritmos a o servir´ de ilustraci´n de las estrategias de recursividad, que sirven para obtener un c´digo a o o simple y legible. 107
  • 113. r do rra Bo 108
  • 114. r do rra Bo Cap´ ıtulo 6 Matlab: Funciones como argumentos. Recursividad 6.1. Funciones inline En la secci´n 3.2 de la Lecci´n I mostramos la definici´n de funciones mediante ficheros o o o de texto (con extensi´n *.m). Existe una forma alternativa de introducir funciones en o Matlab que puede utilizarse directamente en la l´ ınea de comandos o en el c´digo de una o funci´n. Por ejemplo, o >> f=inline(’exp(-x)*sin(x)’,’x’); define la funci´n f (x) = e−x sen(x). Para evaluar se procede igual o >> f(2) ans = 0.1231 A efectos pr´cticos, inline es equivalente a editar una funci´n con nombre “f” y a escribir a o el correspondiente c´digo. La definici´n queda en memoria pero una vez cerrada la sesi´n o o o ´ de Matlab (esto es, al salir del programa) la funci´n se pierde. Esta es pues una importante o desventaja frente la funciones basada en m-files1 . Sin embargo puede resultar util para ´ tareas sencillas tanto en el modo comando como en el c´digo de una subrutina. o Nada impide definir funciones con m´s argumentos, a >> g=inline(’x*cos(y)-y*cos(x)’,’x’,’y’); Los ultimos argumentos del comando inline definen las variables de la funci´n. Si no se ´ o especifican, Matlab trata de reconocer cu´les son las variables y las ordena alfabeticamente: a 1 En el men´, seleccionando File → Save workspace as se pueden grabar las variables y funciones u utilizadas en la sesi´n actual de Matlab. Otra posibilidad es utilizar la orden save indicando que queremos o grabar f . En cualquier caso, ambas opciones no son muy naturales. 109
  • 115. ´ LECCION III 6.1 Funciones inline >> g=inline(’x^2*cos(y)-y*cos(x)*z’); >> g g = r do rra Bo 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 la lectura, adem´s de especificar el orden de las variables en la definici´n de la funci´n: a o o >> 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 est´n vectorizadas, es decir, al aplicarlas sobre un vector o a matriz no act´an elemento a elemento. Para ello, deber´ escribirse u ıa >> 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, m´s sencilla, es introducir la funci´n de la forma habitual y pedir luego a a o Matlab que la prepare para su aplicaci´n a vectores. El comando dedicado a esta tarea es o vectorize: >> g = inline(’x^2*cos(y)-y*cos(x)*z’) % funcion sin vectorizar g = Inline function: g(x,y,z) = x^2*cos(y)-y*cos(x)*z >> g= vectorize(g) 110
  • 116. ´ LECCION III Cap´ ıtulo 6. Matlab: Funciones como argumentos. Recursividad g = Inline function: g(x,y,z) = x.^2.*cos(y)-y.*cos(x).*z r do rra Bo Observa que tras la aplicaci´n de este comando, Matlab redefine la funci´n a˜adiendo “.” o o n en los sitios adecuados. 6.2. Funciones como argumentos Es frecuente que en programaci´n m´s avanzada se requiera que las funciones trabajen o a sobre funciones. Por ejemplo, podemos plantearnos implementar una funci´n que realice o la siguiente tarea dada una funci´n de una variable y dos valores dibujar la funci´n entre o o esos valores En este caso, uno de los argumentos es la funci´n a dibujar. Veamos c´mo se ha o o implementado 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 % MIPLOT % % MIPLOT(F,A,B) % MIPLOT(F,A,B,N) % Dibuja la funcion F entre A y B Toma N puntos entre A y B function miplot(f,a,b,varargin) if nargin<3 disp(’argumentos insuficientes’) end if nargin>3 n=varargin{1}; else n=200; end x=linspace(a,b,n); % vector con n puntos entre a y b y=feval(f,x); % f debe estar vectorizada plot(x,y) return En la l´ ınea 07, f recoge la funci´n argumento, mientras que en 20 se procede a evaluar o ´sta mediante e feval Para enviar la funci´n existen dos posibilidades: o 111
  • 117. ´ LECCION III 6.2 Funciones como argumentos Si enviamos una funci´n inline, basta con insertar su nombre o >> fun=vectorize(inline(’exp(-x)*cos(4*x)’)); >> miplot(fun,0,2*pi,200) r do rra Bo Si la funci´n es propia de Matlab o est´ implementada en un fichero m-file en la o a carpeta de trabajo (o en alguna accesible), podemos • utilizar “@”2 >> miplot(@sin,0,2*pi,200) • indicar el nombre de la funci´n entre comillas o >> miplot(’sin’,0,2*pi,200) Nota. La funci´n plot dibuja el vector y versus x. Concretamente, por defecto construye o el pol´ ıgono con v´rtices(x(i),y(i)). Si se toma un n´mero suficiente de puntos esto basta e u para obtener una buena gr´fica. Este comando es una de las salidas gr´ficas m´s simples de a a a Matlab y admite una amplia variedad de argumentos opcionales que controlan el aspecto final del dibujo. En una lecci´n posterior (Lecci´n V) veremos este comando y otros o o relacionados con las salidas gr´ficas. a Ejercicio 6.1 Modificar el programa miplot para que en caso de no recibir los argumentos a y b los pida por pantalla. (Ayuda. La orden input lee datos por pantalla tras mostrar un mensaje. Necesitar´s que ahora a a y b pasen a ser argumentos opcionales.) Ejercicio 6.2 Lee la ayuda de Matlab sobre plot. Ensaya diferentes variantes, observa como se puede cambiar de forma sencilla tanto la forma de la gr´fica (l´ a ınea continua, l´ ınea a trozos, raya-punto, s´lo puntos,...), el color,... o 6.2.1. Recursividad Un aspecto ya habitual en muchos lenguajes de programaci´n es la recursividad, es o decir, la habilidad de que una funci´n se llame a s´ misma. Es habitual su utilizaci´n o ı o cuando se programan estrategias de tipo divide y vencer´s, que consiste, a grandes trazos, a en dividir un problema en problemas iguales pero de menores dimensiones. Quiz´s el ejemplo m´s sencillo (y cl´sico) se basa en la funci´n factorial. a a a o n! = n · (n − 1) · · · 1. De una manera simple, podemos definir de forma recursiva n! = n · (n − 1)!, 1, si n > 0, si n = 0. Su implementaci´n en Matlab es ahora tan sencilla como sigue o 2 Matlab recomienda esta forma. El operador @ accede al handle de la funci´n que es la referencia que o tiene Matlab de la funci´n. Para mayor informaci´n, ver helpwin function handle. o o 112
  • 118. ´ LECCION III 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 Cap´ ıtulo 6. Matlab: Funciones como argumentos. Recursividad % FACT % % FACT(N) devuelve n! % r do rra Bo function f=fact(n) if (n<0) disp(’error. Argumento inapropiado’); f=[]; % devolvemos el vacio elseif (n==0) f=1; else f=fact(n-1)*n; % llamada a fact con n-1 end return Obviamente, ´sta no es la forma m´s apropiada de programar la funci´n factorial e a o que en Matlab se encuentra implementada en una funci´n con el mismo nombre3 . Es o m´s, abusar de este tipo de programaci´n suele generar c´digo poco eficiente. Adem´s el a o o a control que debe hace el ordenador de las sucesivas llamadas puede dar lugar a un costo en memoria elevado. Sin embargo es cierto que el c´digo resultante suele ser bastante m´s o a simple. 3 Tienes de hecho acceso al c´digo, basta con ejecutar edit factorial. o 113
  • 119. ´ LECCION III 6.2 Funciones como argumentos r do rra Bo 114
  • 120. r do rra Bo Cap´ ıtulo 7 F´rmulas de cuadratura. o Transformada r´pida de Fourier a 7.1. F´rmulas de cuadratura o Un problema ya cl´sico es la aproximaci´n de una integral a o b f (s) ds a cuyo c´lculo no se puede llevar a cabo por medios anal´ a ıticos o bien porque conlleva un costo elevado. Este tipo de problemas se ha planteado desde la antig¨edad, con algunas u referencias que se remontan a las Matem´ticas cl´sicas en el c´lculo de ´reas y vol´menes a a a a u de figuras curvas. Quiz´s ´ste sea el origen de la denominaci´n de f´rmula de cuadratura a e o o a cualquier expresi´n que aproxime una integral definida. o o e ımite de La propia definici´n de integral1 se f´rmula actualmente en t´rminos del l´ o f´rmulas de cuadratura, concretamente f´rmulas del rect´ngulo. El An´lisis Num´rico o o a a e trata de analizar no s´lo la convergencia de estas f´rmulas y otras que se puedan plantear, o o sino especialmente la calidad de estas aproximaciones estimando el error que comenten. En ultima medida, el uso local de estimaciones del error permiten dilucidar qu´ zonas ´ e del intervalo de integraci´n concentran el error cometido por nuestra f´rmula y por tanto o o donde debemos concentrar nuestro esfuerzo para reducir el error cometido. Obtenemos as´ un m´todo adaptativo, no r´ ı e ıgido, que reconoce las dificultades del problema y se adapta a ´l. e En esta secci´n esbozaremos estas ideas recurriendo siempre a casos sencillos e ideas o intuitivas y dejando la teor´ en el m´ ıa ınimo imprescindible. 7.1.1. Primeras nociones Desde una ´ptica completamente ingenua, y a la vista de la gr´fica de la funci´n por o a o integrar, podemos plantear su aproximaci´n por una suma de ´reas de rect´ngulos que o a a aproximen el ´rea total que define f (Figura 7.1)2 . A este tipo de aproximaciones se les a 1 2 Hablamos de la integral de Rienmann. Esta aproximaci´n est´, de hecho, detr´s de la definici´n de la integral de Rienmann. o a a o 115
  • 121. ´ LECCION III 7.1 F´rmulas de cuadratura o conoce como reglas del rect´ngulo. Queda por elegir el punto que al evaluar define la a altura de cada rect´ngulo. Las elecciones m´s sencillas son tomar el extremo inferior de a a cada subintervalo, el extremo superior o, la a priori m´s l´gica, tomar el punto medio. a o r do rra Bo 0.6 0.5 0.4 0.3 0.2 0.1 0 -0.1 -0.2 0 0.5 1 1.5 0.6 2 2.5 0.6 partición Regla del punto medio 0.5 Particion Regla del trapecio 0.5 0.4 0.4 0.3 0.3 0.2 0.2 0.1 0.1 0 0 -0.1 -0.1 -0.2 0 0.5 1 1.5 2 -0.2 0 2.5 0.5 1 1.5 2 2.5 Figura 7.1: Reglas de cuadratura: punto medio y trapecio Si, por simplicidad, nos limitamos a trabajar con particiones uniformes, es decir, a construir rect´ngulos con igual base, las f´rmulas anteriores se pueden exponer de forma a o simple: en primer lugar introducimos la malla n ∈ N, h = b−a , xj = a + hj, xj+1/2 = a + h(j + 1/2) n o partici´n asociada. Las reglas quedan ahora de la siguiente forma o n−1 Q1 (f, h) := h f (xj ) (Punto inferior), f (xj ), (Punto superior) f (xj+1/2 ), (Punto medio) j=0 n Q2 (f, h) := h j=1 n−1 Qpm (f, h) := h j=0 Es dif´ escapar a la sensaci´n de que la regla del punto medio goza de mejores ıcil o 116
  • 122. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o r do rra Bo propiedades que las que definen el resto de elecciones3 . Esta impresi´n es correcta, como o veremos m´s adelante. a Un an´lisis algo m´s profundo nos descubre la regla del trapecio como una mejor a a manera de aproximar la integral (ver de nuevo la Figura 7.1). En este caso la integral se aproxima como suma del ´rea de trapecios, como su propio nombre indica. Es un simple a ejercicio comprobar que la regla obedece a la siguiente f´rmula o 1 Qtr (f, h) := h f (x0 ) + 2 n−1 1 f (xj ) + f (xn ) , 2 j=1 (Regla del trapecio). Parecer´ evidente que esta aproximaci´n es mejor que la de las f´rmulas de rect´ngulo ıa o o a que hemos visto. Esta impresi´n es s´lo parcialmente correcta: de hecho la regla del punto o o medio es ligeramente mejor que la regla del trapecio, como veremos m´s adelante. a En cualquier caso, la regla del trapecio sugiere que podemos desarrollar f´rmulas m´s o a complejas sobre cada subintervalo [xi , xi+1 ] para luego construir con ellas, simplemente sum´ndolas, una f´rmula en todo el intervalo [a, b]. Es por ello que a las reglas del rect´ngua o a lo y trapecio se les llama reglas compuestas, mientras reglas que no implican subdividir el intervalo de integraci´n en intervalos m´s peque˜os se las conoce como reglas simples. o a n Ejercicio 7.1 Implementa en Matlab la regla del punto medio. Soluci´n. Observemos primero que necesitamos cuatro argumentos de entrada: o Funci´n a integrar f. o Puntos inicial y final del intervalo a,b. N´mero de divisiones del intervalo n. u Una vez le´ ıdos estos datos podemos calcular h, la distancia entre dos puntos consecutivos, construir un vector con los puntos donde hay que evaluar f , evaluar la funci´n en o esos puntos (un nuevo vector de valores), sumar el vector y multiplicar por h. El programa podr´ ser as´ ıa ı 01 02 03 04 05 06 07 08 09 10 % % % % % % PUNTOMEDIO PUNTOMEDIO(F,A,B,N) devuelve el valor aproximado de la integral de F entre A y B con la regla del punto medio con N puntos F debe estar vectorizada function s=puntomedio(f,a,b,n) h=(b-a)/n; 3 Quiz´s por razones de simetr´ La intuici´n es una arma poderosa en todas las Ciencias y en las a ıa. o Matem´ticas en particular. Sin embargo en el An´lisis Num´rico puede llevar a confusiones e impresiones a a e err´neas. En ocasiones los m´todos num´ricos funcionan o fallan por razones que escapan a la pura o e e intuici´n. De todos modos, no por ello se debe desde˜ar, sino manejarla con algo de cuidado. o n 117
  • 123. ´ LECCION III 7.1 F´rmulas de cuadratura o 11 12 13 x=linspace(a+h/2,b-h/2,n); % calculamos puntos por evaluar y=feval(f,x); % evaluamos f en esos puntos s=h*sum(y); % aplicamos regla r do rra Bo Ejercicio 7.2 Implementa en Matlab la regla del trapecio. Ejercicio 7.3 Tomando un n´mero de puntos suficientemente alto y siempre que la funci´n u o sea regular (sea derivable un n´mero suficiente de veces) puedes tomar ese valor como el u resultado exacto de la integral. Con un ejemplo arbitrario compara los resultados de la regla del punto medio y la regla del trapecio. Nota. Existe una cuesti´n, algo tonta, sobre el par´metro n. Lo habitual es tomar n de o a forma que h = (b − a)/n sea la distancia entre los puntos que se eval´an para construir u la regla de cuadratura. Esta elecci´n hace que en la regla del punto medio la funci´n se o o eval´e en n puntos mientras que en la regla del trapecio, se haga en n + 1 puntos. En u cualquier caso, y adelant´ndonos a lo que sigue, el par´metro relevante es precisamente a a h. 7.1.2. Reglas simples Tanto la regla del punto medio como la del trapecio se basan en interpolar la funci´n o por un polinomio de grado 0 (constante) y grado 1 (una recta) sobre cada subintervalo e integrar dicho polinomio. Esto es, si c es el punto medio de (a, b), la regla del punto medio consiste en reemplazar la funci´n por la constante, polinomio de grado 0, que pasa o por (c, f (c)) y aproximar la integral de f por la de dicha constante: b b f (c)ds = f (c)(b − a). f (s)ds ≈ a a An´logamente, la regla del trapecio se basa en aproximar la funci´n por una recta p1 (s), a o polinomio de grado 1, que pase por (a, f (a)) y (b, f (b)) y luego dar como resultado aproximado de la integral la de p1 (s): b b s−a b−a b−s f (a) + f (b) ds = [f (a) + f (b)] . b−a b−a 2 f (s)ds ≈ a a p1 (s) El estudio del error de las f´rmulas anteriores queda as´ reducido a las propiedades de o ı aproximaci´n de los polinomios de grado 0 y 1 correspondientes. o Proposici´n 7.1 Existen ξ1 , ξ2 ∈ [a, b] tales que o b 1 f (ξ1 )(b − a)3 , 24 1 = − f (ξ2 )(b − a)3 . 12 f (s) ds − (b − a)f (c) = a b f (s) ds − a b−a f (a) + f (b) 2 118
  • 124. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o r do rra Bo Obviamente, nada se dice sobre cu´les son los puntos ξ1 , ξ2 , puesto que conocer esos a puntos en cada caso ser´ equivalente a conocer la integral para cualquier funci´n arbiıa o traria. Es remarcable que ambas f´rmulas son exactas para polinomios de grado 1 (porque o en tal caso f = 0) y que el error que se puede esperar de la f´rmula del punto medio es o la mitad que el de la f´rmula del trapecio y adem´s con signo opuesto4 . o a Siguiendo con estas ideas, podemos avanzar un paso m´s trabajando con polinomios a de grado dos. Denotando por Pn (x) los polinomios de grado n, procedemos como sigue Construir p ∈ P2 (x) tal que (c = (a + b)/2) p2 (a) = f (a), p2 (c) = f (c), p2 (b) = f (b). Dar como aproximaci´n o b b f (s) ds ≈ a a p2 (s) ds. a c b Figura 7.2: Regla de Simpson En la terminolog´ habitual se habla de una regla de precisi´n 2. La f´rmula que ıa o o as´ obtenemos viene dada por ı b f (s) ds ≈ a b−a f (a) + 4f (c) + f (b) . 6 (7.1) Esta regla de cuadratura recibe el nombre de regla de Simpson y es una de las m´s a utilizadas en la pr´ctica. A primera vista se puede esperar que d´ el valor exacto de la a e integral para polinomios de grado de 2, puesto que as´ se ha impuesto en la definici´n. ı o Sin embargo tiene un grado de precisi´n adicional fruto de la disposici´n sim´trica de los o o e puntos de evaluaci´n (es decir, del hecho de que c sea el punto medio de [a, b]), lo que lleva o a que la f´rmula sea exacta para polinomios de grado 3. Esto es, la regla de Simpson o tiene precisi´n 3: o 4 Salvando el hecho de que en principio ξ1 = ξ2 . Un an´lisis m´s elaborado permite probar que esta a a conclusi´n es esencialmente cierta. o 119
  • 125. ´ LECCION III 7.1 F´rmulas de cuadratura o Proposici´n 7.2 Existe ξ3 ∈ [a, b] tal que o b f (s) ds − a b−a f (a) + 4f (c) + f (b) 6 = − 1 (4) f (ξ3 )(b − a)5 . 2880 En general, tenemos la siguiente estrategia para construir reglas de mayor precisi´n: o r do rra Bo Tomar n ∈ N, h = (b − a)/n, xj = a + jh con j = 0, . . . , n (n + 1 puntos). Construir un polinomio pn ∈ Pn (x) tal que pj (xj ) = f (xj ). Aproximar b b f (s) ds ≈ a pn (s) ds. a Las f´rmulas as´ obtenidas reciben el nombre de f´rmulas de Newton-Cotes cerradas5 . Las o ı o f´rmulas de Newton-Cotes abiertas se definen de forma similar pero tomando o 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 eval´an para aproximar la integral. u Sin embargo no es conveniente recurrir a estas f´rmulas de cuadratura porque conforme o aumenta el n´mero de puntos, las f´rmulas tienden a ser m´s inestables num´ricamente. u o a e En lugar de ello, se utilizan f´rmulas compuestas, como las del rect´ngulo o trapecio, o a definidas a partir de f´rmulas simples de pocos puntos. Volveremos a ello en pr´ximos o o apartados. Ejercicio 7.4 (Matem´tico) Deducir los coeficientes de la regla de Simpson expuestos en a (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). ¿Cu´nto valen α1 , α2 , α3 si exigimos que p2 (a) = f (a), 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 f´rmulas de Newton-Cotes es o exigir que la f´rmula de cuadratura integre a los polinomios de m´ximo grado. En el caso de o a la f´rmula de Simpson, bastar´ con partir de o ıa xj = a + jh, definir j = 0, 1, 2, con h = b−a , 2 b f (s) ds ≈ ω0 f (x0 ) + ω1 f (x1 ) + ω2 f (x2 ). a y exigir que la f´rmula sea exacta para f = 1, s, s2 . Calcula as´ los pesos de la f´rmula de o ı o Simpson. 5 El hecho de que Isaac Newton aparezca ligado a estas ideas da una pista sobre la fecha a la que se remontan estas t´cnicas. e 120
  • 126. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o Ejercicio 7.6 Siguiendo las ideas del ejercicio anterior, podemos deducir las f´rmulas con o m´s puntos. Para facilitar el estudio realizamos el cambio de variables a b f (s) ds = a b−a n n f (a + ht) dt 0 r do rra Bo Se introduce a continuaci´n la regla de cuadratura en [0, n] o n g(t) dt ≈ n ω0 g(0) + ω1 g(1) + . . . + ωn g(n) . 0 Los pesos se determinan sin m´s que exigir que sea exacta para polinomios6 , de grado n en t. a Llegamos por tanto a las condiciones n g(t) dt = n(ω0 g(0) + ω1 g(1) + . . . + ωn g(n)), g ∈ {1, t, . . . , tn }. 0 Esta forma directa de abordar el problema nos conduce al sistema     ω0 1 1 1 1 ··· 1  0 1 2 · · · n   ω1   n/2      0 1 4 · · · n2   ω2  =  n2 /3     .  .................  .   .   .  . . n n n 0 1 2 ··· n ωn n /(n + 1)     .   Implementa una funci´n que reciba como argumento n y devuelva los pesos de la f´rmula de o o 7 Newton-Cotes cerrada de n + 1 puntos . Soluci´n. Recordemos en primer lugar que los vectores en Matlab se numeran a partir o de 1, lo que exige desplazar todos los ´ ındices una unidad. Dicho esto, una implementaci´n o de la soluci´n de este ejercicio es como sigue o 01 02 03 04 05 06 07 08 09 10 11 12 % % % % % % % % % % % PESOSNEWTONCOTES V=PESONEWTONCOTES(N) devuelve en V los pesos de la formula de Newton-Cotes cerrada de N+1 puntos. Esto es, la integral de f en [a,b] se aproxima por (b-a)*(w(1)*f(x(1))+w(2)*f(x(2))+...+w(n+1)*f(x(n+1))) donde x(i)=a+(i-1)*(b-a)/n i=1,...,n+1, 6 observa que el cambio de variable lleva polinomios de grado n a polinomios de grado n La matriz del sistema recibe el nombre de Matriz de Vandermonde. Desafortunadamente es una matriz muy mal condicionada que da problemas en su resoluci´n para n moderado. Ello es consecuencia o de que la base de monomios no es buena elecci´n como base de los polinomios. o 7 121
  • 127. ´ LECCION III 7.1 F´rmulas de cuadratura o 13 14 15 16 17 18 19 20 21 22 23 function w=pesosnewtoncotes(n) r do rra Bo r=0:n; c=1; m=ones(1,n+1); for i=1:n m=[m; r.^i]; % construimos matriz del sistema c=[c; n^(i)/(i+1)]; % construimos el termino independiente end w=mc; return Con diferentes valores de n hemos obtenido los siguientes resultados 1 2 3 4 5 6 1/2 1/6 1/8 7/90 19/288 41/840 1/2 2/3 3/8 16/45 25/96 9/35 1/6 3/8 2/15 25/144 9/28 1/8 16/45 25/144 34/105 7/90 25/96 9/28 19/288 9/35 41/84 7 8 9 10 322/7409 248/7109 177/5551 94/3503 337/1628 578/2783 458/2607 2431/13693 49/64 −111/3391 27/224 −410/5059 585/3382 97/262 451/2089 722/1587 585/3382 −454/2835 282/4373 −406/933 49/64 97/262 282/4373 783/1097 337/1628 −111/3391 451/2089 −406/933 429/9871 578/2783 27/224 722/1587 248/7109 458/2607 −351/4331 177/5551 2284/12865 94/3503 Se puede comprobar que aparecen pesos negativos a partir de n = 8. Es decir, la f´rmula o de cuadratura puede dar valores negativos para una funci´n positiva. Esta inestabilidad se o vuelve m´s acusada conforme n → ∞. De hecho es muy probable que a partir de n ≈ 10 a la resoluci´n del sistema lineal de Vandermonde de resultados muy poco fiables dado el o e mal condicionamiento de la matriz8 . En cuanto a los pesos, ´stos se pueden calcular de forma m´s estable sin m´s que elegir una base adecuada de los polinomios de n. a a La f´rmula para n = 3 se suele denominar en la literatura, por razones obvias, regla o de 3/8. El grado de precisi´n de estas reglas (es decir, el grado de los polinomios para o los que las f´rmulas dan la integral exacta) es n ´ n + 1 dependiendo si n es impar o par o o respectivamente. Ejercicio 7.7 Implementa una funci´n que devuelva los pesos para las f´rmulas de Newtono o Cotes abiertas. 7.1.3. Retorno a las reglas compuestas En la secci´n precedente indicamos que el uso de f´rmulas de cuadratura simple con o o un n´mero de puntos elevados equidistribuidos no es recomendable dado que exhiben u 8 Se puede atenuar este mal condicionamiento utilizando la descomposici´n QR (ver Lecci´n IV) para o o resolver el sistema lineal 122
  • 128. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o r do rra Bo una gran inestabilidad num´rica. Este hecho est´ ´ e a ıntimamente con la inestabilidad de la interpolaci´n num´rica en estos nodos, tema al que volveremos m´s adelante (Lecci´n V). o e a o Una alternativa que proporciona mejores resultados, y que es muy sencilla de implementar, es volver a las f´rmulas de cuadratura compuestas, dividiendo el intervalo original o en varios subintervalos y aplicar en cada uno de ellos una f´rmula de cuadratura simple. o Por ejemplo la regla del trapecio es la f´rmula de cuadratura compuesta obtenida al dividir o el intervalo de integraci´n en n subintervalos y aplicar en cada uno de ellos la f´rmula de o o Newton-Cotes cerrada de dos puntos: b f (s) ds ≈ a b−a (f (a) + f (b)). 2 Deduciremos a continuaci´n la regla compuesta de Simpson. Tomemos en primer lugar o n subintervalos, con lo que habremos de evaluar en 2n + 1 puntos. Definiendo h = (b − a)/(2n), xi = a+ih (i = 0, . . . , 2n) aplicaremos la regla de Simpson simple sobre [x2i , x2i+2 ] (longitud 2h). Aparecen as´ tres t´rminos diferentes: ı e Los puntos x0 (= a) y x2n (= b) son extremos de un unico subintervalo. ´ Los puntos x2j , j = 1, . . . , n − 1, que son extremo superior de un subintervalo e inferior del siguiente ([x2j−2 , x2j ] y [x2j , x2j+2 ]). Los puntos x2j−1 que son puntos interiores de los subintervalos ([x2j−2 , x2j ]). La f´rmula que obtenemos es o 1 4 Qsp (f, h) := h f (x0 ) + 3 3 n 2 f (x2j−1 ) + 3 j=1 n−1 1 f (x2j ) + f (x2n ) . 3 j=1 (7.2) La siguiente proposici´n informa sobre el comportamiento de las tres f´rmulas como o puestas hasta ahora Proposici´n 7.3 Existen ξ1 , ξ2 , ξ3 ∈ [a, b] tales que o b h2 Qpm (f, h) − f (s) ds = f (ξ1 )(b − a), 24 a b h2 Qtr (f, h) − f (s) ds = − f (ξ2 )(b − a), 12 a b h4 (4) Qsp (f, h) − f (s) ds = − f (ξ3 )(b − a). 180 a A la luz de este resultado se concluye que el error se divide por cuatro cuando h se divide por dos para las f´rmulas del punto medio y trapecio, y por diecis´is en el caso de la o e f´rmula de Simpson. Se dice entonces que las f´rmulas tienen orden de convergencia o o 2 en los dos primeros casos y orden 4 para la regla de Simpson. Esencialmente, el resultado anterior informa de c´mo mejora la aproximaci´n de la o o f´rmula cuando aumentamos el esfuerzo computacional. Comprobamos que hay una clara o ventaja de la regla de Simpson respecto a la regla del punto medio y del trapecio. No obstante, se observa que es necesario que la funci´n tenga derivada cuarta continua para o alcanzar orden 4. En caso de que la funci´n no sea tan regular, es esperable que la regla o de Simpson pierda orden. 123
  • 129. ´ LECCION III 7.1 F´rmulas de cuadratura o Ejercicio 7.8 Deducir que la f´rmula compuesta de Simpson viene efectivamente dada por o o (7.2). Programar en una funci´n la regla de Simpson compuesta, siguiendo las directrices marcadas en el Ejercicio 7.1. r do rra Bo Ejercicio 7.9 Se trata de observar experimentalmente el orden de convergencia de las reglas del punto medio, trapecio y de Simpson, programadas en los ejercicios 7.1, 7.2 y 7.8 mediante una bater´ de experimentos. ıa Para ello, definimos una funci´n mediante inline: o >> f=inline(’x*cos(x)’); f=vectorize(f); La integral exacta se puede calcular tomando un n´mero muy elevado de puntos (por ejemu plo n = 10000) con la regla de Simpson, que es la de mayor precisi´n. Mide el error para o diferentes valores de n y observa como decrece el error. Una buena elecci´n podr´ ser o ıa n = 10, 20, 40, 80, ..., esto es, multiplicando por 2 el n´mero de puntos. Deber´ observar que u ıas para funciones suaves el error se divide por 4 o por 16, seg´n la regla que se aplique. u 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. ¿Qu´ observas con las reglas del e trapecio y del punto medio en el ultimo caso?. ´ Nota. En esta serie de experimentos se observa que la regla de Simpson no alcanza el orden que la teor´ predice en el ejemplo iii) sobre el intervalo [0, 2]. Ello es debido a que ıa las derivadas de la funci´n tienen una singularidad en el origen. o Menos simple de explicar es la superconvergencia (convergencia mejor de lo esperado) 2π que se observa para 0 cos2 (x) (punto iv)).Esto es consecuencia de que el integrando, adem´s de regular, es π−peri´dico y se est´ integrando en un m´ltiplo de su intervalo a o a u de periodicidad. En una secci´n posterior daremos una explicaci´n a este fen´meno tan o o o sorprendente. Ejercicio 7.10 Implementa la regla compuesta de 3/8, la siguiente a la regla de Simpson, que aparec´ en el Ejercicio 7.6. Compara los resultados con la regla de Simpson. ¿Qu´ observas? ıa e 9 En este caso, evaluar en 0 es una singularidad de tipo 0 · ∞. En realidad el l´ ımite cuando x → 0 es cero, que se puede tomar como valor de f (0). Una forma de evitar este problema es aplicar la f´rmula en o [ , 2] con << 1, por ejemplo, = 10−16 . Esta breve discrepancia en el extremo de integraci´n no afecta o al resultado. 124
  • 130. ´ LECCION III 7.1.4. Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o Reglas gaussianas r do rra Bo En el estudio de las f´rmulas de Newton-Cotes vimos que los pesos estaban escogidos o de manera que la f´rmula tuviese grado m´ximo de precisi´n aunque la elecci´n de los o a o o nodos, es decir, de los puntos en los que se eval´a la funci´n, estaba fijada a priori. u o Podemos plantearnos ahora hacer de la posici´n de los nodos una variable m´s del o a problema. Para ello, y con objeto de simplificar el an´lisis, nos situamos en el intervalo a [−1, 1] y buscamos la f´rmula de mayor precisi´n de dos puntos: o o ω1 , ω2 , ξ1 , ξ2 ∈ R 1 p(s) ds, ω1 p(ξ1 ) + ω2 p(ξ2 ) = p ∈ {1, s, s2 , s3 } −1 Es decir, tenemos cuatro inc´gnitas, ξ1 , ξ2 (los nodos de la f´rmula) y ω1 , ω2 (los pesos), o o y exigimos que la f´rmula integre de forma exacta a polinomios de grado 3. En principio o el problema est´ bien planteado10 . a Es un ejercicio ilustrativo resolver el sistema no lineal  + ω2 = 2,  ω1     ω ξ + ω ξ = 0,  1 1 2 2  ω1 ξ 2 + ω2 ξ 2 = 2 ,  2 1  3    3 3 ω1 ξ1 + ω2 ξ2 = 0. La soluci´n a dicho sistema es o √ ω1 = ω2 = 1, √ 3 3 ξ1 = − , ξ2 = . 3 3 En resumen, una elecci´n de los nodos nada obvia define una regla de dos puntos o con 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 nodos exigir que ´sta integre de forma exacta a polinomios de grado 2n − 1. Dada la dificultad e del sistema no lineal resultante, patente ya con n = 2, se deduce que el problema debe ser atacado desde un punto de vista muy diferente. Existe una teor´ ya cl´sica que demuestra que ıa a existe una unica regla de cuadratura que cumpla esas condiciones; ´ los pesos ωi son siempre positivos. El segundo punto es importante, pues asegura que los pesos no puedan crecer sin control dado que al ser positivos y al integrar de forma exacta a las constantes, ω1 + . . . + ωn = 2, situaci´n que no se daba en las f´rmulas de Newton-Cotes. o o 10 Tenemos cuatro ecuaciones con cuatro inc´gnitas. Sin embargo el sistema es no lineal luego la teor´ o ıa cl´sica de sistemas lineales no es aplicable. Podr´ a ıamos tener cuatro soluciones, siete soluciones, infinitas soluciones o ninguna soluci´n... o 11 Este resultado le result´ ya muy chocante a Carl Friedrich Gauss, que fue el primero en notar que o una distribuci´n nada l´gica de los nodos defin´ una f´rmula de cuadratura de mayor grado de precisi´n. o o ıa o o 125
  • 131. ´ LECCION III 7.1 F´rmulas de cuadratura o r do rra Bo La teor´ va m´s all´ puesto que es constructiva: da una forma de calcular la f´rmula ıa a a o (nodos y pesos) mucho m´s eficiente. En concreto, los nodos de la f´rmula de cuadratura a o son las ra´ de una familia de polinomios, los polinomios de Legendre, que se encuentra ıces tabulada en multitud de textos cient´ ıficos. Los pesos ωi se pueden calcular a continuaci´n o resolviendo un simple sistema lineal. En la Tabla 7.1 se pueden ver los coeficientes de las primeras reglas gaussianas. Observa que la disposici´n sim´trica de los nodos en el o e intervalo [−1, 1] y de los pesos asociados. n n=1 ωi 0 n=2 ξi 2 √ − 3/3 √ 3/3 1 1 n=3 −0.774596669 0.555555556 0.0 0.888888889 0.774596669 0.555555556 n=4 −0.861136312 0.347854845 −0.339981044 0.652145155 0.339981044 0.652145155 0.861136312 0.34785484 n=5 −0.906179846 −0.538469310 0.0 0.538469310 0.906179846 0.236926885 0.478628670 0.568888889 0.478628670 0.236926885 Cuadro 7.1: Primeras f´rmulas gaussianas o Ejercicio 7.11 (Reglas gaussianas en un intervalo arbitrario) Las f´rmulas gauso sianas se dan en el intervalo de referencia [−1, 1] por comodidad. ¿C´mo se aplicar´ en un o ıan intervalo [a, b]?. 7.1.5. Extrapolaci´n de Richardson o La extrapolaci´n de Richardson es una estrategia que permite acelerar la velocidad de o convergencia de un m´todo num´rico bajo determinadas condiciones. e e Nos centraremos en esta secci´n en la descripci´n de esta t´cnica aplicada a la f´rmula o o e o del trapecio. El m´todo resultante se conoce como m´todo de Romberg. e e 126
  • 132. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o Proposici´n 7.4 Existe una sucesi´n de n´meros (b2j )j tales que para f suficientemente o o u regular m b b2j h2j f (2j−1) (b) − f (2j−1) (a) + O(h2m+2 ). f (s) ds − Qtr (f, h) = a j=1 r do rra Bo El s´ ımbolo de Landau O(hM ) indica una cantidad que es menor que una constante multiplicada por hM y con dicha constante independiente de h. En otras palabras, es equivalente a escribir m b b2j h2j f (2j−1) (b) − f (2j−1) (a) f (s) ds − Qtr (f, h) − a ≤ Cm h2m+2 j=1 donde Cm depende de m y de la derivada m + 1 de f pero no de h. Denotando por b I= f (s) ds, c2j := b2j f (2j−1) (b) − f (2j−1) (a) α0 (h) = Qtr (f, h) a se observa que para h y h/2 se dispone de los desarrollos m c2j h2j + O(h2m+2 ), I = α0 (h) + j=1 m 1 c h2j 4j 2j I = α0 (h/2) + + O(h2m+2 ). j=1 Multiplicando la segunda ecuaci´n por 4, restando la primera y despejando I obtenemos o m I= 4α0 (h/2) − α0 (h) + 3 j=1 1 3 1 4j−1 − 1 c2j h2j + O(h2m+2 ). (1) c2j α1 (h) (1) En particular observamos que c2 desarrollo, por lo que = 0, esto es hemos cancelado el primer t´rmino del e m (1) c2j h2j + O(h2m+2 ). I = α1 (h) + (7.3) j=2 Como consecuencia I − α1 (h) = O(h4 ) ⇔ |I − α1 (h)| ≤ C4 h4 . Por tanto α1 (h) es una aproximaci´n de la integral con orden 4. Es m´s, α1 (h) cumple de o a nuevo un resultado similar al de la proposici´n anterior (ver (7.3)), por lo que podemos o repetir el mismo argumento y definir12 α2 (h) = 12 16α1 (h/2) − α1 (h) . 15 α1 (h/2) se ha obtenido igual partiendo de α0 (h/2) y α0 (h/4) 127
  • 133. ´ LECCION III 7.1 F´rmulas de cuadratura o Paso 0 Paso 2 Paso 3 / / α2 (h) / α3 (h) 6 6 α1 (h) 6 nnn nnn nnn n n n nnn nnn nnn nnn nnn nnn nnn nnn nnn / α2 (h/2) / α1 (h/2) α0 (h/2) n6 n6 nn nn nnn nnn nnn nnn nnn nnn / α1 (h/4) α0 (h/4) 6 nnn nnn nnn nnn α0 (h) r do rra Bo c o n v e r g e n c i a  Paso 1 α0 (h/8) Figura 7.3: Diagrama del m´todo de Romberg e Es f´cil ver que nuevamente I − α2 (h) tiene un desarrollo del error que comienza con a h6 puesto que este combinaci´n ha cancelado el primer t´rmino que aparec´ con α1 (h). o e ıa Como consecuencia, α2 (h) da una aproximaci´n de la integral de orden 6. En general se o pueden definir 22j αj (h/2) − αj (h) . αj+1 (h) = 22j − 1 Cada una ellas satisfaciendo |I − αj (h)| ≤ Cj h2j+2 , donde Cj es independiente de h pero de j o de f . Observa que la convergencia s´lo se o asegura para j fijo y h → 0. Su ventaja m´s palpable es que unicamente requiere aproximaciones de la integral a ´ obtenidas con una f´rmula de cuadratura sencilla. Combinando resultados para valores o distintos de h se obtiene una mejora sustancial en la aproximaci´n de la integral. Aqu´ nos o ı hemos centrado en la f´rmula del trapecio, pero se pueden adaptar a la f´rmula del punto o o medio o a la de Simpson. Es m´s, estrategias de este tipo se aplican en diversa ´reas del a a An´lisis Num´rico. Para ello, es esencial contar con un resultado del tipo enunciado en la a e Proposici´n 7.4. La extrapolaci´n sigue el sencillo diagrama de la Figura 7.3 o o Nota. Los resultados expuestos en esta secci´n, y en concreto la Proposici´n 7.4, explio o can por qu´ la f´rmula del trapecio converge mejor de lo esperado para funciones regulares e o y peri´dicas cuando se integra en un intervalo de periodicidad. Observa que en este caso o (2j−1) f (b) = f (2j−1) (a) y por tanto no hay t´rminos en hm para ning´n m. Esto es, el e u orden de convergencia es m para cualquier m, o lo que es lo mismo b f (s)ds − Qtr (f, h) ≤ Cm hm , ∀m ∈ N a donde Cm que depende de la derivada m-´sima de f (y por tanto de m) pero no de h. Con e ello se consigue una convergencia muy r´pida a la integral y bastar´n unos pocos puntos a a 128
  • 134. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o para calcular la integral con una precisi´n muy fina. o En la terminolog´ habitual en An´lisis Num´rico se dice que el m´todo tiene un orden ıa a e e de convergencia superalgebraico. Es posible probar que bajo condiciones algo m´s fuertes a 13 que la existencia de todas la derivadas b r do rra Bo f (s)ds − Qtr (f, h) ≤ Cr−n a con r > 1 y C independiente de r y de n, con lo que el orden es de hecho exponencial. Ejercicio 7.12 Comprueba que si aplicas un paso de extrapolaci´n a la f´rmula del trapecio o o compuesta obtienes el m´todo de Simpson. e Ejercicio 7.13 Implementa la extrapolaci´n de Richardson, seg´n el siguiente prototipo de o u funci´n o 01 02 03 04 05 06 07 % RICHARDSON % % V= RICHARDSON(F,A,B,N,M) Aplica la formula del trapecio con N, 2*N,4*N,..., 2^(M-1)*N puntos Construye la matriz de extrapolacion V M x M donde V(:,i) es el resultado de aplicar el paso i-1 de Richardson. Ejercicio 7.14 Existe una forma m´s general de definir la extrapolaci´n. Para ello precisamos a o que las sucesivas h decrezcan de una forma proporcional α0 (h), α0 (rh), α0 (r2 h), . . . , α0 (rn h). En el caso expuesto, r = 1/2. ¿C´mo se adapta la extrapolaci´n para otras elecciones de o o r ∈ (0, 1)?. 7.1.6. Integraci´n adaptativa o Las f´rmulas anteriores adolecen de un importante defecto: todas asumen que el como portamiento de la funci´n es m´s o menos uniforme en todo el intervalo de integraci´n. o a o La situaci´n usual es que la funci´n tenga zonas donde var´ de forma brusca y zonas o o ıa donde su comportamiento sea considerablemente m´s suave. Intuitivamente, se entiende a que las primeras zonas son las m´s problem´ticas. El siguiente paso en cualquier algorita a mo num´rico es dise˜ar m´todos adaptativos. Estos esquemas reconocen aquellas zonas e n e que requieren mayor trabajo (refinar, en la terminolog´ habitual) y aqu´llas donde basta ıa e unas pocas evaluaciones para obtener una aproximaci´n suficientemente buena. o Para abordar esta tarea debemos disponer en primer lugar de un buen estimador del error, esto es, de un postproceso que nos de informaci´n sobre el error que estamos o cometiendo y que as´ permita dilucidar qu´ partes del intervalo de integraci´n requieren ı e o mayor esfuerzo y cu´les no. a 13 Concretamente que la funci´n sea anal´ o ıtica 129
  • 135. ´ LECCION III 7.1 F´rmulas de cuadratura o r do rra Bo Zona regular Zona regular Zona Irregular Figura 7.4: Integraci´n adaptativa o A continuaci´n expondremos una implementaci´n muy sencilla de una integraci´n o o o adaptativa basada en la regla de Simpson. El estimador se basa en comparar el resultado obtenido, en cada subintervalo, por la regla de Simpson simple, y la compuesta con dos subintervalos. Dado que la regla de Simpson se obtiene de la regla del trapecio utilizando un unico ´ paso de extrapolaci´n (Ejercicio 7.12), obtenemos de (7.3) o b f (s) ds − a h f (a) + 4f (c) + f (b) 6 (1) = c2 h4 + O(h6 ) (7.4) Q1 (f ) b f (s) ds − a h f (a) + 4f (d) + 2f (c) + 4f (e) + f (b) 12 (1) = c2 4 h + O(h6 ) (7.5) 16 Q2 (f ) donde h = (b − a), c es el punto medio de (a, b), d y e, los puntos medios de (a, c) y (c, b). (1) El t´rmino dominante del error, para h suficientemente peque˜o, es c2 h4 de forma que e n b (1) f (s) ds − Q1 (f ) ≈ c2j h4 . a A priori este t´rmino no puede ser calculado, pero puede ser despejado de (7.4) y (7.5), e sin m´s que sustraer a la primera identidad la segunda. As´ obtenemos a ı Q2 (f ) − Q1 (f ) ≈ 1 − 1 16 (1) c2j h4 y por tanto 16 (1) (Q2 (f ) − Q1 (f )) ≈ c2j h4 ≈ 15 b f (s) ds − Q1 (f ) . a error 130
  • 136. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o La idea de nuestro esquema adaptativo es la que sigue: dado un intervalo [a, b] y una tolerancia ε Calculamos Q2 (f ) y Q1 (f ) como antes, y 16 (Q1 (f ) − Q2 (f )) 15 r do rra Bo est = Si est < ε el resultado se considera bueno y se devuelve Q2 (f ); Si est > ε se aplica el argumento anterior en los subintervalos [a, c] y en [c, b] con una tolerancia de /2 y se devuelve como integral la que calculada en [a, c] y en [c, b] Hay por lo tanto un proceso de subdivisi´n de los intervalos, de manera que la unica o ´ forma, en este estado inicial, de que un subintervalo no se divida es que la integral se calcule dentro de la tolerancia prefijada. Obviamente el algoritmo anterior se programa de forma natural de manera recursiva. El papel fundamental lo juega una funci´n, que podr´ seguir el siguiente prototipo o ıa simpsonadaptativo(f,a,c,b,fa,fc,fb,integ,tol) donde f es la funci´n a integrar, a y b son los extremos de integraci´n, c el punto medio, o o fa, fb y fc los valores de f en a, b y c, integ es el resultado de aplicar la regla de Simpson en [a,b] y tol la tolerancia con la que se pide la integral. Se procede entonces siguiendo los siguientes pasos 1. Se toma h=(b-a), d=(a+c)/2, e=(c+b)/2 y se calcula fd = f (d) y fe = f (e) 2. Se calcula integ21 = h/12*(fa + 4fd + fc) integ22 = h/12*(fc + 4fe + fb) integ2 = integ21 + integ22 3. Se calcula el estimador est = 16 (integ − integ2) 15 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
  • 137. ´ LECCION III 7.1 F´rmulas de cuadratura o r do rra Bo Si hemos seguido el esquema anterior y nos vemos forzados a dividir en dos subintervalos, habremos evaluado ya f en a, c y en su punto medio d y en c, b y el correspondiente punto medio e. Tambi´n se habr´ calculado la regla de Simpson en estos intervalos. Es por e a ello que enviamos todos estos valores en las llamadas de la funci´n simpsonadaptativo, o dado que generalmente la operaci´n m´s costosa es precisamente evaluar la funci´n. o a o Notemos que se ha optado por devolver como aproximaci´n de la integral Q2 (f ), en o 14 lugar de Q1 (f ) . Otra variante es devolver 16Q2 (f ) − Q1 (f ) 15 que es el primer paso de extrapolaci´n de Simpson (o el segundo del trapecio, de acuerdo o al problema 7.2). La forma m´s simple de implementar el proceso anterior es introduciendo una funci´n a o de cabecera que prepare los datos iniciales: recibe la funci´n, el intervalo de integraci´n y o o la tolerancia solicitada, y calcula para arrancar la subrutina simpsonadaptativo el punto medio c, los valores de f en a, b y c y el resultado de aplicar la regla de Simpson simple en [a, b]. Por ejemplo 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 % % % % % % % SIMPSONRECURSIVO INTEG= SIMPSONRECURSIVO (F,A,B,TOL) Devuelve una aproximacion de la integral mediante una integracion adaptativa basada en la regla de Simpson con tolerancia TOL function integ=simpsonrecursivo(f,a,b,tol) c=(a+b)/2; fa=feval(f,a); fb=feval(f,b); fc=feval(f,c); integ=(b-a)*(fa+4*fb+fc)/6; %regla de Simpson integ=simpsonadaptativo(f,a,c,b,fa,fc,fb,integ,tol); return Resta por programar la funci´n simpsonadaptativo, trabajo que proponemos al leco tor. Ejercicio 7.15 Implementa la regla de Simpson adaptativa. Ejercicio 7.16 El m´todo tal como est´ programado puede entrar en un bucle infinito si no e a se consigue integrar con la tolerancia exigida en las sucesivas subdivisiones de un intervalo. Para evitar este problema hacemos que el programa lleve control del n´mero de veces que ha u subdividido un intervalo. La funci´n puede seguir la siguiente sintaxis o 14 Casi nadie dudar´ en esta elecci´n. Es decir, es esperable que Q2 (f ) sea mejor que Q1 (f ), as´ que ¿por ıa o ı qu´ no devolver lo mejor que se tiene?. Matem´ticamente, sin embargo, el estimador del error controla e a el error de Q1 (f ) y no de Q2 (f ). 132
  • 138. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o 1.5 r do rra Bo 1 0.5 0 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 Figura 7.5: Integraci´n adaptativa de o √ 2 x [integ,subd2]=simpsonadaptativo(f,a,c,b,fa,fc,fb,integ,tol,subd) donde subd2=subd+1. Si subd2 > subdmax se devuelve un mensaje de error, se deja de subdividir y se continua la ejecuci´n del programa devolviendo el ultimo valor calculado. El o ´ par´metro subdmax puede dejarse como un valor por defecto que puede modificarse si el usuario a especifica otro valor. Es decir, entra a formar parte de un conjunto variable de argumentos de entrada. Implementa el m´todo resultante. e 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 m´todo resultante. e (Ayuda: si al final se desea que los puntos x2 est´n ordenados se puede aplicar la instrucci´n e o sort(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 y eficiencia. Un estimador es confiable si efectivamente el error est´ por debajo de lo que el a estimador calcula. Por contra, es eficiente si el estimador aproxima bien el error cometido. Nuestro estimador, en general, es poco eficiente: el error real suele estar muy por debajo de la cantidad que nos devuelve el estimador, especialmente si el intervalo de integraci´n es o √ grande. Por ejemplo, para f = x e integrando en [0, 2], se observa que con una tolerancia 133
  • 139. ´ LECCION III 7.2 Transformada r´pida de Fourier a Adaptativa Error neval 8.91e−03 7 1.41e−04 15 1.57e−06 29 2.12e−07 47 8.48e−09 77 2.64e−10 133 8.27e−12 233 2.25e−13 421 Error 8.01e−3 2.70e−3 1.03e−3 5.01e−4 2.45e−4 1.09e−4 4.73e−5 1.96e−5 Trapecio Simpson Error −3.67e−2 −1.06e−2 −3.81e−3 −1.82e−3 −8.67e−4 −3.81e−4 −1.64e−4 −6.76e−5 Error −1.01e−2 −3.59e−3 −1.40e−3 −6.90e−4 −3.33e−4 −1.36e−4 −6.41e−5 −2.65e−5 r do rra Bo tol 10−1 10−2 10−3 10−4 10−5 10−6 10−7 10−8 Pto. medio 2√ u Cuadro 7.2: Resultados num´ricos para 0 x dx. Tolerancia exigida (tol), n´mero de e evaluaciones (neval) y error cometido (Error). Comparativa con las reglas del punto medio, del trapecio y de Simpson con h fijo y el mismo n´mero de evaluaciones u de 10−5 el error real cometido por el m´todo adaptativo es 8.48 · 10−9 , un error 1000 veces e menor en magnitud. Una forma de corregir este problema es, una vez que se ha decidido dividir el intervalo de integraci´n en dos subintervalos, no exigir una tolerancia tol/2 en o cada uno de ellos, sino utilizar r ∗ tol con r ∈ [1/2, 1]. Matlab utiliza de hecho r = 1. Matlab cuenta con algunas funciones encargadas de la integraci´n num´rica: o e quad quadl dblquad triplequad Las dos ultimas aplican reglas de cuadratura para integrales dobles y triples respectiva´ mente. El comando quad implementa esencialmente el m´todo de Simpson recursivo que e hemos visto en esta secci´n. Por otro lado, quadl utiliza una regla de orden mayor que o da mejores resultados si el integrando es m´s regular. a El c´digo de estas funciones est´ abierto, luego se puede editar para ver los detalles o a de su implementaci´n. o 7.2. Transformada r´pida de Fourier a La transformada r´pida de Fourier, o FFT, seg´n sus siglas en ingl´s15 , es una hera u e ramienta muy potente en el an´lisis de se˜ales peri´dicas y cuyas aplicaciones se han a n o extendido a aspectos muy diferentes del C´lculo Num´rico. a e Existen diversas formas de introducir la FFT. Hemos escogido la interpretaci´n que o relaciona la transformada de Fourier discreta con los coeficientes de Fourier para enlazar seguidamente con algunas aplicaciones. 15 El nombre correcto ser´ transformada discreta r´pida de Fourier, para distinguirla de la transformada ıa a de Fourier continua. Sus siglas en ingl´s, FFT, podr´ entonces provenir de Fast Fourier Transform o e ıan Finite Fourier transform. De acuerdo a lo anterior, las siglas m´s adecuadas ser´ FFFT (Fast Finite a ıan Fourier transform), pero nadie utiliza esta nomenclatura, seguramente por el exceso de Fs) 134
  • 140. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o Parte de esta secci´n, especialmente la referente a la transformada r´pida de Fourier, o a se ha obtenido del libro Numerical Computing with Matlab, de Cleve Moler. 7.2.1. Transformada de Fourier discreta r do rra Bo Nota En esta secci´n seguiremos la notaci´n de Euler o o exp(iθ) = eiθ = cos θ + i sen θ, θ ∈ R, donde i es la unidad imaginaria. Dada una funci´n 1–peri´dica, ´sta se puede expresar en forma de serie de Fourier o o e f (θ) = f (m) exp(2πimθ), θ∈R (7.6) m∈Z donde f (m) es el coeficiente m-´simo de Fourier e 1 m ∈ Z. f (θ) exp(−2πimθ)dθ, f (m) = 0 La convergencia de la serie es un asunto algo delicado16 , pero si la funci´n tiene, por o ejemplo, derivada continua, la convergencia de la serie es uniforme: s f (m) exp(2πimθ)| → 0, m´x f (θ) − a θ∈[0,1] cuando r, s → ∞, m=−r lo que en particular justifica alguna de las manipulaciones que haremos a continuaci´n. o La identidad (7.6) se interpreta en el sentido de que la funci´n original f es suma o infinita de unas frecuencias fundamentales. Observa que para cada m, exp(2πimθ), es una funci´n 1/m-peri´dica, o dicho de otra forma, su periodo es 1/m (ver la Figura o o 7.6). Adem´s se tiene la relaci´n a o ∞ 1 2 |f (m)|2 |f (θ)| dθ = 0 (7.7) m=−∞ que se interpreta como que la energ´ de funci´n original f es igual a la energ´ del vector ıa o ıa infinito (. . . , f (−2), f (−1), f (0), f (1), f (2), . . .) . 16 Mucho se ha escrito sobre esto. En cualquier caso hay que especificar en qu´ sentido converge la e serie. El sitio m´s adecuado, matem´ticamente hablando, es el espacio de las funciones cuyo cuadrado a a es integrable, que se denota por L2 (0, 1). F´ ısicamente se interpreta como el espacio de las se˜ales cuya n energ´ es finita. ıa 135
  • 141. ´ LECCION III 7.2 Transformada r´pida de Fourier a Parte Real e Imaginaria de exp(2π i mθ) para m=1,2,3 Freq.1 periodo 1 Freq 2 periodo 1/2 Freq 3 periodo 1/3 1.5 r do rra Bo 1 0.5 0 -0.5 -1 -0.2 0 0.2 0.4 0.6 0.8 1 1.2 Figura 7.6: Primeras exponenciales trigonom´tricas. e Nota. Utilizando la definici´n de la exponencial trigonom´trica, podemos expresar o e ∞ ∞ (f (m) + f (−m)) cos(2πm · ) + f = f (0) + m=1 i(f (m) − f (−m)) sen(2πm · ) m=1 =: αm (7.8) =: βm donde αm y βm se pueden calcular de forma alternativa mediante 1 αm = 2 1 f (θ) cos(2πmθ) dθ, βm = 2 0 f (θ) sen(2πmθ) dθ. 0 La expresi´n (7.8) puede resultar m´s atractiva que (7.6), especialmente si la funci´n es o a o real puesto que implica trabajar unicamente con cantidades reales, sin parte imaginaria. ´ Sin embargo, tanto el an´lisis como una notaci´n m´s compacta animan a utilizar la a o a exponencial compleja. A´n es m´s, en lo que sigue podemos suponer que las funciones u a son complejas (devuelven valores en C) y por tanto se cubre este caso de forma muy natural. Desde un punto de vista pr´ctico, es poco habitual que se pueda (o que se proceda a) a evaluar la funci´n en cualquier punto. En lugar de ello se dispone de un muestreo es decir, o del valor de la funci´n en una serie de puntos uniformemente distribuidos. As´ definimos o ı xj = j , N j = 0, . . . , N − 1, se eval´a u yj := f (xj ) , j = 0, . . . , N − 1 136
  • 142. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o y se construye el vector    y=   y0 y1 . . .   .  yN −1 r do rra Bo La primera cuesti´n es o ¿Es posible recuperar los coeficientes de Fourier de f a partir de y? La respuesta obvia es no: si tomamos una cantidad finita de informaci´n es imposible o recuperar (salvo en casos triviales) los coeficientes de Fourier, que en ultima media son la ´ funci´n y, por tanto, conllevan una cantidad infinita de informaci´n. o o Ahora bien, la situaci´n es muy diferente si disponemos de informaci´n a priori sobre o o la funci´n f . Si una funci´n peri´dica f es regular podemos probar que o o o f (k) → 0, |k| → ∞ y de hecho de una forma muy r´pida (ver Ejercicio 7.18), por lo que unos pocos coeficientes a pueden ser suficientes para reconstruir la funci´n de forma muy aproximada. o Para calcular estos coeficientes utilizamos la regla del trapecio, que como hemos visto en la secci´n anterior converge muy r´pidos para funciones regulares y peri´dicas. Todo o a o lo anterior nos conduce a 1 f (k) := f (θ)exp(−2πikθ) dθ 0 f (1) = f (0) = y0 ≈ = 1 1 f (0) + N 2 1 N N −1 j=1 1 j f ( N ) exp(− 2πijk ) + f (1) N 2 ↓ = N −1 yj ω jk j=0 donde ω := exp − 2πi . N Lo anterior sugiere construir 1 Yk := N como una aproximaci´n de f (k). El vector o    Y=  N −1 yj ω jk j=0 y0 y1 . . .      yN −1 recibe el nombre de transformada discreta de Fourier de y que denotaremos por F y = Y. Por tanto F : CN → CN , es decir, transforma vectores de n´meros (en principio) u complejos en vectores complejos. 137
  • 143. ´ LECCION III 7.2 Transformada r´pida de Fourier a Ejercicio 7.18 Sea f es peri´dica con derivada primera continua, o 1 f (k) := 0 1 f (θ) exp(−2πikθ) dθ = − f (θ) exp(−2πikθ) 2πki θ=1 θ=0 =0 1 1 2πki r do rra Bo + f (θ) exp(−2πikθ) dθ. 0 Demostrar entonces que C k donde C es independiente de k. ¿De qu´ depende C?. Prueba reiterando este argumento que e si f es m´s regular el decrecimiento de f (k) es m´s acusado. a a |f (k)| ≤ Para estudiar la relaci´n entre transformada de Fourier continua y discreta precisamos o del siguiente lema Lema 7.5 Para todo k ∈ Z 1 N N −1 1, j=0 ∈ Z, k = N para alg´n u 0, exp − 2πijk = N en caso contrario. Demostraci´n. Tomemos como antes o ω := exp − 2πi . N Entonces, la suma anterior es simplemente 1 N N −1 ω j=0 jk 1 = N N −1 (ω k )j . j=0 Si k = N , es decir, si k es un m´ltiplo de N , ω k = exp(−2πi ) = 1 y la suma anterior es u 1. En caso contrario, teniendo en cuenta que 1 + r + r2 + . . . + rm−1 = 1 − rm 1−r obtenemos que 1 N N −1 (ω k )j = j=0 1 1 − (ω N )k 1 1 − (ω k )N = . N 1 − ωk N 1 − ωk Ahora, como ω N = 1, se sigue que la suma anterior es nula. Utilizando el desarrollo en Fourier de f e intercambiando el orden de los sumatorios17 podemos escribir 1 Yk := N N −1 yj ω j=0 jk 1 = N N −1 f (xj ) exp − 2πijk N j=0 17 1 = N N −1 exp f (m) m∈Z 2πi(m−k)j N . j=0 Manipulaciones que deben siempre justificarse y que son v´lidas si, por ejemplo, la funci´n tiene a o derivada primera continua. 138
  • 144. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o Por el lema anterior, N −1 exp 2πi(m−k)j N 1, 0, = j=0 si m = k + N , en caso contrario, r do rra Bo por lo que Yk = 1 N f (k + mN ). m∈Z De esta forma, Yk recoge no s´lo el coeficiente k−´simo de Fourier, sino contribuciones en o e frecuencias m´s altas, cuya distancia al coeficiente k dista un m´ltiplo de N . a u Llegado a este punto, conviene recordar que el decreciemiento r´pido a cero de los a coeficientes de Fourier cuando |k| → ∞ sugiere que Yk aproxima bien al coeficiente de Fourier m´s pr´ximo a cero y la aproximaci´n mejora muy r´pidamente cuando a o o a N → ∞. Es decir,   f (k)+ si 0 ≤ k ≤ N f (k + mN ),  2    m=0      peque˜o n (7.9) Yk =  N  f (k − N )+ f (k + mN ), si 2 < k < N .     m=0     peque˜o n A la operaci´n que a cada Y le asocia el vector original y se conoce como transforo mada inversa de Fourier discreta y se denota F −1 Y = y. Con argumentos similares a los utilizados anteriormente se puede ver que N −1 yk := Yj exp 2πijk N , j=0 obteni´ndose as´ una expresi´n muy similar a la transformada de Fourier. En particular, e ı o −1 concluimos que F existe y est´ bien definida. a Nota. En el marco continuo, ten´ ıamos que 1 f (m) = f (θ) exp(−2πimθ) dθ, 0 f (θ) = f (m) exp(2πimθ). m∈Z Obs´rvese el paralelismo entre la Transformada de Fourier Discreta, y la integral de la e expresi´n superior (la primera es la aproximaci´n discreta de la segunda) y la inversa de o o la Transformada de Fourier Discreta con la serie de Fourier. Ejercicio 7.19 Prueba la expresi´n dada para la inversa de la transformada discreta de o Fourier. 139
  • 145. ´ LECCION III 7.2 Transformada r´pida de Fourier a Ejercicio 7.20 Dado que vamos a calcular aproximaciones de los coeficientes centrales de Fourier, podr´ ıamos plantearnos definir N −1 yj ω jk , Yk = −N/2 < k ≤ N/2 j=0 r do rra Bo ¿Sabr´ ver qu´ relaci´n hay entre Yk e Yk ?. ıas e o 7.2.2. C´lculo de la transformada de Fourier Discreta a Es f´cil dar una expresi´n matricial de la transformada de Fourier discreta en t´rminos a o e de la matriz   1 1 1 ··· 1  1 ω ω2 · · · ω N −1    ω4 · · · ω 2(N −1)  , W :=  1 ω 2 ω = exp − 2πi N    ...............................  2 1 ω N −1 ω 2(N −1) · · · ω (N −1) Con esta matriz, la relaci´n entre y y su transformada Y se escribe simplemente o Y = Fy = 1 W y. N An´logamente, a y = F −1 Y = W ∗ Y donde W ∗ es la matriz adjunta  1 1 1 ··· 1 2 N −1  1 ω ω ··· ω  ∗ 4  1 ω2 ω · · · ω 2(N −1) W =  ............................... 2 1 ω N −1 ω 2(N −1) · · · ω (N −1)    ,   ω = ω −1 = exp 2πi N La matriz W es una matriz de tipo Vandermonde, que ya surgido anteriormente. Adem´s es casi ortogonal: a 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 implementaci´n directa, conlleva o la construcci´n de la matriz y realizar el producto. S´lo el producto tiene un costo de o o orden O(2N 2 ) operaciones (sumas y productos). Ejercicio 7.21 Construye la matriz W ∗ . Ejercicio 7.22 Implementa la transformada discreta de Fourier. 140
  • 146. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o Soluci´n. Esta es una implementaci´n que evita construir la matriz W . En su lugar o o calcula sucesivamente las filas, la multiplica por y para hallar el correspondiente coeficiente y calcula la siguiente fila. De esta forma se reduce la memoria utilizada pero no el n´mero u de operaciones % FT % % Y=ft(y) % r do rra Bo 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 devuelve la transformada de Fourier discreta la implementacion es la directa function Y = ft(y) y=y(:); % y es columna ahora n=length(y); w=exp(-i*2*pi*(0:n-1)/n); W=ones(1,n); Y=zeros(n,1); for j=1:n Y(j)=W*y; W=W.*w end Y=Y/n; 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´ se extiende a la transformada discreta: si y es real ıa Im y0 = 0, Re yk = Re yN −k , Im yk = −Im yN −k , k = 1, . . . , N − 1. De esta forma, si ignoramos la primera componente, la parte real de Y, respectivamente imaginaria, es sim´trico, respectivamente antisim´trico, respecto al punto N/2. Este punto e e se conoce como el punto de Nyquist. Otra analog´ con el marco continuo es que la transformada discreta de Fourier preserıa va, salvo constante multiplicativa, la norma · 2 del vector original, esto es, su energ´ ıa. Concretamente (comparar con (7.7)) 1 1 1 1 (W y)∗ (W y) = 2 y∗ W ∗ W y = y∗ y = y 2. (7.10) 2 2 N N N N Hay una falta de consenso en la definici´n de Transformada de Fourier discreta. o Nosotros hemos tomado como definici´n de la transformada y de su inversa las dadas o por N −1 N −1 1 jk Yk := yj ω , yk := Yj ω −jk , ω = exp(− 2πi ). N N j=0 j=0 Y 2 2 = Y∗ Y = 141
  • 147. ´ LECCION III 7.2 Transformada r´pida de Fourier a En Matlab, la transformada de Fourier y su inversa est´n implementadas en fft e ifft. a La definici´n que se toma es ligeramente diferente o N −1 jk Yk := yj ω , j=0 1 yk := N N −1 Yj ω −jk , ω = exp(− 2πi ). N j=0 r do rra Bo √ En otros textos se multiplica por 1/ N en ambos sumatorios con el fin de dar un aspecto m´s uniforme (en este caso la norma 2 del vector y de su transformada coinciden). En a cualquier caso, la diferencia entre las diferentes transformadas es simplemente el producto por una potencia de N . Todo lo desarrollado en esta secci´n es perfectamente aplicable a funciones peri´dicas o o con distintos periodos, sin m´s que aplicar un cambio de variables y transformarla en a 1−peri´dica. o 7.2.3. Aplicaciones a la eliminaci´n de ruido o Una de las primeras aplicaciones surge en el an´lisis de se˜ales y fen´menos peri´dicos. a n o o Vamos a mostrar un (muy) simple ejemplo en la eliminaci´n de ruido de una se˜al peri´dio n o ca. Suponemos que la se˜al, dada por una funci´n regular y suave, es perturbada por un n o ruido que puede ser modelizado por una variable aleatoria que sigue una distribuci´n o uniforme. Como la se˜al original es regular, sus coeficientes de Fourier decrecen r´pidamente n a a cero. En particular, la funci´n puede ser aproximada por una suma parcial con unas o pocas exponenciales trigonom´tricas. Dicho de otra forma, la funci´n tiene unas pocas e o frecuencias importantes mientras que el resto tiene una aportaci´n despreciable. o Tomemos por ejemplo una se˜al dada por la funci´n n o f (x) := cos(cos(12πx)) sen(2πx) o a En la Figura 7.7 se muestra la funci´n y sus coeficientes de Fourier, que decrecen r´pidamente a cero. Tambi´n se muestra una evaluaci´n en 64 puntos (un muestreo) uniformee o mente distribuidos y la transformada de Fourier discreta resultante. Obs´rvese la relaci´n e o entre transformada discreta de Fourier y los coeficientes de Fourier mostrada en (7.7). En el campo discreto, tenemos un ruido r y el vector transformada de Fourier discreta R = F r. Visto en el campo transformado, esta perturbaci´n tiene un tama˜o, relacionado o n con la amplitud del ruido y con el n´mero de puntos que se han tomado de muestra. Dado u el comportamiento altamente irregular, es esperable que las contribuciones en todas las frecuencias sean similares. Pero R 2 2 = 1 r N 2 2 ≤ m´x a j=0,...,N −1 |rj |. Por tanto, si el ruido tiene un valor m´ximo controlado, las componentes del vector transa formado tienden a cero cuando N → ∞. De hecho es esperable que este decrecimiento sea uniforme en todas las componentes, es decir, 1 Rj ≈ √ N 142
  • 148. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o Señal continua con un muestreo de 64 puntos 1 1 0.5 0.5 r do rra Bo 0 0 -0.5 -0.5 -1 0 0.2 0.4 0.6 0.8 -1 0 1 Coef. Fourier (en valor absoluto) 0.2 0.4 0.6 0.8 1 FT de la señal discreta (valor abs.) 0.4 0.4 0.3 0.3 0.2 0.2 0.1 0.1 0 -40 -20 0 20 0 40 0 10 20 30 40 50 60 Figura 7.7: Coeficientes de Fourier y transformada discreta de Fourier Ahora, si consideramos la influencia de este ruido sobre una se˜al y, tenemos la se˜al n n perturbada y = y + r. Se trata ahora de eliminar ese ruido observando la transformada Y. La estrategia que planteamos es la siguiente. En el caso de que Yj sea grande, podemos aceptar este coeficiente dado que el error relativo es peque˜o. Por contra, si Yj es n peque˜o, el error relativo que hemos introducido es tal que la informaci´n ha quedado n o irremediablemente contaminada y por tanto debemos desecharla. Lo anterior sugiere una forma de depurar la se˜ala, partiendo de un nuevo vector Z n si |Yk | es peque˜o, n 0 Zk = (7.11) Yk en otro caso. Con la informaci´n que nos queda, reconstruimos la se˜al discreta original y mediante o n −1 F Z. As´ tenemos el siguiente diagrama ı y + ruido −→ y F −→ Y (7.11) −→ Z F −1 −→ z. Al final de proceso, z es (deber´ ser) mejor aproximaci´n de y que la se˜al perturbada ıa o n y. En la Figuras 7.9 se muestran los resultados obtenidos con n = 64 y n = 256. Se puede observar como la se˜al es filtrada eliminando gran parte del ruido introducido. n 143
  • 149. ´ LECCION III 7.2 Transformada r´pida de Fourier a 0.08 0.015 0.06 r do rra Bo 0.01 0.04 0.005 0.02 0 10 20 30 0 40 0.08 8 0.06 30 40 -3 4 0.02 x 10 20 6 0.04 10 2 0 50 100 0 150 50 100 150 Figura 7.8: Ruido en un conjunto de puntos (40 arriba, 160 abajo) y su transformada discreta 7.2.4. Transformada r´pida de Fourier a La importancia del an´lisis de Fourier, y por ende de la transformada discreta de a Fourier, fue cobrando fuerza a lo largo del siglo XX y muchos aspectos siguen demandando este tipo de t´cnicas en el siglo actual. e Pronto surgieron problemas que requer´ calcular la transformada de Fourier de milıan lones de elementos, lo que colocaba el problema m´s all´ de la potencia de los ordenadores a a 18 u de la ´poca y los de un futuro previsible . En cualquier caso duplicar N , el n´mero de e elementos de y, requerir´ multiplicar por cuatro la potencia del ordenador. Siguiendo el ıa progreso de la inform´tica, esto significar´ una espera de 36 meses19 . a ıa 18 Hemos mostrado algunas aplicaciones simples de la transformada de Fourier que son esencialmente unidimensionales (una se˜al peri´dica). Existen aplicaciones que exigen trabajar ya con se˜ales bidimenn o n sionales. En ese caso, duplicar la precisi´n con la que se trabaja implica multiplicar por 4 la dimensi´n o o del problema y por 16 la complejidad computacional del algoritmo que hemos visto. Problemas en m´s a dimensiones y con n´meros muy elevados de variables no son extra˜os. u n 19 La ley de Moore formulada por Gordon Moore cofundador de Intel en 1965 es un ejemplo de una ley emp´ ırica que se viene satisfaciendo con asombrosa regularidad en los ultimos cuarenta a˜os. Esta ley ´ n establece que la potencia de c´lculo y la capacidad de almacenamiento se multiplica por 2 cada 18 meses. a De forma paralela han surgido otras versiones de la ley de Moore que establecen comportamientos de crecimiento exponencial en el mundo de la inform´tica. a 144
  • 150. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o 64 puntos Señal con ruido FT (en valor absoluto) 1 0.4 0.35 0.5 0.3 r do rra Bo 0.25 0 0.2 0.15 -0.5 0.1 0.05 -1 0 0.2 0.4 0.6 0.8 0 1 0 10 20 Truncacion de la FT 30 40 50 60 Señal filtrada 1 0.4 0.35 0.5 0.3 0.25 0 0.2 0.15 -0.5 0.1 0.05 0 0 10 20 30 40 50 -1 60 0 256 puntos Señal con ruido 0.2 0.4 0.6 0.8 1 FT (en valor absoluto) 1 0.4 0.35 0.5 0.3 0.25 0 0.2 0.15 -0.5 0.1 0.05 -1 0 0.2 0.4 0.6 0.8 0 1 0 50 Truncacion de la FT 100 150 200 250 Señal filtrada 1 0.4 0.35 0.5 0.3 0.25 0 0.2 0.15 -0.5 0.1 0.05 0 0 50 100 150 200 -1 250 0 0.2 Figura 7.9: Filtrado del ruido 145 0.4 0.6 0.8 1
  • 151. ´ LECCION III 7.2 Transformada r´pida de Fourier a En 1965, Jim Cooley, investigador ligado a IBM y John Tukey, de la Universidad de Princeton mostraron una forma sencilla de programar la transformada de Fourier discreta que reduc´ dr´sticamente el n´mero de operaciones. ıa a u La idea de partida del algoritmo es considerar el caso N = 2m. Entonces denotando ω1 := ω 2 r do rra Bo se tiene que jk ω 2jk = (ω 2 )kj = ω1 . De esta forma, si 0 ≤ k ≤ M − 1 = N/2 − 1 Yk N −1 1 N = yj ω jk j=0 1 = N M −1 y2j ω 2jk j=0 1 + N M −1 y2j+1 ω (2j+1)k j=0 Pares N = 2M ↓ = 1 1 2 M M −1 jk y2j ω1 + ω k j=0 1 M Impares M −1 jk y2j+1 ω1 j=0 1 (0) (1) Yk + ω k Yk . 2 =: (0) (7.12) (1) Notemos que Yk e Yk son el resultado de aplicar la transformada de Fourier discreta a los vectores (y0 , y2 , . . . , y2M −2 ) y a (y1 , y3 , . . . , y2M −1 ) respectivamente, que son vectores de longitud M = N/2. Si M ≤ k ≤ N − 1 la relaci´n cambia levemente. Para ello, escribamos k = M + κ, o donde ahora 0 ≤ κ ≤ M − 1. Entonces Yk 1 = N = N −1 yj ω jk j=0 1 1 2 M 1 = N M −1 y2j ω 2jk j=0 M −1 jM jκ y2j ω1 ω1 + ω M ω κ j=0 1 + N 1 M M −1 y2j+1 ω (2j+1)k j=0 M −1 jκ y2j+1 ω1 . j=0 Dado que ω M = exp(−πi) = −1, M ω1 = 1; se deduce que 1 (0) (7.13) Yκ − ω κ Yκ(1) . 2 v Denotando por w el vector resultado de enlazar los vectores v y w, las identidades (7.12) y (7.13) se puede escribir en notaci´n vectorial o Yk = 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 ) , 146 ω := exp(− 2πi ), N (7.15)
  • 152. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o y “.*” denota el producto elemento a elemento entre las componentes de los vectores. En cuando al n´mero de operaciones, si f (N ) es el n´mero de multiplicaciones, se u u comprueba que el total de productos es el de dos transformadas de longitud N/2 m´s N a productos realizados al combinar dichas transformadas. En resumen, r do rra Bo f (N ) = 2f (N/2) + N. Nada nos impide aplicar de forma reiterada el algoritmo anterior para calcular Y(0) e Y(1) si M es divisible por 2 (o lo que es lo mismo, que N sea divisible por 4). De forma natural, se puede programar el m´todo de forma recursiva. e El caso ´ptimo del algoritmo en la versi´n anterior se da cuando N = 2p . El algoritmo o o queda de la siguiente forma FFT N =length(y) if N==1 Y=y else Y(0) := FFT(y(0 : 2 : N − 2)) % Parte ‘‘par’’ Y(1) := FFT(y(1 : 2 : N − 1)) % Parte ‘‘impar’’ ω = exp(−2πi/N ) ω := [ω 0 , ω 1 , . . . , ω N/2−1 ] Y(0 : N/2 − 1) = (Y(0) + ω. ∗ Y(1) )/2 Y(N/2 : N − 1) = (Y(0) − ω. ∗ Y(1) )/2 end En tal caso, se puede comprobar que el n´mero de productos es u f (N ) = 2p (p + 1) = N (log2 (N ) + 1) que debe compararse con el N 2 esperable de la implementaci´n directa. De ah´ viene el o ı nombre de Transformada R´pida de Fourier. a Ejercicio 7.24 Implementa la transformada r´pida de Fourier. a Ayuda. No utilices fft como nombre de esta funci´n, dado que ´ste es el comando de o e Matlab para el c´lculo de la transformada r´pida de Fourier. Entrando ya en programa, en a a primer lugar podemos plantearnos c´mo se va a devolver el resultado, si como un vector o fila o como un vector columna. Para ello, la primera instrucci´n de nuestra subrutina o podr´ ser ıa y=y(:); Y=y; si se quiere trabajar s´lo con columnas, o o 147
  • 153. ´ LECCION III 7.2 Transformada r´pida de Fourier a y=y(:).’; Y=y; si se desea implementar para filas. F´ ıjate que ya hemos introducido el vector que va a guardar la transformada de Fourier y que sus dimensiones coinciden con las del vector y. Llegado a este punto, hay que tener cuidado al programar el producto r do rra Bo ω. ∗ Y(1) para que los vectores implicados, ω e Y(1) tengan igual dimensi´n. o Si el vector tiene un n´mero par de elementos, la transformada se calcula a partir de u la transformada de los vectores y(1 : 2 : n) y(2 : 2 : n) −→ −→ (y0 , y2 , . . . , yn−2 ) , (y1 , y3 , . . . , yn−1 ) , (Y(0) ) (Y(1) ) de acuerdo con el algoritmo (v´ase tambi´n (7.14) y (7.15)). e e Cuando el n´mero de entradas de y no sea una potencia de 2 se puede utilizar el primer u ıamos la siguiente estructura algoritmo que dimos (ejercicio 7.22). De esta manera tendr´ 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 divisi´n de m entre n y sirve o para comprobar si el n´mero de entradas es par o impar. u Ejercicio 7.25 Implementa una funci´n recursiva que devuelva el n´mero de operaciones o u para el c´lculo de la FFT. Util´ a ızala para obtener una tabla con el n´mero de operaciones para u algunos valores altos de N . Compara con el n´mero de operaciones requerido en la versi´n u o inicial del algoritmo dada antes. ´ Soluci´n. Esta es una forma simple de implementar la funci´n o o 01 02 03 04 05 06 07 08 09 10 11 12 13 % OPERACIONESFFT(N) % % M=OPERACIONESFFT(N) % % M es el numero de operaciones de la FFT function M=operacionesFFT(N) if mod(N,2)==1 M=N^2; else M=operacionesFFT(N/2)*2+N; end 148
  • 154. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o ´ Hemos testado la funci´n con 219 y 219 − 1 que es primo. Este es el resultado o r do rra Bo >> format rat >> operacionesfft(2^19) %(2^19 approx 500.000) ans= 10485760 >> operacionesfft(2^19-1) ans = 274876858369 Observa que el n´mero de operaciones efectuadas se reduce en un factor de 26000 si u aumentamos en uno el n´mero de elementos. u Ejercicio 7.26 Implementa la Inversa de la Transformada Discreta de Fourier con nombre InvTrRaFourier. Ejercicio 7.27 En este ejercicio observaremos la dependencia de la FFT implementada en Matlab respecto del n´mero de entradas del vector. Para ello, utilizaremos de nuevo los valores u 19 19 2 − 1 y 2 propuesto anteriormente. Define dos vectores y1 y y2 con 219 − 1 y 219 componentes respectivamente, por ejemplo, mediante la orden rand. Aplica fft(y1) y fft(y2) y comprueba el tiempo que tarda en cada caso. ¿Sabr´ explicar por qu´ se reduce el tiempo ıas e de c´lculo?. a Nota final Las implementaciones comerciales de la FFT son ciertamente m´s complicadas que a lo que hemos visto. En realidad, los m´todos recursivos son menos eficientes que las e implementaciones directas, que no hacen uso de la recursividad. En lugar de ello se opta por una programaci´n directa, m´s refinada. No s´lo se o a o descompone la transformada en dos de longitud mitad de la original, como se ha mostrado en este algoritmo, sino que adem´s se intenta dividir por los primeros n´meros primos 2, a u 3, 5, 7,... reduci´ndola a dos, tres, cinco o siete transformadas y as´ sucesivamente. Incluso e ı el caso de n´meros primos se realiza de forma m´s ´ptima que el algoritmo (ingenuo) del u a o ejercicio 7.22. Los comandos en Matlab que devuelven la transformada de Fourier y su inversa son fft e ifft. Puede consultarse la ayuda para ver algunos detalles sobre su funcionamiento e implementaci´n. Existen otras transformadas ligadas a ´sta. Por ejemplo, la transformada o e del coseno y la del seno, tambi´n implementadas en Matlab (dct, idct, dst y idst). . e 149
  • 155. ´ LECCION III 7.2 Transformada r´pida de Fourier a La FFT y el producto de n´ meros enteros u Dados dos vectores u = (u0 , u1 , . . . , ur ) , v = (v0 , v1 , . . . , vs ) r do rra Bo se define el vector convoluci´n u ∗ v al vector de r + s + 1 componentes cuya entrada k o viene dada por m´ ın{k,r} (u ∗ v)k := u vj = +j=k u vk− , (7.16) (k = 0, . . . , r + s). =m´x{0,k−s} a Es f´cil comprobar que la convoluci´n, tambi´n llamado producto de convoluci´n, es a o e o conmutativo. Esta operaci´n es simplemente el producto de polinomios. En efecto, si o consideramos los polinomios u0 + u 1 x + . . . + u r x r , v0 + v1 x + . . . + vs xs entonces el coeficiente en xk del polinomios producto viene dado precisamente por (7.16). Una propiedad interesante de la transformada de Fourier discreta es que convierte la convoluci´n de dos vectores en producto de transformadas. Tomemos N = r + s. Si u y o v se insertan en Rn+1 rellenando con ceros u = (u0 , u1 , . . . , ur , 0, . . . , 0 ) , v = (v0 , v1 , . . . , vs , N − r = s ceros 0, . . . , 0 ) N − s = r ceros tenemos que F (u ∗ v) = N (F (u). ∗ F (v)), donde la operaci´n anterior es el producto elemento a elemento entre los vectores. As´ una o ı, forma r´pida de calcular la convoluci´n de los dos vectores es seguir el siguiente algoritmo a o Calcular U = F (u), V = F (v) Multiplicar W = N U. ∗ V Devolver F −1 (W) Si N = r + s es una potencia de 2 entonces el n´mero de operaciones es del orden de u O(n log2 (N )), comparado con 2N 2 que tiene la implementaci´n m´s directa. o a Una de las aplicaciones m´s simples del c´lculo de productos de convoluci´n est´ en a a o a el producto de n´meros enteros. Por ejemplo, u 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 convoluci´n entre dos vectores: o 6031 → (1, 3, 0, 6, 0, 0, 0, 0) =: u 1234 → (4, 3, 2, 1, 0, 0, 0, 0) =: v ⇒ u ∗ v = (4, 15, 11, 31, 21, 12, 6) Por tanto, la FFT nos ofrece una forma muy r´pida de multiplicar dos n´meros enteros. a u 150
  • 156. ´ LECCION III Cap´ ıtulo 7. F´rmulas de cuadratura. FFT o Ejercicio 7.28 Implementa una funci´n que calcule el producto de dos n´meros enteros con o u la transformada de Fourier de acuerdo al siguiente prototipo r do rra Bo % 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 m´todo sea realmente eficiente necesitamos que los vectores sobre los e que se va a aplicar la transformada de Fourier tengan longitud una potencia de 2. Para ello podemos insertar m´s ceros de los inicialmente previstos de forma que N sea una a potencia20 de 2. Para disponer de una precisi´n en principio ilimitada, introduciremos los n´meros o u que deseamos multiplicar en una cadena de caracteres y haremos la salida en el mismo formato. Para su implementaci´n necesitaremos manejarnos con la conversi´n entre los o o diversos formatos de datos. Una cadena o string es simplemente un vector de caracteres y as´ lo maneja Matlab: ı >> p=’esto es una prueba’ ans= esto es una prueba >> p(3) ans= t >> p(6:9) ans = es u Har´ falta transformar un vector de caracteres a un vector de n´meros y viceversa. Para a u ello se puede utilizar los comandos str2num, num2str(STRing-to-NUMeric y NUMericto-STRing). Una vez que tengamos el vector de n´meros hay que darle la vuelta al vector, de forma u que ’1234’ [4 3 2 1]. 20 ¿Qu´ hace log2(ceil(r+s))? e 151
  • 157. ´ LECCION III 7.2 Transformada r´pida de Fourier a Por ultimo una vez multiplicados hay un paso de acarreo, es decir, un resultado de forma ´ que [4 15 11 31 21 12 6] 4 + 15 · 101 + 11 · 102 + 31 · 103 + 21 · 104 + 12 · 105 + 6 · 106 debe transformarse en su representaci´n decimal o r do rra Bo 4 + 5 · 101 + 2 · 102 + 2 · 103 + 4 · 104 + 4 · 105 + 7 · 106 = 744224. Nota. ¿Para qu´ preocuparse en multiplicar n´meros enteros? Es decir, no parece haber e u una necesidad acuciente de dise˜ar algorimos para multiplicar n´meros de centenares o n u miles de cifras. Una aplicaci´n sorprendente proviene del mundo de cifrado de mensajes. o El sistema de cifrado m´s popular actualmente es el RSA, propuesto por los matem´ticos21 a a Ron Rivest, Adin Shamir y Len Adleman en 1977, est´ basado en el conocido Teorema a Peque˜o de Fermat22 . Este teorema, muy simple, tiene que ver con los restos de la divisi´n n o por n´meros primos. El mensaje que se desea enviar se convierte en un n´mero entero, u u m´s o menos largo. El cifrado y descifrado del mensaje se basa en calcular restos de dia visiones por el producto de dos n´meros primos muy grandes. La seguridad del sistema u depende directamente del tama˜o de estos primos: mayor tama˜o es mayor seguridad. n n Ello hace que se requiera calcular productos y divisiones de n´meros enteros enormes de u forma r´pida y eficiente23 . a Nota. La convoluci´n est´ implementada en Matlab mediante el comando conv. La o a forma de calcular es esencialmente la expuesta en esta secci´n. o 21 El nombre del algoritmo son las iniciales de sus apellidos. ´ Nada que ver con el Ultimo Teorema de Fermat, cuya demostraci´n tuvo que esperar cuatro siglos. o 23 Para una informaci´n m´s detallada, m´ o a ırese por ejemplo http://en.wikipedia.org/wiki/Rsa. 22 152
  • 158. r do rra Bo Lecci´n IV o C´lculo simb´lico, arrays y celdas en Matlab. a o Valores y vectores propios. Google. 153
  • 159. r do rra Bo
  • 160. r do rra Bo Introducci´n o La physique ne nous donne pas seulement l’occasion de r´soudre des probl`mes... elle e e nous fait pressentir la solution Henri Poincar´ e En la primera parte de esta lecci´n trataremos diversos aspectos instrumentales de o Matlab, como el manejo de polinomios, arrays multidimensionales (tensores) y vectores de celdas. Daremos adem´s algunos esbozos sobre la manipulaci´n de expresiones simb´licas. a o o Aunque en este campo Matlab no es comparable a otros manipuladores simb´licos como o Maple o Mathematica, puede resultar en muchos casos suficiente. En la segunda parte trataremos el c´lculo de valores y vectores propios de Matlab. a Volvemos por tanto a incidir en el manejo de vectores y matrices, y en ese sentido es un recordatorio de lo que vimos en las Lecciones 1 y 2. Con el fin de aliviar el peso te´rico de o la parte matem´tica, terminaremos con un cap´ a ıtulo fundamentalmente divulgativo sobre Google y su algoritmo de evaluaci´n de p´ginas web Pageranktm . o a 155
  • 161. r do rra Bo
  • 162. r do rra Bo Cap´ ıtulo 8 Matlab: C´lculo simb´lico y a o estructuras de datos. 8.1. Polinomios y c´lculo simb´lico a o Los polinomios constituyen las funciones m´s simples en Matem´ticas y computaa a cionalmente son importantes habida cuenta que contienen en su estructura las operaciones b´sicas en un ordenador. En esta secci´n veremos como maneja Matlab un polinomio y a o nos servir´ de preparaci´n para la secci´n siguiente donde veremos someramente la toolbox a o o de c´lculo simb´lico. a o 8.1.1. Polinomios Matlab maneja un polinomio identific´ndolo simplemente con un vector de n´meros a u (en principio) reales. Concretamente, el vector fila (an , . . . , a0 ) corresponde al polinomio an xn + an−1 xn−1 + . . . + a0 . Si alg´n coeficiente es nulo, debe incluirse. Por ejemplo, el u vector (1, 0, 2) representa el polinomio x2 + 2. Sumar y restar dos polinomios se reduce as´ a sumar y restar dos vectores, salvando el problema de que ambos deben tener el ı mismo grado: >> p=[2 0 1]; % 2*x^2+1 >> q=[-1 1 -1 0 1]; % -x^4+x^3-x^2+1 >> p+q % ERROR!! ??? Error using ==> plus Matrix dimensions must agree. >> p=[0 0 2 0 1]; >> p+q % dos coeficientes mas % ahora OK! ans= -1 1 1 0 2 El producto y divisi´n de polinomios est´n implementados respectivamente en los comano a dos conv y deconv 157
  • 163. ´ LECCION IV 8.1 Polinomios y c´lculo simb´lico a o >> p=[2 0 1]; q=[-1 1 -1 0 1]; >> conv(p,q) ans = 2 -3 1 1 0 1 r do rra Bo -2 >> deconv(q,p) ans= -0.5000 0.5000 -0.2500 Ejercicio 8.1 Implementa una funci´n que calcule la suma de dos polinomios, su producto, o cociente y resto seg´n el siguiente prototipo u 01 02 03 04 OPERACIONESPOL(P1,P2) [S,R,C,P]= OPERACIONESPOL(P1,P2) S, R, C y P son la suma, resta cociente y producto de P1 y P2 (Ayuda: P1 y P2 deben ser de la misma longitud. ¿Qu´ hace la instrucci´n e o p1=[zeros(1,length(p2)-length(p1)) p2] cuando length(p2)>length(p1)? Comprueba que tambi´n es v´lida cuando length(p2)<length(p1). e a ¿Qu´ hace entonces?.) e El comando polyval se encarga de la evaluaci´n de un polinomio: o >> 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 ecuaci´n p(x) = 0. El Teorema o 1 ´ Fundamental del Algebra afirma que un polinomio de grado n tiene exactamente n ra´ ıces en C (alguna puede estar repetida). 1 Demostrado por primera vez por Carl Friedrich Gauss en 1799 (a los 22 a˜os) en su tesis doctoral. n Gauss ha salido repetidamente en estas lecciones y en campos muy distintos, desde las Matem´ticas m´s a a aplicadas a las m´s puras. Quiz´s ahora se comprenda mejor por qu´ recibi´ el sobrenombre de“pr´ a a e o ıncipe de las Matem´ticas”. a 158
  • 164. ´ LECCION IV Cap´ ıtulo 8. Matlab: C´lculo simb´lico y estructuras de datos. a o En Matlab podemos utilizar roots para calcular de forma aproximada las ra´ de un ıces polinomio: >> pol=[2 -3 -17 30]; % 2*x^2-3*x^2-17*x+30 >> roots(pol) r do rra Bo 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 polinomio m´nico (el coeficiente que acompa˜a a la mayor potencia de x es 1) cuyas ra´ sean las o n ıces dadas: >> poly([-3 5/2 2]) ans = 1 -3/2 -17/2 15 El comando poly puede emplearse tambi´n para construir el polinomio caracter´ e ıstico de una matriz cuadrada A, es decir, el polinomio det(A − xI) donde I es la matriz identidad de orden n. Por ejemplo, >> A=[3 -2 2;-1 2 2;-1 1 3]; >> p=poly(A) %pol caract. (monico) p = 1 -8 19 >> roots(p).’ ans = 4 3 1 159 -12
  • 165. ´ LECCION IV 8.1 Polinomios y c´lculo simb´lico a o En la segunda parte de esta lecci´n nos centraremos en los m´todos num´ricos para el o e e 2 c´lculo de las ra´ de estos polinomios . a ıces r do rra Bo Nota. Un problema cl´sico3 es la determinaci´n de las ra´ a o ıces de un polinomio. La ecuaci´n de segundo grado aparece m´s o menos resuelta en las Matem´ticas antiguas: o a a babil´nicas, griegas, hind´es y ´rabes. Es un hecho muy resaltable que no exist´ una o u a ıa f´rmula para la soluci´n como la como la que conocemos hoy en d´ sino que los autores o o ıa, describ´ diversas ecuaciones, habitualmente con ejemplos concretos, para luego explicar ıan e ıan c´mo se proced´ a resolverlas4 a menudo con razonamientos geom´tricos que exclu´ o ıa cualquier resultado negativo. Fue en las matem´ticas hind´es donde las ra´ a u ıces negativas fueron consideradas como v´lidas. a Las matem´ticas italianas primero y europeas despu´s retoman a partir del siglo XV a e las ecuaciones polin´micas. Nicolo Fontana Tartaglia, Girolamo Cardano, Fran¸ois Vi`te, o c e Ren´ Descartes, Gottfried Wilhelm von Leibniz, Joseph-Louis Lagrange y Leonhard Euler e entre otros matem´ticos de menor renombre, estudiaron la resoluci´n por radicales de a o ecuaciones polin´micas de tercer y cuarto grado con un resultado final satisfactorio: se o consigui´ dar con f´rmulas que proporcionaban las ra´ de un polinomio de grado 4. Sin o o ıces embargo fueron incapaces de encontrar una f´rmula para la ecuaci´n general de quinto o o grado. La cuesti´n qued´ zanjada de forma sorprendente: Niels Henrik Abel prob´ en 1824 o o o (a los 22 a˜os) que no exist´ un f´rmula que diera las ra´ n ıa o ıces de cualquier polinomio de ıces e ´ grado 5 mediante la aplicaci´n de radicales5 tomando ra´ en´simas. En ultima medida, o se hab´ llegado a la conclusi´n de que era imposible la resoluci´n exacta de ecuaciones ıa o o polin´micas de grado mayor o igual que cinco. El estudio de cu´ndo una ecuaci´n se pod´ o a o ıa resolver mediante radicales fue iniciado por Evariste Galois6 . Otro asunto muy diferente es la resoluci´n num´rica del problema. Se dispone de una o e familia de m´todos para la resoluci´n de problemas no lineales generales (es decir, para e o ecuaciones de la forma f (x) = 0 donde f es una funci´n cualquiera, no necesariamente o polin´mica) como los m´todos de Newton-Raphson, secante, regula–falsi, etc. Sin emo e bargo, dadas las particulares propiedades de los polinomios, hay m´todos especialmente e dise˜ados para tal fin. Algunos m´todos cl´sicos son los de Bairstow y el de Bernoulli. En n e a los ultimos a˜os el c´lculo de las ra´ ´ n a ıces de un polinomio ha quedado reducido al c´lculo a 2 Las ra´ ıces son los valores propios de la matriz A. La informaci´n de estas l´ o ıneas se ha extra´ ıdo de la web “MacTutor History of Mathematics Archive” de la Universidad de St. Andrews (Escocia). La direcci´n electr´nica es http://turnbull.mcs.sto o and.ac.uk/history/ 4 al-Khwarizm clasific´ y explic´ c´mo resolver ecuaciones de segundo grado en 6 tomos. El desarrollo o o o ´ del Algebra y la manipulaci´n simb´lica de expresiones ha conseguido que este problema pueda ser o o planteado en nuestros d´ a un alumno de primaria. ıas 5 Paolo Ruffini hab´ dado una demostraci´n no del todo correcta en 1799. ıa o 6 Galois y Abel comparten algunas caracter´ ısticas en com´n, ambos murieron jovenes (Abel a los 29 u a˜os y Galois a los 21) con buena parte de su trabajo ignorado por la comunidad matem´tica. La muerte n a de Galois es todav´ m´s sorprendente. Franc´s y republicano convencido, lleg´ a estar en prisi´n por ello, ıa a e o o muri´ en un duelo en 1832 en los a˜os convulsos posteriores a la revoluci´n francesa, aunque no est´ claro o n o a si ´ste fue por motivos pol´ e ıticos o de otra ´ ındole. En la noche anterior al duelo escribir´ en el margen de ıa unas notas sobre las que trabaja: “Falta algo para completar la demostraci´n. No tengo tiempo.”. Esta o frase ha cimentado la, probablemente exagerada, leyenda de que paso la noche escribiendo Matem´ticas. a Su trabajo fue rescatado del olvido por Joseph Liouville 11 a˜os despu´s. n e 3 160
  • 166. ´ LECCION IV Cap´ ıtulo 8. Matlab: C´lculo simb´lico y estructuras de datos. a o de los valores propios de una matriz, simplemente construyendo la matriz compa˜era7 n −an−1 −an−2  1 0   0 1   ..  . 0 0  xn + an−1 xn−1 + . . . a0 r do rra Bo  · · · −a1 −a0 ··· 0 0   ..  . 0 0  .  .. .. .  . . . ··· 1 0 Al c´lculo de los valores propios de una matriz volveremos en la segunda parte de esta a lecci´n. o 8.2. Procesador simb´lico o Retomando el hilo de la secci´n anterior, otra forma de operar con polinomios es de o manera simb´lica. Para ello podemos proceder del siguiente modo: o >> 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 atenci´n la primera instrucci´n. Con syms, declaramos x con una variable o o simb´lica y por tanto susceptible de entrar en expresiones y manipulaciones algebraicas. o Las ´rdenes anteriores pueden aplicarse sobre funciones cualesquiera, no necesariao mente polin´micas: o >> syms x y >> expand(cos(x+y)) ans= cos(x)*cos(y)-sin(x)*sin(y) Podemos llevar a cabo operaciones de c´lculo b´sico tales como la integraci´n o la a a o derivaci´n: o 7 De hecho, as´ procede roots. ı 161
  • 167. ´ LECCION IV 8.2 Procesador simb´lico o >> diff(x*cos(x^2)) %derivada ans = cos(x^2)-2*x^2*sin(x^2) r do rra Bo >> 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 o Laplace (fourier, ifourier, laplace e ilaplace) Observa como los resultados son s´ ımbolos y no n´meros. En cualquier caso, el comando u vpa procede a evaluar con la precisi´n solicitada (si es posible) o >> 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
  • 168. ´ LECCION IV Cap´ ıtulo 8. Matlab: C´lculo simb´lico y estructuras de datos. a o Nota. La derivaci´n e integraci´n de un polinomio se puede hacer tambi´n con polyder o o e y polyint que trabaja directamente sobre el vector que almacena el polinomio, es decir, no es simb´lico: o >> polyder([1 4 2]) % derivada de x^2+4*x-2 r do rra Bo ans= 2 4 Ejercicio 8.2 Los siguientes comandos inciden en la simplificaci´n y manipulaci´n de expreo o siones simplify factor expand collect simple Consulta la ayuda de Matlab y apl´ ıcalos sobre diferentes expresiones algebraicas susceptibles de ser simplificadas. Para la resoluci´n de ecuaciones y sistemas de ecuaciones mediante m´todos simb´licos, o e o 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 t´rmino independiente es cero puede omitirse: e >> solve(’x*log(x^2+4*x-4)’) De forma an´loga, dsolve busca las soluciones de ecuaciones y sistemas diferenciales: a >> 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 ecuaci´n de cuarto grado o x4 + ax3 + bx2 + cx + d. 163
  • 169. ´ LECCION IV 8.3 Tensores r do rra Bo Nota. Matlab es un programa m´s enfocado al c´lculo num´rico que al simb´lico. Ciera a e o tamente los resultados son presentados de una forma que est´ticamente no es comparable e a Mathematica o Maple. Sin embargo se puede acceder a cualquier instrucci´n de Maple o luego a priori todo lo que se puede hacer con este procesador se puede hacer con Matlab. Para llamar a un comando de Maple se utiliza el comando maple, mientras que a la ayuda correspondiente se accede con mhelp. 8.3. Tensores Ya hemos hablado en m´ltiples ocasiones de la gran potencia que posee Matlab para u 8 realizar c´lculos matriciales y su habilidad en el manejo de grandes cantidades de memoa ria. Estas habilidades se extienden a la manipulaci´n de arrays multidimensionales, que o matem´ticamente se puede identificar con tensores. Un tensor es simplemente una matriz a multidimensional, esto es, si una matriz se puede interpretar como una tabla de n´meros, u un tensor (o array) tridimensional es simplemente un conjunto de n´meros desplegados u en 3D en forma de paralelogramo. As´ ı >> a=zeros(1,3,2) a(:,:,1) = 0 0 0 0 0 a(:,:,2) = 0 define un array de una fila, tres columnas y dos alturas. Abandonaremos en lo que sigue este s´ ımil geom´trico pues aporta poco. Se puede declarar un tensor simplemente dando e sus valores >> a2(:,:,1)=[1 2 3;4 5 6] a2 = 1 4 2 5 3 6 >> a2(:,:,2)=[7 8 9;10 11 12] a2(:,:,1) = 1 4 8 2 5 3 6 Recuerda Matlab = Matrix laboratory 164
  • 170. ´ LECCION IV Cap´ ıtulo 8. Matlab: C´lculo simb´lico y estructuras de datos. a o a2(:,:,2) = 8 11 9 12 3 2 r do rra Bo 7 10 >> size(a) ans = 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
  • 171. ´ LECCION IV 8.3 Tensores 1 4 2 5 3 6 r do rra Bo Por tanto, de las variables que acabamos de definir unicamente a3 es una matriz propia´ mente dicha. La forma de operar con tensores es b´sicamente la misma que con vectores y matrices. a Por ejemplo: >> b=a+ones(2,3,2) b(:,:,1) = 2 5 3 6 4 7 9 12 10 13 b(:,:,2) = 8 11 >> b(:,2:3,2)=[-1 -2;-3 -4] b(:,:,1) = 2 3 3 3 4 3 -1 -3 -2 -4 b(:,:,2) = 8 3 >> b(:)’ % como se guarda en memoria... ans = 2 3 3 3 4 3 8 3 -1 -3 -2 -4 Ejemplo. Mediante las siguientes ordenes calculamos las cinco primeras potencias de la matriz a y las almacenamos en una variable tridimensional b: a=[1 2;3 4]; b(:,:,1)=a; for i=2:5 b(:,:,i)=b(:,:,i-1)*a; end %b(:,:,i) guarda a^i 166
  • 172. ´ LECCION IV Cap´ ıtulo 8. Matlab: C´lculo simb´lico y estructuras de datos. a o r do rra Bo Las funciones que operan sobre escalares, tales como sin, cos, etc., funcionan con tensores exactamente del mismo modo que con vectores o matrices, realizando las operaciones elemento a elemento. Si se aplica una funci´n de las que operan sobre los elementos o de un tensor como por ejemplo b´squeda de m´ximos o m´ u a ınimos (max, min) o la suma y producto (sum, prod), devuelve un tensor de una dimensi´n menos, resultado de realizar o la operaci´n sobre la primera dimensi´n: o o >> a=zeros(2,3,2); >> a(:,:,1)=[1 2 8; 4 5 6]; a(:,:,2)=[6 2 14; 3 5 1] a(:,:,1) = 1 4 2 5 8 6 2 5 14 1 a(:,:,2) = 6 3 >> 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
  • 173. ´ LECCION IV 8.4 Vectores de celdas 8.4. Vectores de celdas r do rra Bo Aunque los tensores a˜aden mayor flexibilidad a las matrices y vectores, siguen siendo n estructuras r´ ıgidas (todas las entradas deben ser n´meros reales, a(1,:,:,:) debe tener u la misma dimensi´n que a(2,:,:,:),...). o Matlab cuenta con una estructura que probablemente sea el paradigma de la flexibilidad en tanto en cuanto permite guardar casi cualquier tipo de dato. Es, por as´ decirlo, un ı “caj´n de sastre”. Este tipo de estructura se denomina vector (matriz o tensor) de celdas o o cell array. Ya nos hemos encontrado con esta estructura cuando vimos el dise˜o de n funciones cuyo n´mero de par´metros de entrada y/o salida era variable. Las variables u a varargin y varargout son realmente vectores de celdas que conten´ distintos tipos de ıan datos a los que se acced´ mediante llaves. Un vector de celdas se maneja del mismo. A ıa modo de ejemplo podemos crear un vector de celdas simplemente asignando valores >> celda={7,[1 2 3;4 5 6],’una cadena de caracteres’,inline(’x+y’)}; >> whos celda Name Size Bytes Class celda 1x4 1214 cell array Grand total is 95 elements using 1214 bytes que es equivalente a dar cada una de sus componentes >> >> >> >> celda{1}=7; celda{2}=[1 2 3;4 5 6]; celda{3}=’una cadena de caracteres’; celda{4}=inline(’x+y’); Tambi´n se puede proceder, con peque˜as diferencias de sintaxis, de la siguiente forma e n >> celda(1)={7}; >> celda(2)={[1 2 3;4 5 6]}; F´ ıjate en la disposici´n de las llaves en los dos ejemplos anteriores. En cualquier caso, una o vez definido el vector podemos acceder a cada una de sus componentes indicando entre llaves su posici´n o >> celda{1} ans = 7 >> celda{4}([1 2 4], [2 1 1/2]) ans = 3.0000 3.0000 4.5000 168 % funcion!!
  • 174. ´ LECCION IV Cap´ ıtulo 8. Matlab: C´lculo simb´lico y estructuras de datos. a o o visualizar todas ellas mediante >> celldisp(celda) celda{1} = r do rra Bo 7 celda{2} = 1 4 2 5 3 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 informaci´n, es o sin embargo manejada con menor eficiencia por Matlab, por lo que debe hacerse un uso mesurado de ella. Los comandos varargin y varargout proporcionan un buen ejemplo de una utilizaci´n apropiada de esta estructura. o 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 ejemplo, la estructura Libro podr´ contener los campos Titulo y Autor que ser´ cadenas de ıa ıan caracteres y A~oPublicacion y NumeroPaginas que ser´ n´meros. n ıan u Utiliza la ayuda de Matlab para averiguar c´mo pueden definirse estos tipos de datos o mediante la orden struct. 169
  • 175. ´ LECCION IV 8.4 Vectores de celdas r do rra Bo 170
  • 176. r do rra Bo Cap´ ıtulo 9 C´lculo num´rico de valores y a e vectores propios. 9.1. Introducci´n o El estudio de los valores y vectores propios de una matriz surge ligado a una gran cantidad de problemas que se plantean en ´mbitos de muy diversa ´ a ındole, tales como la Ingenier´ F´ ıa, ısica, Econom´ Estad´ ıa, ıstica o Biolog´ Algunos ejemplos los encontramos ıa. en el c´lculo de los modos de vibraci´n de algunas estructuras, el estudio de la evoluci´n a o o de sistemas din´micos, compresi´n de datos, el an´lisis de redes (grafos),... a o a El problema que abordamos es el siguiente: dada una matriz A de tama˜o n × n n queremos encontrar los escalares λ y vectores v = 0 que cumplan Av = λv. Se dice entonces que λ es un valor propio de A y que v es un vector propio asociado a λ. Se trata por tanto de buscar las direcciones invariantes bajo los productos por la matriz. Equivalentemente, los valores propios de A son aquellos valores λ para los que el sistema lineal homog´neo e (A − λI)v = 0, tiene soluciones no nulas, y estas soluciones son los vectores propios asociados a λ. Esta expresi´n nos da una manera de calcular λ: los valores propios son los valores, reales o o complejos, 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´ del polinomio ıces p(λ) := det(A − λI) = 0. conocido como polinomio caracter´ ıstico. Dado que p(λ) tiene grado n, habr´ exactamente a n valores propios (aunque alguno de ellos puede estar repetido o ser complejo). Hist´ricamente los m´todos num´ricos comenzaron trabajando sobre el polinomio caro e e acter´ ıstico para hallar los valores propios, pero pronto se comprob´ que este camino no o era el m´s indicado. Uno de los hechos que motivaron este abandono radicaba en la ina estabilidad num´rica: e 171
  • 177. ´ LECCION IV 9.1 Introducci´n o Las ra´ de un polinomio son muy sensibles a variaciones en sus coeficientes; ıces El polinomio a su vez puede ser muy sensible a las entradas de la matriz. r do rra Bo En vista de lo anterior se plante´ el problema original: ¿son los valores y vectores propios o sensibles a peque˜as modificaciones de las entradas de la matriz?. Afortunadamente para n matrices sim´tricas se tiene la ansiada estabilidad: peque˜as variaciones en A, producto e n por ejemplo de errores de medida o errores de redondeo, dan lugar a peque˜as modifican 1 ciones en los valores propios . Para matrices arbitrarias este resultado dista mucho de ser cierto, las condiciones para asegurar la estabilidad son m´s complicadas, y podemos ena contrarnos con lo que en la terminolog´ habitual se denomina, matrices mal condicionadas ıa para el c´lculo de valores propios. a Ejemplo Estas l´ ıneas muestran la sensibilidad de una matriz muy simple ante una peque˜a variaci´n en una entrada. n o >> 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 sim´tricas y observa como e el resultado es m´s estable. a 1 Probado por primera vez por Hermann Weyl en 1911 en un ´rea totalmente distinta. a 172
  • 178. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e ´ Nota. Este y otros detalles no eran conocidos en los inicios del c´lculo cient´ a ıfico. James 2 Hardy Wilkinson relata la siguiente an´cdota . Cuando estaba programando en uno de los e primeros ordenadores electr´nicos el m´todo de Newton para la resoluci´n de ecuaciones o e o no lineales, decidi´ testarlo con el siguiente polinomio o (x − 20)(x − 19) · · · (x − 1). r do rra Bo El m´todo fallaba de forma reiterada, a pesar de las sucesivas revisiones del c´digo, hasta e o que Wilkinson cay´ en la cuenta de que el error no radicaba en su programa sino que o las ra´ ıces eran tan sensibles num´ricamente que se ve´ afectadas por los errores de e ıan redondeo. Wilkinson demostr´ que al cambiar el coeficiente de x19 en p, que es −210, o por −210 − 2−23 , las ra´ ıces 16 y 17 se transforman3 en el par complejo 16.73 ±2.81i. El polinomio en cuesti´n pas´ a la historia del Num´rico con el nombre de “el p´rfido o o e e polinomio de Wilkinson”. 9.2. Matrices semejantes Dos matrices A y B son semejantes si existe una matriz P invertible tal que B = P AP −1 . En este caso, det(B − λI) = det(P AP −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 valores propios. Este resultado sugiere una estrategia para encontrar los valores propios de A: buscar matrices semejantes para las que el c´lculo de los valores propios sea sencillo. En particular, a 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–´sima columna es el vector vi ) es invertible. Entonces e AP = P D ⇐⇒ P −1 AP = D, donde D es una matriz diagonal con los valores propios sobre la diagonal. Si una matriz es semejante a una matriz diagonal se dice que es diagonalizable. Particularmente interesante es el caso en que P se puede tomar adem´s ortogonal. a −1 Esto es, P = P , y por tanto P AP = D. Las matrices ortogonales son muy estables num´ricamente y posibilitan el dise˜o de m´toe n e dos m´s robustos frente a errores de redondeo. a 2 Recogida por D. Kincaid y W. Cheney en su excelente libro “An´lisis Num´rico: Las Matem´ticas a e a del C´lculo Cient´ a ıfico.” Addison-Wesley, 1994. 3 ¿C´mo asumir que las ra´ o ıces de un polinomio tan sencillo fueran imposibles de aproximar por un ordenador? Wilkinson dir´ despu´s “Speaking for myself I regard it as the most traumatic experience in ıa e my career as a numerical analyst” 173
  • 179. ´ LECCION IV 9.3 M´todo de potencias e Teorema 9.1 Si A es sim´trica, existe Q ortogonal tal que Q AQ = D con D diagonal con e los valores propios de A. En particular, los valores propios de una matriz sim´trica son todos e reales. r do rra Bo o a e En las Secciones 9.4 y 9.5 de esta lecci´n se estudiar´n dos m´todos basados en transformaciones de semejanza (producto por matrices ortogonales) que tratan de llevar una matriz sim´trica a una forma diagonal como forma de calcular los valores propios. Estos e m´todos se pueden adaptar, con m´s o menos ´xito, a matrices arbitrarias llevando en e a e este caso la matriz a una forma triangular o cuasitriangular. 9.3. M´todo de potencias e En esta secci´n presentaremos el m´todo de potencias y algunas variantes del mismo o e que proporcionan un valor propio de la matriz. Estos m´todos combinados con t´cnicas e e de deflaci´n, que consisten en construir una nueva matriz con los mismos valores propios o que la original salvo el ya el calculado, permiten calcular unos pocos valores propios. 9.3.1. Descripci´n del m´todo o e 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 adem´s que tenemos una base formada por vectores propios, esto es podea mos tomar {vi }n vectores propios linealmente independientes (la matriz A es por tanto i=1 diagonalizable). Entonces, cualquier vector x0 puede escribirse en la forma n x0 = αi vi i=1 con αi adecuados. Multiplicando reiteradamente por A obtenemos n m αi λm vi i A x0 = = λm 1 α1 v1 + α2 i=1 λ2 λ1 m v2 + . . . + αn λn λ1 m vn . (9.1) Entonces, si α1 = 0 y m es grande xm := Am x0 ≈ λm α1 v1 , 1 es decir, xm tiende a apuntar en la direcci´n del vector propio asociado al valor propio o de mayor m´dulo (en el lenguaje habitual se habla del valor propio dominante). El valor o propio λ1 se puede calcular, entre otras posibilidades, mediante el conocido cociente de Rayleigh: x Axm x xm+1 (m) λ1 := m 2 = m 2 ≈ λ1 . xm xm 174
  • 180. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e Proposici´n 9.2 Bajo las hip´tesis anteriores o o (m) = λ1 + O λ1 λ2 (m) = λ1 + O λ1 λ2 λ1 Si adem´s A es sim´trica a e . 2m . r do rra Bo λ1 m Basado en estas ideas surge el m´todo de potencias, que simplemente consiste en e multiplicar un vector inicial por las potencias sucesivas de la matriz A. Para evitar que los vectores xm tengan componentes muy grandes o muy peque˜as se genera una sucesi´n n o de vectores normalizados, es decir, una vez multiplicado por A se procede a dividir por su norma. El algoritmo es el siguiente: M´todo de potencias e 01 x0 = 0 02 y0 = 03 vector inicial x0 x0 2 for m=1:mmax 04 xm = Aym−1 05 λ(m) = ym−1 xm xm ym = xm 2 06 07 if 08 09 10 ym − ym−1 end 2 < eps return end La l´ ınea 06 es simplemente el cociente de Rayleigh que, como la norma escogida para normalizar es la eucl´ ıdea, adopta esta expresi´n m´s sencilla. o a Hemos elegido como criterio de parada la diferencia entre dos vectores consecutivos. Otra posible elecci´n es o |λ(m) − λ(m−1) | < eps |λ(m) |. Ejercicio 9.2 Programa el m´todo de potencias e Soluci´n. He aqu´ una implementaci´n del m´todo. o ı o e 01 02 03 %POTENCIAS % %LB=POTENCIAS(A) Devuelve en LB una aproximacion del 175
  • 181. ´ LECCION IV 9.3 M´todo de potencias e % % % %[LB,V]=POTENCIAS(A) % %[LB,V,NITER]=POTENCIAS(A) % % LB=POTENCIAS(A,MMAX) % % LB=POTENCIAS(A,MMAX,EPS) % % LB=POTENCIAS(A,MMAX,EPS,V0) mayor valor propio de A calculado por el metodo de potencias V es el vector propio NITER son las iteraciones calculadas r do rra Bo 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 MMAX No. maximo de iteraciones n EPS es el criterio de parada V0 vector inicial para la iteracion function [lb,x,m]=potencias(a,varargin); n=length(a); if nargin>1 & ~isempty(varargin{1}) mmax=varargin{1}; else mmax=n*2; end if nargin>2 & ~isempty(varargin{2}) eps=varargin{2}; else eps=1e-6; end if nargin>3 & ~isempty(varargin{3}) y=varargin{3}; else y=rand(n,1); end y=y/norm(y); for m=1:mmax x=a*y; lb=y’*x; x=x/norm(x); if norm(x-y)<eps return end y=x; end disp(’numero maximo de iteraciones superado’) Observa la utilizaci´n de isempty que permite que el usuario especifique alguno de o los par´metros, ignorando los anteriores sin m´s que utilizar el vac´ []. Por ejemplo, la a a ıo siguiente llamada es v´lida: a 176
  • 182. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e >> [lb,v]=potencias(a,[],[],v0); % especifico el vector inicial r do rra Bo Ejercicio 9.3 Compara la velocidad de convergencia y el n´mero de iteraciones requerido u para distintas tolerancias y vectores iniciales al tomar las matrices       −1 −3 0 −1 −3 0 −1 4 −2 9 4 , 9 4 , 9 −1  . A= 4 B =  −3 C= 4 −2 −1 5 0 4 5 −2 −1 5 Nota. Cuando no se conoce una aproximaci´n del vector propio asociado al valor propio o dominante, se suele iniciar el algoritmo partiendo de un vector generado aleatoriamente. Podr´ ocurrir que para el vector inicial α1 = 0, pero la probabilidad de que se d´ este ıa e problema es (pr´cticamente) nula. En este caso, si |λ2 | > |λ3 |, salvo por errores de rea e a dondeo4 , el m´todo proporcionar´ el valor propio subdominante λ2 y su vector propio asociado normalizado. No es necesario que la matriz sea diagonalizable para que el m´todo de potencias e converja. Tampoco que el subespacio asociado al valor propio dominante est´ generado e por un unico vector. En este caso, que s´lo puede darse si λ1 es un valor propio repetido, el ´ o m´todo puede converger a distintos vectores propios normalizados dependiendo del vector e inicial considerado. Si |λ1 | = |λ2 |, es decir, λ1 = ±λ2 ´ λ1 y λ2 son n´meros complejos conjugados, entonces o u el m´todo de potencias falla. e Ejercicio 9.4 Consideremos la matriz  0  1 A=  0 0 0 0 1 0  0 −24 0 50   0 −35  1 10 cuyos valores propios son 1, 2, 3 y 4. 1. Aplicar el m´todo de potencias a la matriz A partiendo de un vector aleatorio y del e vector (−20, 33, −15, 2) . 2. Sabiendo que v1 = (−24, 26, −9, 1) y v2 = (−12, 19, −8, 1) son vectores propios asociados a los valores propios 1 y 2 respectivamente, ¿qu´ crees que ocurrir´ si se toma e a como vector inicial v1 − 3v2 = (12, −31, 15, −2) ? 3. Observa para distintas tolerancias la diferencia entre partir del vector del apartado anterior y de (12, −31, 15, −2.0001) . 4 El efecto de los errores de redondeo se traduce en una componente no nula en la direcci´n de v1 , o incluso aunque el vector inicial no la tuviese. Se podr´ decir que ´ste es uno de los pocos casos en los ıa e que los errores de redondeo nos pueden ayudar. 177
  • 183. ´ LECCION IV 9.3 M´todo de potencias e Ejercicio 9.5 En este ejercicio vamos a comprobar que el c´lculo de los valores propios a utilizando el polinomio caracter´ ıstico no es el camino correcto. Teclea las instrucciones en un fichero script r do rra Bo n=50; d=1/n:1/n:1; [q,r]=qr(rand(n)); a=q’*d*q; En a tenemos una matriz sim´trica con valores propios5 {0.02, 0.04, 006, . . . , 1}. Se trata de e que apliques potencias para calcular el valor propio dominante y compares el resultado con el que obtienes al calcular las ra´ del polinomio caracter´ ıces ıstico. Compara los resultados. Cambia el valor de n y observa el efecto que tiene en matrices cada vez m´s grandes. a 9.3.2. Variantes del m´todo de potencias e M´todo de la potencia inversa e Si A es invertible y v es un vector propio asociado a un valor propio λ (que ser´ distinto a de cero), entonces, Av = λv ⇐⇒ A−1 v = λ−1 v. Es decir, λ−1 es un valor propio de la matriz inversa y v es un vector propio asociado. Por tanto podemos aplicar el m´todo de potencias a la matriz A−1 para calcular el menor e valor propio en valor absoluto de A. En lugar de calcular el producto xm = A−1 ym−1 (l´ ınea 04 en el m´todo de potencias) e 6 resolveremos en cada iteraci´n el sistema o Axm = ym−1 . Disponemos para ello de una galer´ amplia de m´todos vistos en las Lecciones I y II. ıa e Notemos adem´s que en cada iteraci´n se tiene que resolver un sistema cuya matriz a o es siempre la misma, as´ que si optamos por un m´todo directo podemos calcular la ı e factorizaci´n LU una unica vez, fuera del bucle for (l´ o ´ ıneas 03--10), y resolver de forma reiterada los dos sistemas triangulares. Si por contra se opta por un m´todo iterativo, e podemos arrancar el esquema utilizando xm−1 , la aproximaci´n del vector propio calculada o en la iteraci´n anterior. o Ejercicio 9.6 Programa a partir del Ejercicio 9.2 el algoritmo de la potencia inversa. M´todo de potencias desplazado e 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 m´todo de potencias a la matriz e A − αI 5 El comando qr descompone A = QR con Q ortogonal y R triangular. Por tanto los valores propios de Q AQ coinciden con los de A. La Secci´n 9.5.1 est´ dedicada al c´lculo de esta descomposici´n. o a a o 6 Recuerda que invertir una matriz para multiplicarla posteriormente por un vector es mucho m´s a costoso que resolver el sistema correspondiente. 178
  • 184. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e donde α es una constante conocida, podemos obtener el valor propio de A m´s alejado a de α. M´s interesante desde el punto de vista pr´ctico es aplicar el m´todo de potencias a a e a (A − αI)−1 , que nos proporcionar´ el valor propio de A m´s pr´ximo a α. a a o r do rra Bo Ejercicio 9.7 Modifica el programa del Ejercicio 9.6 para implementar el m´todo de potene cias desplazado. Los argumentos obligatorios de entrada ser´n ahora A y alpha. a Comentarios finales El m´todo de potencias tiene una ventaja evidente: su simplicidad. Ni siquiera necee sitamos la matriz en s´ s´lo saber multiplicar por ella. ı, o El algoritmo de la potencia desplazada se puede utilizar para el c´lculo de un vector a propio si se conoce λ, el valor propio asociado. Basta para ello aplicar el m´todo con e α = λ + con << 1. Puede plantearse si esto tiene efectos perniciosos habida cuenta de que A − αI est´ muy cerca de ser singular. Wilkinson prob´ sin embargo que el efecto a o de esta inestabilidad se da precisamente en la direcci´n del vector propio, que a fin de o cuentas es lo que nos interesa. Se puede sugerir una versi´n alternativa del m´todo de potencias desplazada consiso e tente en tomar un α nuevo en cada iteraci´n, por ejemplo el ultimo valor calculado λ(m) . o ´ Aunque esto acelera enormemente la convergencia del m´todo, dispara el costo por ite eraci´n, ya que en cada paso hay que resolver un sistema lineal nuevo, por lo que salvo o en contados casos no es recomendable. Si se conoce un valor propio λ de una matriz A de tama˜o n, puede construirse una n nueva matriz de tama˜o n − 1 que tiene exactamente los mismos valores propios que A n salvo λ. Podr´ aplicarse ahora el m´todo de potencias (o cualquiera de sus variantes) a la ıa e nueva matriz para determinar un nuevo valor propio de A. Este tipo de t´cnica, en la que e no entraremos en estos apuntes, se conoce como deflaci´n. Debemos se˜alar que mediante o n esta t´cnica los errores de redondeo se van acumulando, de modo que s´lo es factible para e o calcular unos cuantos valores propios. El n´mero final depende obviamente de la propia u matriz y de la precisi´n con que se van calculando los valores propios. o 9.4. M´todo de Jacobi e En esta secci´n estudiaremos un m´todo que nos proporcionar´ todos los valores proo e a pios de una matriz sim´trica (todos son reales) mediante un esquema iterativo basado e en transformaciones de semejanza. 9.4.1. Descripci´n del m´todo o e El m´todo de Jacobi transforma en cada paso una matriz sim´trica A en otra semejante e e con estructura m´s diagonal mediante el producto a izquierda y derecha por matrices a apropiadas. Una matriz de Givens, tambi´n llamada de rotaci´n, es una matriz de la e o 179
  • 185. ´ LECCION IV 9.4 M´todo de Jacobi e forma   1 ..        Rpq (α) =         . cos α     ← fila p         ← fila q    sin α 1 . r do rra Bo .. 1 − sin α cos α ... 1 ↑ col. p ↑ col. q (9.2) Es f´cil ver que son ortogonales, es decir, Rpq (α)−1 = Rpq (α) . a Mediante A1 := Rpq ARpq (p, q y α adecuados) vamos a anular el mayor elemento extradiagonal de A. Esta operaci´n o (1) s´lo afecta a las filas y columnas p, q de A. Concretamente, si denotamos por aij las o entradas de A1 , a(1) = (aqq − app ) cos α sen α + apq (cos2 α − sen2 α) = pq = 1 (aqq − app ) sen(2α) + apq cos(2α). 2 Por tanto, el ´ngulo α debe tomarse de modo que a  si aqq = app ,  cos(2α) = 0,  2apq  , en caso contrario.  tan(2α) = aqq − app Para calcular cos α y sen α evitando el uso de un arcotangente se recurre a algunas manipulaciones trigonom´tricas que prueban que si7 e θ := aqq − app , 2apq entonces cos α = √ t := 1 , t2 + 1 sign(θ) √ , |θ| + θ2 + 1 sen α = √ t . t2 + 1 Cuando aqq = app tomamos 1 cos α = √ , 2 7 sen αm = −sign(aqq ) √ . 2 sign (z) es el signo de z, −1 si z es negativo, 1 en caso contrario. 180
  • 186. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e r do rra Bo El m´todo ya se vislumbra en este estado: se trata de repetir el mismo argumento e con A1 para obtener una segunda matriz A2 resultado de cancelar el mayor elemento extradiagonal de A1 . De esta forma, reiterando este proceso llegamos a una sucesi´n de o matrices Am que cumplen   λ1   λ2   Am −→ D :=  cuando m → ∞. , ...   λn Adem´s, definiendo Qm := Rp1 q1 (α1 )Rp2 q2 (α2 ) . . . Rpm qm (αm ), donde Rpk ,qk es la matriz a utilizada en el paso k−´simo e Q−1 AQm = Am −→ D. m Por tanto, las columnas de Qm son las aproximaciones (ortonormales) de los vectores propios correspondientes. El siguiente teorema prueba la convergencia de este m´todo. Para ello necesitamos la e 8 llamada norma de Frobenius n A F |ai,j |2 := 1/2 i,j=1 Teorema 9.3 Sea Am la matriz en la iteraci´n m, Dm su diagonal y Bm := Am − Dm . o Entonces Am F = Am+1 F , Bm+1 2 = Bm 2 − 2|a(m) m |2 F pm q El resultado dice en primer lugar que la norma de Frobenius de una matriz no cambia cuando se multiplica a izquierda y derecha por las matrices Rpq (α), una de ellas traspuesta. De hecho se preserva cuando se multiplica, a izquierda y derecha, por matrices ortogonales arbitrarias. El segundo resultado dice algo m´s: el peso de los elementos extradiagonales a disminuye en cada paso seg´n el elemento cancelado. Esto asegura la convergencia del u proceso hasta obtener una matriz diagonal. En la pr´ctica, el proceso se interrumpe cuando los elementos que est´n fuera de la a a diagonal son suficientemente peque˜os. En concreto, se suele tomar el siguiente criterio n de parada 1/2 n (m) |aii |2 |a(m) m | < eps pm q . i=1 F´ ıjate que las matrices Am y Am+1 s´lo difieren en las filas y columnas pm y qm . A o efectos pr´cticos no ser´ necesario formar las matrices de rotaci´n ya que basta conocer a a o los valores de cos αm y de sen αm para construir Am+1 a partir de Am . Ejercicio 9.8 Implementa el m´todo de Jacobi. e 8 En Matlab ser´ norm(a(:)) o norm(a,’fro’). ıa 181
  • 187. ´ LECCION IV 9.4 M´todo de Jacobi e Soluci´n. La parte central del programa se puede implementar con las siguientes l´ o ıneas % % % % % % % % % % % % % % % JACOBI D=JACOBI(A) Aplica el metodo de Jacobi a A y devuelve en D los valores propios; A debe ser simetrica r do rra Bo 01 02 03 04 05 06 07 08 09 10 11 12 13 14 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [D,Q]= JACOBI(A) Q es ortogonal con Q’A Q=D [D,Q,NITER]= JACOBI(A) NITER Numero de iteraciones calculadas D=JACOBI(A,NMAX) NMAX numero maximo de iteraciones D=JACOBI(A,NMAX) NMAX numero maximo de iteraciones D=JACOBI(A,NMAX,EPS) EPS es el criterio de parada function [d,Q,m]= jacobi(a,varargin) n=length(a); if nargin>1 & ~isempty(varargin{1}) mmax=varargin{1}; else mmax=n^2; end if nargin>2 & ~isempty(varargin{2}) eps=varargin{2}; else eps=1e-5; end Q=eye(n); for m=1:mmax d=diag(a); %Calculo del mayor elemento extradiagonal [max1,p]=max(abs(a-diag(d))); [max2,q]=max(max1); p=p(q); if max2<eps*norm(d) return % convergencia end %calculo sen y cos if abs(a(q,q)-a(p,p))<eps c=1/sqrt(2); s=-c*sign(a(p,q)); 182
  • 188. ´ LECCION IV else theta=(a(q,q)-a(p,p))/(2*a(p,q)); t=sign(theta)/(abs(theta)+sqrt(theta^2+1)); c=1/sqrt(t^2+1); s=c*t; end r=[c s ;-s c]; %La rotacion solo afecta a las filas y col. p y q a([p q],:)=r’*a([p q],:); a(:,[p q])=a(:,[p q])*r; Q(:,[p q])=Q(:,[p q])*r; % guardamos Q r do rra Bo 42 43 44 45 46 47 48 49 50 51 52 53 54 55 Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e end disp(’numero maximo de iteraciones sobrepasado’); return Observa bien las l´ ıneas 32-33 que sirven para encontrar la posici´n del m´ximo elemento o a extradiagonal. 9.4.2. Variantes del m´todo de Jacobi e Aunque el m´todo de Jacobi ofrece la posibilidad de calcular de forma r´pida todos e a los valores propios, tiene una convergencia lenta incluso para matrices de tama˜o modn erado. Vamos a introducir algunas mejoras desde el punto de vista computacional, que no matem´tico. Concretamente vamos a realizar una peque˜a modificaci´n que aunque a n o eleva el n´mero de iteraciones necesarias para converger (peor desde el punto de vista u matem´tico) cada iteraci´n se ejecuta en menos tiempo, de forma que al final se consigue a o reducir el tiempo de c´lculo (mejora computacional). a Para ello vamos a identificar primero d´nde se nos va el tiempo de c´lculo. Con este o a fin utilizaremos una de las herramientas m´s utiles en Matlab: profile. a ´ Comenzamos creando una matriz sim´trica de tama˜o moderado: e n >> 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 c´digo9 . o A continuaci´n ejecuta el programa jacobi para a con un n´mero m´ximo de iteraciones o u a suficientemente alto de forma que asegures convergencia. La instrucci´n o >> profile report despliega un informe donde puedes ver el tiempo que ha consumido cada parte del programa. Se observa claramente que las l´ ıneas m´s costosas son aqu´llas empleadas en la a e b´squeda del m´ximo elemento extradiagonal (observa la Figura 9.1). Es precisamente u a 183
  • 189. ´ LECCION IV 9.4 M´todo de Jacobi e r do rra Bo MATLAB Profile Report: Function Details jacobi C:/Documents and Settings/Víctor/Escritorio/LibroMatlab/jacobi.m Time: 14.75100000 s (100.0%) Calls: 1 Self time: 14.75100000 s (100.0%) Function: Time jacobi Calls Time/call 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:mmax 0.07643962 1% 34: 35: 13.37100000 91% 36: 0.26000000 2% 37: 38: 0.07000000 0% 39: d=diag(a); %Calculo del mayor elemento extradiagonal [max1,p]=max(abs(a-diag(d))); [max2,q]=max(max1); p=p(q); if max2<eps*norm(d) 40: 42: 0.09000000 1% 43: return % convergencia %calculo sen y cos if abs(a(q,q)-a(p,p))<eps 44: 51: 0.10819591 1% 52: 53: 0.31000000 0.12000000 0.17000000 0.05000000 2% 1% 1% 0% c=1/sqrt(2); end r0=[c s ;-s c]; %La rotacion solo afecta a las filas y col. p y q 54: a([p q],:)=r0'*a([p q],:); 55: a(:,[p q])=a(:,[p q])*r0; 56: r(:,[p q])=r(:,[p q])*r0; % guardamos r 57: end Figura 9.1: Profile aplicado al m´todo de Jacobi. e 184
  • 190. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e r do rra Bo en estas l´ ıneas donde debemos proponer nuestra mejora, reemplazando la b´squeda por u alg´n proceso m´s econ´mico. u a o La variante que proponemos es la siguiente: recorreremos uno por uno todos los elementos situados debajo de la diagonal (como la matriz es sim´trica esto es suficiente). e Si el tama˜o de un elemento es peque˜o, no hacemos nada y pasamos al siguiente. Si es n n grande, se procede anularlo. Para dilucidar si es grande o peque˜o comparar´ n ıamos con el tama˜o de la diagonal de forma semejante a como se hace en el programa original n (l´ ınea 09). Una vez recorridos todos los elementos, esto es, una vez realizado un barrido en la terminolog´ habitual, volvemos a empezar. Cada cierto n´mero de iteraciones, por ıa u ejemplo tras cada barrido, podemos medir el tama˜o de los elementos extradiagonales que n quedan para ver si se da por finalizada la ejecuci´n del programa. Si comprobamos que o hay todav´ elementos diagonales muy grandes, empezamos de nuevo. ıa Ejercicio 9.9 Implementa la modificaci´n sugerida en el p´rrafo de arriba. Ejecuta el profile o a de Matlab y compara tiempos de ejecuci´n con el programa original. ¿Qu´ observas?. F´ o e ıjate tambi´n en el n´mero de iteraciones que necesita para converger. ¿Qu´ te parece?. e u e Nota. La instrucci´n profile es muy util a la hora de depurar c´digo dado que permite o ´ o controlar qu´ partes del programa vale la pena optimizar y cu´les no. La instrucci´n tiene e a o varios argumentos opcionales y comandos relacionados que puedes consultar en la ayuda. Los comandos tic y toc son m´s simples pero proporcionan menos informaci´n. El a o primero activa el reloj y el segundo nos informa sobre el tiempo trascurrido desde que se ejecut´ tic. o 9.5. M´todo QR de Francis e El m´todo QR y sus variantes son sin lugar a dudas la elecci´n m´s apropiada para el e o a c´lculo de todos los valores propios de una matriz llena. a El m´todo es muy f´cil de entender y sencillo de implementar. Sin embargo, es dif´ e a ıcil de comprender por qu´ funciona (el an´lisis no es nada trivial). e a Ya hemos visto descomposiciones matriciales del tipo A = LU con L (permutaci´n o de) triangular inferior con 1s en la diagonal y U triangular superior. Una descomposici´n o alternativa es A = QR con Q ortogonal (Q = Q−1 ) y R triangular superior. Esta descomposici´n siempre existe o y puede ser calculada de varias formas distintas. El m´todo QR de Francis consiste en grosso modo construir una sucesi´n de matrices e o Am (A0 = A) procediendo como sigue Am = Qm Rm (factorizar) Am+1 := Rm+1 Qm+1 (construir) Para una matriz sim´trica el algoritmo converge pr´cticamente en todos los casos a una e a matriz diagonal con los valores propios. M´s adelante detallaremos el algoritmo y c´mo se a o 9 Tener activada esta opci´n resta algo de velocidad a los programas puesto que parte de Matlab o est´ ocupada en autorevisarse. Con profile off desconectas este control. a 185
  • 191. ´ LECCION IV 9.5 M´todo QR de Francis e puede mejorar su implementaci´n. En cualquier caso queda claro que antes de entrar en o materia debemos hablar con algo de profundidad de la descomposici´n QR de una matriz. o Ejercicio 9.10 Probar que todas las matrices Am son semejantes y por tanto comparten los mismos valores propios. r do rra Bo 9.5.1. Factorizaci´n QR o Quiz´s la forma m´s sencilla de calcular la descomposici´n es aqu´lla ligada al algoa a o e ´ ritmo de Gram-Schmidt. Este algoritmo, uno de los cl´sicos en Algebra Lineal, se utiliza a para hallar una base ortogonal de un subespacio partir de una base (o sistema generador) dada. Las operaciones, una vez reescritas adecuadamente se pueden expresar de la forma A = QR donde las columnas de A son los vectores originales, las colunas de Q son los vectores ortonormales que generan el mismo subespacio que los vectores columna de A y R es una matriz triangular superior que indica c´mo se transforma la base original en la nueva base o ortonormal. La descomposici´n tiene sentido para matrices rectangulares y en este caso o las dimensiones de A y Q coinciden (si A, es m × n, tambi´n lo es Q y R es n × n). e Este algoritmo es, sin embargo, muy inestable num´ricamente y rara vez se utiliza en e la pr´ctica10 . a Existen caminos distintos que nos conducen a la descomposici´n QR. Los dos m´todos o e m´s utilizados se basan en transformar la matriz original en una triangular superior mula tiplicando a izquierda por matrices ortogonales, ya sean rotaciones como las que aparecen en el algoritmo de Jacobi (matrices de Givens), o matrices (reflexiones) de Householder. Factorizaci´n QR con Matrices de Householder o 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 tama˜o n. Observa que n efectivamente es una matriz, ya que u u es n × n. Es muy sencillo comprobar que es sim´trica (Q = Q) y que Q Q = I, y por tanto e −1 Q = Q. La factorizaci´n QR mediante transformaciones de Householder se basa en la siguiente o propiedad Proposici´n 9.4 Dado un vector columna x, si tomamos α = ± x 2 y definimos o x − α e1 u := , donde e1 = (1, 0, . . . , 0) , x − α e1 2 Q := I − 2 u u , entonces Qx = (α, 0, . . . , 0) . 10 Existe el algoritmo de Gram-Schmit modificado que dota de algo m´s de estabilidad al m´todo a e original. 186
  • 192. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e Generalmente se suele escoger α con el signo opuesto al de la primera componente de x para que u 2 no sea demasiado peque˜a. n Para obtener una descomposici´n A = QR podemos proceder del siguiente modo: o r do rra Bo 1. Construimos la matriz de Householder Q1 como en la proposici´n anterior tomando o como vector x la primera columna de A. Entonces   α1 ∗ . . . ∗     (9.3) Q1 A =  0   .  . . A2 0 2. Repetimos el proceso con la matriz A2 que es (n − 1) × (n − 1) para construir la matriz de Householder Q∗ tal que 2   α2 ∗ . . . ∗    0  ∗ Q2 A2 =  . (9.4) .  .  . A3 0 Ahora basta considerar    Q2 =   1 0 ... 0  0 . . . 0     Q∗ 2 (9.5) que cumple   α1 ∗ ∗ . . . ∗  0 α ∗ ... ∗    2    Q2 Q1 A =  0 0    .  . .  .  A3 . . 0 0 3. En el k–´simo paso se construyen las matrices Q∗ y Qk : e k   αk ∗ . . . ∗   Ik−1  0  ∗ Qk := Qk Ak =  . ,  .  Q∗ . Ak+1 k 0 , donde Ik−1 es la matriz identidad de tama˜o k − 1. n Despu´s de n − 1 pasos obtenemos la descomposici´n e o Qn−1 · · · Q1 A = R, con R triangular superior. Definiendo Q := Q1 · · · Qn−1 , tenemos que Q−1 = Q−1 · · · Q−1 = Qn−1 · · · Q1 . Por tanto, n−1 1 A = QR con Q ortogonal y R triangular superior. Ejercicio 9.11 Implementa la descomposici´n QR con matrices de Householder o 187
  • 193. ´ LECCION IV 9.5 M´todo QR de Francis e Soluci´n. He aqu´ una implementaci´n del m´todo o ı o e % [Q,R]=QRHOUSEHOLDER(A) Calcula Q ortogonal y R triangular % superior tales que A=QR. % % El algoritmo esta basado en las matrices de Householder % function [q,r]=QRhouseholder(a) r do rra Bo 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 n=length(a) q=eye(n); r=a; for k=1:n u=r(k:n,k); %primera columna alpha=-sign(u(1))*norm(u); u=u-alpha*[1;zeros(length(u)-1,1)]; u=u/norm(u); qhouse=eye(length(u))-2*u*u’; r(k:n,k:n)=qhouse*r(k:n,k:n); q(:,k:n)=r(:,k:n)*qhouse; end return Observa la manipulaci´n simple de los bloques de a, q y r. o Ejercicio 9.12 Adapta el programa para calcular la factorizaci´n QR de matrices rectanguo 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 inmediatos sin m´s que tener en cuenta los tama˜os de las matrices implicadas.) a n Si Q = I − 2 u u es n × n y B n × m, entonces el producto QB puede calcularse como QB = (I − 2 u u )B = B − 2u(u B). (9.6) Es decir, en ning´n momento se requiere construir la matriz Q y unicamente necesitamos u ´ realizar dos productos matriz-vector. El n´mero de operaciones del producto QB es ahora u nm mientras que en la implementaci´n inicial el costo era n2 m. De forma an´loga se puede o a calcular el producto BQ con B m × n tambi´n en mn operaciones. e Ejercicio 9.13 Implementa la factorizaci´n QR utilizando las indicaciones previas. Compara o con alg´n ejemplo la reducci´n del tiempo de c´lculo. u o a Factorizaci´n QR con matrices de Givens o La factorizaci´n QR de una matriz se puede obtener tambi´n utilizando matrices de o e rotaci´n, es decir, matrices de la forma (9.2). Esta alternativa es especialmente interesante o si la matriz tiene sus elementos no nulos concentrados entorno a la diagonal. Para matrices 188
  • 194. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e llenas el tiempo de c´lculo es pr´cticamente el doble comparado con el requerido al utilizar a a matrices de Householder. Es muy f´cil comprobar que para crear un cero en la posici´n (p, q) al multiplicarla a a o izquierda por una matriz de Givens Rp,q (α) basta elegir α de modo que aqq , + a2 pq sin α = −apq . a2 + a2 qq pq r do rra Bo cos α = a2 qq Notemos que las matrices Rpq (α)A y A s´lo difieren en las filas p y q. o El m´todo consistir´ entonces en ir transformado la matriz original (de tama˜o n) en e a n una matriz triangular superior del siguiente modo: en primer lugar se hacen ceros en las posiciones de la primera columna por debajo del elemento de la diagonal multiplicando por n − 1 matrices como (9.2), de modo que   ∗ ∗ ... ∗  0 ∗ ... ∗    A1 := R1n (α1n ) . . . R13 (α13 )R12 (α12 ) A =  . . . . . . .   . . . Q1 0 ∗ ... ∗ Obviamente Q1 es una matriz ortogonal por ser producto de matrices ortogonales. En el siguiente paso haremos ceros en la segunda columna por debajo de la diagonal y as´ suceı sivamente. F´ ıjate que los elementos nulos de las columnas anteriores se preservan en los sucesivos pasos. Ejercicio 9.14 Implementa la factorizaci´n QR utilizando matrices de Givens. o Soluci´n. Podemos definir la siguiente funci´n: o o 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 % QRGIVENS % % [Q,R]=QRGIVENS(A) Calcula Q ortogonal y R triangular % superior cumpliendo A=QR % % Utiliza el algoritmo basado en matrices de Givens % function [q,r]=QRGivens(a) n=length(a); q=eye(n); for j=1:n-1 for i=j+1:n if a(i,j)~=0 aux=sqrt(a(j,j)^2+a(i,j)^2); c=a(j,j)/aux; 189
  • 195. ´ LECCION IV 9.5 M´todo QR de Francis e s=-a(i,j)/aux; Rot=[c s; -s c]; %solo cambian las filas i y j a([i j],:)=Rot*a([i j],:); q([i j],:)=Rot*q([i j],:); end r do rra Bo 20 21 22 23 24 25 26 27 28 29 30 end end q=q’; r=a; return Ejercicio 9.15 Adapta el m´todo para trabajar con matrices rectangulares. e Ejercicio 9.16 Compara el tiempo de c´lculo requerido al utilizar matrices de Householder a y de Givens, con matrices llenas y matrices tridiagonales. (Ayuda: Recuerda los comandos tic y toc.) Factorizaci´n QR con Matlab o En Matlab podemos obtener una factorizaci´n QR mediante el comando qr. Por ejemo plo, >> a=rand(4); >> [q,r]=qr(a) q = -0.3685 -0.7715 -0.3858 -0.3466 0.7147 -0.4099 -0.2967 0.4829 -0.2407 0.4388 -0.8391 0.2131 -0.5436 -0.2102 0.2429 0.7754 -1.0282 0.6539 0 0 -0.7184 0.5720 -0.6839 0 -1.1168 0.3849 -0.4834 -0.0530 r = -1.2078 0 0 0 La matriz a no tiene por qu´ ser cuadrada: e >> a=rand(3,2); >> [q2,r2]=qr(a) 190
  • 196. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e q2 = -0.6815 -0.6680 -0.2989 0.6346 -0.7428 0.2132 -0.3644 -0.0444 0.9302 r do rra Bo r2 = -1.3726 0 0 -0.7532 0.5993 0 Comentarios sobre la descomposici´n QR o Si A es m × n, y Q, R es la descomposici´n dada por Householder o Givens11 , tomando o (con notaci´n de Matlab) o Q1 = Q(:, 1 : m), R1 = R(1 : m, :), entonces R1 es cuadrada, Q1 tiene las columnas ortonormales y A = Q1 R1 . La factorizaci´n QR se puede utilizar para resolver sistemas lineales compatibles indeo terminados mediante la aproximaci´n por m´ o ınimos cuadrados. Espec´ ıficamente, se trata de asignar como soluci´n de Ax = b la dada por o A Ax = A b. Este sistema de ecuaciones recibe el nombre de ecuaciones normales. Se prueba entonces que, bajo la hip´tesis de que las columnas de A sean linealmente independientes, o la soluci´n anterior cumple o b − Ax 2 < b − Az 2 , ∀z ∈ Rn . Esto es, minimiza el residuo. En la pr´ctica no se construyen las ecuaciones normales, a sino que utilizando la descomposici´n QR, el problema se reduce a o R1 Q1 Q1 R1 x = R1 Q1 b, ⇔ R1 R1 x = R1 Q1 b, ⇔ R1 x = Q1 b. I Recuerda que R1 es triangular y que por tanto, la resoluci´n del ultimo sistema es trivial. o ´ En particular este m´todo puede aplicarse a un sistema compatible determinado y e resolver as´ sistemas de ecuaciones lineales. El m´todo resultante es m´s caro que el ı e a m´todo de Gauss, ya que realiza el doble n´mero de operaciones, pero tiene una ventaja e u muy importante: es estable num´ricamente y no hace falta realizar ninguna estrategia de e pivotaje12 . 11 Ya hemos indicado en los Ejercicios 9.12 y 9.15 que estos m´todos pueden aplicarse a matrices e rectangulares generales. 12 La raz´n de esta estabilidad se puede vislumbrar intuitivamente: como Q es ortogonal, todas las o entradas est´n entre 0 y 1. a 191
  • 197. ´ LECCION IV 9.5 M´todo QR de Francis e r do rra Bo Otra aplicaci´n de la factorizaci´n QR es el c´lculo del rango de una matriz. Concreo o a tamente, el rango de A coincide con el n´mero de filas de R distintas de cero. Asumiendo u que estamos trabajando con un rango num´rico, examinaremos cu´ntas filas son clarae a mente distintas de cero. Esto merece un comentario: casi cualquier perturbaci´n de una o matriz que no tenga rango m´ximo da una matriz que si lo tiene. Por esto, num´ricaa e mente, las matrices tienen (casi) siempre rango m´ximo. Sin embargo, el hecho de estar a muy cerca de una matriz que no tenga rango m´ximo tiene consecuencia perniciosas en a muchas aplicaciones num´ricas. e Ejercicio 9.17 Implementa la resoluci´n de sistemas lineales por m´ o ınimos cuadrados. Ejercicio 9.18 Introduce la siguiente matriz en Matlab 11 13 22π 26π A= Calcula el determinante en Matlab y deduce cu´l es su rango. Calcula la descomposici´n QR. a o ¿Qu´ rango le asignar´ a A?. e ıas 9.5.2. M´todo QR de Francis e Retomamos el m´todo QR de Francis para matrices sim´tricas. El algoritmo es sime e plemente el siguiente: M´todo QR de Francis e A = A1 matriz inicial for k=1:mmax Descomponer Ak = Qk Rk Calcular Ak+1 := Rk Qk Dk+1 =diag(Ak+1 ) n−1 n n (k+1) |aij |2 if ( j=1 i=j+1 (k+1) 2 |aii < eps |) i=1 return end end El algoritmo finaliza cuando el tama˜o de los elementos por debajo de la diagonal n principal es peque˜o respecto de los elementos diagonales, es decir, cuando consideramos n que la matriz es pr´cticamente triangular. a Para matrices sim´tricas, que es el caso que de momento nos ocupa, el m´todo converge e e salvo en situaciones algo extra˜as a una matriz diagonal con los valores propios. Un hecho n sorprendente es que adem´s los valores propios aparecen ordenados en la diagonal de a mayor a menor m´dulo. o 192
  • 198. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e Ejercicio 9.19 ¿Qu´ modificaci´n har´ del algoritmo anterior para que tambi´n devolviera e o ıas e los vectores propios?. Ejercicio 9.20 Implementa el algoritmo QR de Francis utilizando cualquiera de las descomposiciones QR vistas. r do rra Bo Ayuda: ¿Qu´ calculamos mediante las ´rdenes tril(a,-1) y norm(a,’fro’)? e o Si A no es sim´trica pero es diagonalizable, el m´todo converge, tambi´n bajo condie e e ciones muy generales a una matriz quasitriangular, es decir, a una matriz de la forma   D1 . . . . . . . . . . . .  D2 . . . . . . . .    T = donde Dj es 1 × 1 o 2 × 2. .. ..  ,  . .  Dm 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 de orden 2. En particular, si la matriz tiene unicamente valores propios reales, la matriz T ´ es triangular. Si trabajamos con aritm´tica compleja entonces la matriz T es triangular e ´ superior. Este es el conocido Teorema de Schur. Ejercicio 9.21 Adapta el m´todo QR a matrices no sim´tricas. Observa que deber´s cambiar e e a el criterio de parada. Ejercicio 9.22 Aplica el m´todo QR a distintas matrices (sim´tricas, no sim´tricas, con e e e todos los valores propios reales o con alguno complejo) para observar c´mo es la matriz l´ o ımite resultante en cada caso. Nota. La descomposici´n de Schur, tanto real como compleja, se puede calcular en o Matlab con schur. 9.5.3. Comentarios adicionales T´cnicas de aceleraci´n e o 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 adem´s la matriz original es sim´trica, la matriz de a e Hessenberg correspondiente es de hecho tridiagonal sim´trica. e 193
  • 199. ´ LECCION IV 9.5 M´todo QR de Francis e r do rra Bo Trabajar sobre una matriz de Hessemberg tiene importantes ventajas. En primer lugar, la factorizaci´n QR es mucho m´s econ´mica: si utilizamos matrices de Givens unicamente o a o ´ debemos preocuparnos de cancelar los elementos situados en la subdiagonal inferior. Es m´s, si H es Hessemberg (respectivamente tridiagonal sim´trica), y H = QR, entonces la a e matriz RQ es de nuevo de Hessemberg (respectivamente tridiagonal sim´trica). En el caso e de matrices tridiagonales hay claramente una reducci´n en las necesidades de memoria o del m´todo pues s´lo requerimos guardar tres diagonales de la matriz durante todo el e o proceso. El m´todo QR no se programa en la pr´ctica tal como lo hemos presentado. Se recurre e a a dos tipos de estrategias que aceleran enormemente la velocidad de convergencia. La ıa primera es la traslaci´n. Utilizando la notaci´n de la Secci´n 9.5.2, se tratar´ de en o o o lugar de factorizar la matriz Am , descomponer Am − αm I = Qm Rm , para posteriormente definir Am+1 := αm I + Rm Qm . Es trivial comprobar que Am y Am+1 son semejantes, por lo que tendr´n los mismos a valores propios. Una elecci´n adecuada de αm consigue acelerar la convergencia en zonas o determinadas de la matriz. Por ejemplo, si A sim´trica se puede conseguir que en pocas e iteraciones    Bn−1 0  Am →  . 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 t´cnica se denomina deflacci´n. Existen algoritmos e o que permiten seguir la pista a los vectores propios, relacionando los vectores propios de Am con los de Bn−1 . Ap´ndice: reducci´n a la forma de Hessenberg e o Disponemos ya de las herramientas necesarias para implementar la reducci´n a forma o de Hessenberg de una matriz. Para ello, consideremos la siguiente partici´n de A o  α b A= 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 m´s adelante, a y construyamos   1 0 . H :=  0 H1 194
  • 200. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e Entonces  HAH =  β b H1 H1 c H 1 A1 H 1  . r do rra Bo Si H1 se toma ahora de forma que H1 c = αe1 , se consigue cancelar todos los elementos de la primera columna situados por debajo de la subdiagonal inferior. Es m´s, si A es a sim´trica, b = c y por tanto en la primera fila de HAH s´lo los dos primeros elementos e o son no nulos. A continuaci´n se procede a trabajar con la matriz H1 A1 H1 de forma similar a como o se hizo en la Secci´n 9.5.1. o Nota. En Matlab la funci´n hess reduce una matriz a forma de Hessenberg. Puede o utilizarse de las siguientes maneras: >>H=hess(A); %H es una matriz de Hessenberg semejante a A >>[P,H] = hess(A); %Ademas P ortogonal tal que A = P*H*P’ 9.6. Valores y vectores propios en Matlab Para determinar todos los valores y vectores propios de una matriz podemos utilizar el comando eig. Esta funci´n es de hecho una compilaci´n de funciones que se aplican o o dependiendo de la forma de la matriz. Este comando tambi´n sirve para resolver el probe lema de valores propios generalizados: dadas dos matrices cuadradas A y B encontrar escalares λ y vectores v = 0 tales que Av = λBv. En ocasiones requerimos unos pocos valores propios. El comando eigs, proporciona los valores propios m´s relevantes, siendo el propio usuario el que especifique si ´stos son a e los mayores o menores en valor absoluto, los de mayor o menor parte real,etc. La ayuda de Matlab es bastante extensa y desde aqu´ animamos a su consulta. Como detalle curioso ı este comando se puede llamar de forma que uno de los argumentos sea una funci´n que o devuelva el producto por la matriz. Es decir, s´lo necesita saber multiplicar por la matriz o y por tanto no es necesario disponer de ella13 . El uso de este comando es indispensable en matrices sparse no sim´tricas dado que, a´n reduci´ndola a forma de Hessenberg, las e u e 14 necesidades de memoria son gigantescas . Para este tipo de problemas se utilizan otros tipos de m´todos no relacionados con QR. e Asociado al c´lculo de valores propios, se encuentra el c´lculo de los valores singulares, a a esto es, buscar P y Q ortogonales de forma que P AQ = D, 13 Puede resultar extra˜o, pero en muchas aplicaciones pr´cticas es m´s f´cil hallar el producto de un n a a a vector por la matriz que construirla expl´ ıcitamente. 14 La descomposici´n QR destroza la estructura sparse de una matriz. o 195
  • 201. ´ LECCION IV 9.7 Notas hist´ricas o donde D es una matriz diagonal con elementos no negativos. Las entradas de D son los valores singulares, mientras que las columnas de P y Q contienen los vectores singulares asociados. Esta descomposici´n existe a´n cuando A es rectangular. El comando que calo u cula esta descomposici´n en Matlab es svd. El algoritmo m´s utilizado para este problema o a es una variante del m´todo QR conocido como Algoritmo de Golub-Kaham. e r do rra Bo 9.7. Notas hist´ricas15 o El problema del c´lculo num´rico de los valores propios de una matriz puede remona e tarse a los trabajos de Carl Jacobi quien utiliz´ el m´todo del mismo nombre en 1846. o e No existe un origen claro del m´todo de potencias, sino que parece haber surgido e de forma simult´nea en diversos ambientes. El m´todo de la potencia desplazada fue a e introducido por Helmut Wielandt en 1944, quien sugiri´ tambi´n algunas t´cnicas de o e e deflacci´n para, combinadas con el m´todo de potencias, obtener varios valores propios o e de la matriz. En 1958, Heinz Rutishause propuso un precursor del m´todo QR, el m´todo LU. El e e m´todo descompon´ la matriz en la forma LU , para posteriormente construir U L. Se e ıa trataba de aplicar de forma simult´nea el m´todo de potencias y para evitar que toa e das las direcciones degeneran hacia la direcci´n dominante, se hac´ una descomposici´n o ıa o LU que aseguraba la independencia de los vectores. Desgraciadamente, el m´todo era e inestable num´ricamente salvo para algunos casos particulares. J. G. F. Francis y V. N. e Kublanovskaya propusieron independientemente en 1961 reemplazar la descomposici´n o LU por la QR dando origen al m´todo que hemos visto. El trabajo de Francis era m´s e a completo y suger´ ya de hecho la reducci´n a forma de Hessenberg, la deflaci´n y estrateıa o o gias de desplazamiento. El c´lculo estable de la descomposici´n QR tuvo que esperar a los a˜os 1950, cuando a o n Wallace Givens y Alstom S. Householder propusieron sus m´todos en 1954 y 1958 ree spectivamente. Householder tambi´n en 1958 y Wilkinson en 1960 estudiaron los aspectos e num´ricos de la reducci´n de una matriz a su forma de Hessenberg. e o 9.8. Google16 Google17 ha pasado a ser en su corta vida uno de los referentes mundiales de Internet. Su sistema de b´squeda de p´ginas en la red ofrece en general unos resultados bastante u a precisos. Una de las claves de su sistema es su m´todo de evaluaci´n de las p´ginas, e o a tm denominado Pagerank . Este sistema eval´a las p´ginas web seg´n el n´mero de enlaces u a u u que permiten llegar a ella. 15 Las fuentes de esta secci´n se han obtenido principalmente del art´ o ıculo Eigenvalue computation in the 20th Century (Gene H. Golub y Henk A. van der Vorst, publicado en Journal of Computational and Applied Mathematics 123 y Matrix Algorithms Volume II: Eigensystems, de G.W. Stewart. 16 Este cap´ ıtulo se ha extra´ esencialmente del libro Numerical Computing de Cleve Moler, disponible ıdo en http://www.mathworks.com/moler/ 17 Por si alg´n despistado todav´ no conoce su direcci´n electr´nica, vis´ u ıa o o ıtese http://www.google.es, http://www.google.com y muchos m´s... a 196
  • 202. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e r do rra Bo Figura 9.2: Una web muy sencilla. Concretamente, la cuesti´n sobre la que se basa este sistema de evaluaci´n es la que o o sigue: Si una persona navega de forma continuada durante un largo periodo de tiempo, ¿c´al es la probabilidad de que llegue a una p´gina web determinada? u a Esta probabilidad es la que se utiliza para evaluar las p´ginas. A priori hay dos formas a de llegar a una p´gina: a i) a trav´s de un enlace desde otra p´gina (probabilidad p), e a 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 p´gina i tiene un enlace (un link) a la a p´gina j. a En este ejemplo n = 6 es el n´mero de p´ginas que cuenta con 9 enlaces. Este grafo u a se puede representar matem´ticamente mediante la matriz 6 × 6 a   0 0 1 0 0 0  1 0 0 1 1 0     0 1 0 0 0 0   G = (gij ) =   0 0 1 0 0 0     0 0 0 1 0 1  0 0 0 1 0 0 donde gij = 1, si llegamos a i desde j. De forma natural G es sparse, puesto que con n p´ginas uno puede esperar que el n´mero a u de enlaces sea del orden de O(n) (esto es, proporcional al n´mero de p´ginas) y no del u a orden O(n2 ) que se corresponder´ con una matriz llena. ıa Sea n cj = gij (n´mero de enlaces que salen de j). u i=1 197
  • 203. ´ LECCION IV 9.8 Google Entonces la probabilidad de llegar a i si estamos en j es gij cj p 1−p n + Siguiendo un enlace desde j Tecleando la direcci´n o r do rra Bo Esta informaci´n se puede recoger en la matriz A de tama˜o n × n cuyas componentes o n vienen dadas por gij 1 − p aij = p + . cj n Esta matriz no es sparse, pero se puede escribir pG+ 1−p en en n donde gij = gij /cj y en es la matriz columna 1 × n 1 1 ··· 1 en = . De esta forma se puede almacenar la matriz A sin necesidad de requerir grandes cantidades de memoria. Es m´s, el producto por cualquier vector se puede calcular con a Ax = p Gx + 1−p en en x = p G n x./c + 1−p n Div. elem. a elem. (en · x) en . Prod. escalar (0) a Si denotamos por xj la probabilidad de estar en la p´gina web j en un instante inicial, entonces la probabilidad de llegar a la p´gina web i en el paso primero es a n (0) (1) aij xj =: xi j=1 y por tanto      (1) x1 (1) x2 ··· (1) xn    (0) x1 a11 a12 · · · a1n     x(0)   a21 a22 · · · a2n   2 =  ..................  ···  (0) an1 an2 · · · ann xn      = Ax0 .  De esta forma, denotando por (m) (m) xm = (x1 , x2 , . . . , x(m) ) n a las probabilidades de estar en una p´gina web determinada en el paso m, obtenemos la a relaci´n o xm+1 = Axm . La idea es hacer evolucionar el sistema hasta que se estabilice. 198
  • 204. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e Proposici´n 9.5 Existe un unico x de componentes no negativas tal que o ´ n x = Ax, x en = xi = 1. i=1 r do rra Bo Adem´s, comenzando con x0 cuyas componentes sean positivas y sumen uno, a x = l´ xm . ım m El resultado dice, en palabras llanas, que la probabilidad de que estemos en una p´gina a web (esto es, x), despu´s de navegar una cantidad suficiente de tiempo18 es independiente e de c´mo hemos empezado (es decir, de x0 ). Matem´ticamente hablando, dice que existe o a un unico vector propio asociado al valor propio 1 de componentes positivas con x 1 = 1 ´ y que adem´s la sucesi´n xm converge a x independientemente del vector inicial escogido. a o Observa que la sucesi´n de vectores xm son el resultado de aplicar el m´todo de potencias o e a la matriz A (sin normalizar respecto de · 2 ) y que por su forma particular19 siempre que se parta de un vector inicial cumpliendo los requisitos de la proposici´n tendremos o que xm ≥ 0 y xm 1 = 1. Aqu´ vemos una forma completamente directa de programar este c´lculo ı a 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 % % % % % % PAGERANK(G) PAGERANK(G) Calcula el indice de impacto de una WEB dada por el grafo G El grafo tiene que ser conexo, es decir, no puede haber nodos separados del resto function y=pagerank(g) p=0.85; % probabilidad de llegar a traves de un enlace eps=0.0001; % criterio de parada nmax=1000; % numero maximo de iteraciones n=length(g); x=1/n*ones(n,1); % vector inicial for j=1:nmax y=producto(g,x,p); if norm(x-y)<eps disp(’convergencia’) return end x=y; x=x/sum(x); end 18 Ciertamente, podr´ ıamos tener que dedicar muchas horas... La 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. Te´ricamente se sabe que el valor propio o dominante de estas matrices es siempre 1. 19 199
  • 205. ´ LECCION IV 9.8 Google disp(’Convergencia no alcanzada’) return % Y= PRODUCTO(G,X,P) % calcula el producto a*x % notese que la matriz no llega a construirse r do rra Bo 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 function y=producto(g,x,p) c=sum(g); c=c(:); x=x(:); n=length(x); en=ones(n,1); y=p*g*(x./c)+(1-p)/n*en*(en’*x); return Nota. Aplicando la funci´n pagerank al ejemplo de la Figura 9.2, obtenemos este reo 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 s´lo se enlaza a trav´s del 2, la importancia de este nodo influye o e en su buena puntuaci´n. o En problemas reales, las matrices son enormes, en Febrero de 2006 google hab´ catıa 20 e o alogado 9.680.000.000 p´ginas . Despu´s de la evaluaci´n hay que hacer un filtrado de a acuerdo a las palabras clave con las que se hace la b´squeda. u Es posible hacer subir la evaluaci´n de una p´gina mediante la creaci´n de p´ginas web o a o a que se enlacen entre ellas y especialmente sobre una. Este tipo de t´cnicas, denominada e google bombing ha sido utilizado reiteradas veces por objetivos de diversa naturaleza, econ´micos, pol´ o ıticos, de protesta.... Los algoritmos del buscador tratan de detectar este tipo de trampas y reconstruir la evaluaci´n para que sea m´s imparcial. o a Nota hist´rica o Google fue fundado en 1995 por Sergey Brin y y Larry Page, el primero ingeniero el´ctrico y el segundo licenciado en matem´ticas y que contaban entonces con 23 y 24 e a 100 a˜os. El nombre proviene del n´mero 10 que, aunque no oficialmente, se llama Googol21 n u El ambiente desenfadado y el origen matem´tico del buscador tuvo un curioso reflejo a en la primera oferta p´blica de acciones que tuvo lugar a principios del 2004. Brin y Page u sacaron al mercado una participaci´n de la compa˜´ cuyo valor era 2.718.281.828$, el o nıa n´mero e con 10 cifras decimales22 . u 20 Basta hacer la b´squeda de una palabra inexistente precedida de un “-” para obtener el n´mero de u u p´ginas catalogadas. a 21 As´ lo denomino el matem´tico Edward Kasner. En ingl´s existe la palabra goggles que son unas gafas ı a e de nataci´n (?). o 22 Muy pocos se dieron cuenta de este “gui˜o”. Se hizo de nuevo palpable la escasa cultura cient´ n ıfica 200
  • 206. ´ LECCION IV Cap´ ıtulo 9. C´lculo num´rico de valores y vectores propios. a e r do rra Bo en general y matem´tica en particular del mundo period´ a ıstico. 201
  • 207. ´ LECCION IV 9.8 Google r do rra Bo 202
  • 208. r do rra Bo Lecci´n V o Salidas gr´ficas en Matlab. Interpolaci´n a o 203
  • 209. r do rra Bo
  • 210. r do rra Bo Introducci´n o ...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 m´s potentes de Matlab: las salidas a gr´ficas. Ciertamente exponer con cierto detalle todo lo relacionado con este campo es a una tarea ardua y extensa. Sin embargo, y ´ste es nuestro objetivo, s´ es asumible alcanzar e ı un conocimiento base de forma que sea el usuario quien, con la ayuda de Matlab o con manuales espec´ ıficos, profundice en los aspectos puntuales que necesite. En la segunda parte estudiaremos el problema de la interpolaci´n polin´mica como o o una buena piedra de toque para testar las salidas gr´ficas. Como aspectos relacionados a hablaremos someramente de la interpolaci´n por splines y las curvas B´zier, que nos o e ofrecen un ejemplo muy sencillo de las Matem´ticas aplicadas al dise˜o gr´fico. a n a 205
  • 211. r do rra Bo
  • 212. r do rra Bo Cap´ ıtulo 10 Matlab: Salidas gr´ficas en Matlab a 10.1. Dibujos bidimensionales 10.1.1. El comando plot Ya hemos observado que los comandos de Matlab cuentan con varios niveles de manipulaci´n. Los niveles iniciales son b´sicos y por tanto f´ciles de utilizar. El acceso a niveles o a a finos exige trabajar con argumentos nuevos, m´s instrucciones y el manejo de una sintaxis a m´s complicada. a Esta caracter´ ıstica se destaca m´s, si cabe, en los comandos relacionados con las salidas a gr´ficas. Es por ello que, empezando por la instrucci´n plot, recorreremos los diferentes a o niveles de forma gradual. No trataremos el nivel superior, que conlleva un control absoluto del dibujo, dado que requerir´ una exposici´n demasiada larga. Lo que aqu´ expondremos ıa o ı es suficiente en un 99 % de los casos, y en ultima medida, se puede acceder a todos los ´ aspectos de un dibujo desde la ventana gr´fica a golpe de rat´n. a o Primer nivel El primer comando que trataremos es plot. Es una instrucci´n muy vers´til y la m´s o a a indicada para dibujar gr´ficas de funciones y curvas en el plano. Su sintaxis b´sica es a a >> plot(x,y) que dibuja el vector y versus el vector x. M´s en concreto une los puntos (x(i), y(i)) a mediante segmentos. Tomando un n´mero suficientemente elevado de puntos trazamos u con ello una gr´fica suave, sin esquinas visibles. a 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 es un vector de n´meros complejos, dibuja la parte imaginaria versus la parte real. Es decir, u es equivalente a plot(real(y),imag(y)). Ejercicio 10.1 ¿Qu´ hacen las siguientes l´ e ıneas de c´digo? o >> clear i >> t=linspace(0,2*pi,9); >> plot(exp(i*t)); 207
  • 213. ´ LECCION V 10.1 Dibujos bidimensionales r do rra Bo Figura 10.1: Ventana gr´fica. a ¿Te parece natural? ¿Qu´ observas con la escala? ¿Qu´ sucede si se ejecuta axis equal?. e e ¿Como dibujar´ una circunferencia?. ıas Segundo nivel El comando adem´s acepta una serie de argumentos que, entre otras cosas, permiten a controlar el color, el tipo de marcas sobre los puntos (x(i), y(i)) y el formato de las l´ ıneas que los unen. As´ en su aspecto m´s general, ı, a plot(x,y,S) dibuja y versus x, con S una cadena de caracteres que se construye con1 b g r c m y k 1 azul verde rojo cian magenta amarillo negro . o x + * s d v ^ punto circulo : equis -. cruz -estrella cuadrado diamante triangulo (hacia abajo) triangulo (arriba) Traducido directamente de la ayuda de Matlab. 208 linea ’solida’ punteado punto-linea linea-linea
  • 214. ´ LECCION V Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a < > p h triangulo (izquierda) triangulo (derecha) estrella pentagonal estrella hexagonal r do rra Bo La primera columna especifica el color utilizado, la segunda la marca sobre cada punto y la tercera el patr´n que siguen las l´ o ı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 Figura 10.2. El comando figure abre una ventana gr´fica asign´ndole un n´mero. Si la ventana a a u ya est´ abierta, la coloca como la ventana de salida por defecto. En particular, figure a permite manejarse con varias ventanas de forma simult´nea. a 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 formato personalizado a cada dibujo podemos usar >> plot(x1,y1,’r-’,x2,y2,’b:’,x3,y3,’m-.’,x4,y4,’k--’) Utilizar la instrucci´n hold on que activa la superposici´n en pantalla. Por ejemplo, o o >> >> >> >> >> hold on %activamos superposicion plot(x1,y1,’r-’) plot(x2,y2,’r:’) plot(x3,y3,’m.-’) plot(x4,y4,’k--’) Esta opci´n es m´s vers´til dado que permite superponer gr´ficas construidas con o a a a diferentes comandos. La superposici´n se desconecta con hold off, de forma que o un nuevo dibujo borrar´ los anteriores. a 2 Se asignan distintos colores a cada una de las gr´ficas de forma autom´tica. a a 209
  • 215. ´ LECCION V 10.1 Dibujos bidimensionales r do rra Bo Figura 10.2: Ventana gr´fica. a Tercer nivel Ya en un tercer nivel, se pueden acceder a detalles concretos del dibujo, como el tama˜o n y color de las marcas, la anchura de la l´ ınea, etc. Las diferentes opciones llevan nombres nemot´cnicos que facilitan su memorizaci´n3 . Destacamos entre las m´s importantes e o a 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: tama˜o de la marca n Para especificar un color, se puede utilizar uno de estos caracteres {b, g, r, c, m, y, k} o bien un vector con tres componentes con valores entre 0 y 1 que especifica un color seg´n u 3 nemot´cnicos en ingl´s, of course. e e 210
  • 216. ´ LECCION V Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a el est´ndar RGB4 . a Por ejemplo r do rra Bo >>x=0.01:0.2:2; y=sin(x)./x; >>plot(x,y,’o-.’,’color’,[0.2 0.4 0.6],’linewidth’,2,... ’markeredgecolor’,’k’,’markerfacecolor’,[0.9 0.6 0.4],... ’markersize’,9) Ejercicio 10.2 Dibuja las funciones seno y coseno en [−2π, 2π], la primera en rojo y la segunda en azul. El ancho de l´ ınea debe ser de dos puntos y deben seguir dos estilos diferentes, a tu elecci´n. o Puedes empaquetar las instrucciones en un fichero script. Ser´ m´s c´modo para editar y a a o cambiar lo que desees. La ventana gr´fica a Las propiedades anteriores se pueden editar directamente en la ventana gr´fica. Para a a ello, hay que seleccionar edit plot (v´ase la Figura 10.3) y pulsar sobre la gr´fica con e un doble click. Se desplegar´ una ventana adicional con varias pesta˜as que informan y a n permiten modificar las diferentes caracter´ ısticas del objeto. Si se procede igual sobre el fondo de la pantalla controlaremos m´s aspectos del propio entorno, como la escala, el ratio a entre el eje OX y OY, las marcas sobre los ejes..., aspectos que trataremos seguidamente. ´ No entraremos a explicar estos detalles en profundidad. Este es un buen ejemplo donde la prueba, la experimentaci´n y el ensayo–error permiten aprender mejor y m´s o a r´pidamente que cualquier manual que podamos redactar. a La ventaja principal de trabajar a trav´s de comandos es que podemos dotar de un ase pecto determinado a nuestros dibujos sin necesidad de retocarlos en cada paso y para cada ejemplo. Esto es especialmente importante si necesitamos un n´mero elevado de gr´ficas u a o bien necesitamos rehacerlas constantemente. En contrapartida deberemos manejar una mayor galer´ de instrucciones. ıa 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 gr´fica modifica su aspecto para que tenga el que le hab´ dado en el a ıas Ejercicio 10.2. 4 Red, Green, Blue. Crea un color a˜adiendo partes de rojo, verde y azul (de 0 a 1) especificado por n un vector de tres componentes. 211
  • 217. ´ LECCION V 10.1 Dibujos bidimensionales r do rra Bo Figura 10.3: Edici´n de un dibujo. o 212
  • 218. ´ LECCION V 10.1.2. Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a Comandos asociados a plot Hay una serie de comandos que controlan el entorno donde se despliega la gr´fica. a Entre los m´s elementales (o al menos, m´s f´ciles de utilizar), podemos destacar: a a a r do rra Bo clf: borra la ventana actual (figure) de gr´ficos. a cla: borra el axes actual. El axes es la parte de la ventana utilizada para dibujar. Una ventana puede contener varios axes (v´ase el comando e subplot tratado m´s adelante). a hold: hold on permite que sucesivas gr´ficas se vayan solapando; hold off a desconecta esta opci´n (es la que est´ por defecto). o a axis: un comando algo complejo. Puede controlar entre otros detalles el ratio entre los ejes OX y OY, la parte del dibujo que se muestra por pantalla, las coordenadas utilizadas, el ajuste del marco al dibujo... xlim, ylim: especifican los l´ ımites del dibujo. Se puedn utilizar para centrar el dibujo. grid: grid on muestra una malla en pantalla; grid off la desconecta. legend: despliega una leyenda, esto es, un cuadro explicativo sobre las gr´ficas a presentes. text: a˜ade un texto en las coordenadas especificadas. n xlabel, ylabel: a˜ade t´ n ı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 fichero script) despliega las gr´ficas mostradas en la Figura 10.4 a 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
  • 219. ´ LECCION V 10.1 Dibujos bidimensionales r do rra Bo 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)’); Algunas graficas de funciones 0.5 exp(-x/3).*cos(x/3) exp(-x).*cos(x) exp(-3x)*cos(3x) exp(-9x).*cos(9x) 0.4 0.3 Eje OY 0.2 0.1 0 -0.1 -0.2 0 1 2 3 Eje OX 4 5 6 Figura 10.4: Una muestra de dibujos. Nota. En el comando title hemos utilizado los atributos fontname y fontsize para especificar la fuente y su tama˜o utilizada en el t´ n ıtulo. Otros atributos son fontweight: los valores posibles son light, normal, demi, bold. Especifica el trazo de los caracteres, desde fino (light) hasta negrita (bold). fontangle: sus valores son normal, italic u oblique. Fija la inclinaci´n de la fuente. o rotate: especifica el ´ngulo con el que se escribe el texto. El valor por defecto, 0, es a la escritura horizontal, mientras que con 90 se escribe el texto en vertical. 214
  • 220. ´ LECCION V Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a r do rra Bo Estos atributos est´n disponibles para cualquier comando que se ocupe de desplegar a textos en la pantalla gr´fica. Por ejemplo, xlabel, ylabel, title,... a Quiz´s lo m´s dif´ sea saber qu´ fuentes tenemos instaladas y su correspondiente a a ıcil e nombre. La soluci´n m´s sencilla a esta cuesti´n es ir a la venta gr´fica, y editar las o a o a ı e a o caracter´ ısticas del dibujo5 . All´ podremos ver qu´ fuentes est´n a nuestra disposici´n y su nombre correspondiente. Ejercicio 10.4 En este ejercicio trataremos de visualizar el efecto del comando axis con diferentes opciones sobre el aspecto final de un dibujo. Teclea >> clf >> x = 0:.025:pi/2; plot(x,tan(x),’-ro’) La funci´n tangente presenta una as´ o ıntota vertical6 en π/2. Teclea los siguientes comandos y observa el aspecto final de la figura. >> >> >> >> >> axis equal axis image axis normal axis([0 pi/2 0 5]) axis tight % vuelta al formato original % especificamos el rango de salida ¿Podr´ decir qu´ hace cada comando?. ıas e 10.1.3. Comandos get y set Los comandos get y set permiten acceder y cambiar los atributos de cualquier gr´fica. a Todo objeto gr´fico, desde una simple curva hasta la propia ventana donde se despliega a el dibujo tiene asociado un puntero, un handle al que se encuentra enlazado. Los valores de cada uno de los par´metros se pueden visualizar (get) y editar (set) desde la l´ a ınea de comandos o desde una funci´n. o Nos limitaremos de momento a dar unas ideas a grandes trazos para el comando plot. Ejecuta >> x=0:0.01:pi; >> h=plot(x,x.*cos(4*x)); La variable h es un puntero que enlaza con el dibujo desplegado sobre la ventana. Ahora se puede recabar informaci´n sobre ´ste: o e >> get(h,’linestyle’) ans = - 5 Seleccionar editar dibujo, doble click sobre el fondo, seleccionar la pesta˜a style e ir al men´ desplen u gable font name 6 Tiende a infinito. 215
  • 221. ´ LECCION V 10.1 Dibujos bidimensionales >> get(h,’marker’) ans = r do rra Bo none >> get(h,’linewidth’) ans = 0.5000 Las ´rdenes anteriores nos informan de que el dibujo se ha trazado con l´ o ınea continua, sin ninguna 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 gr´fica pasa a tener una anchura de 2 puntos, cambia el color y el estilo a ahora es punto-raya. Si se ejecuta get(h) podemos visualizar todos los atributos del objeto gr´fico: a >> 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
  • 222. ´ LECCION V Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a r do rra Bo 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, despu´s de desplegar la leyenda correspondiente en el dibujo, una variable e que permite a continuaci´n la manipulaci´n de muchas de sus propiedades. Para ello se o o utiliza la instrucci´n set o >> set(h,’fontsize’,11,’fontname’,’arial’,’fontangle’,... ’oblique’,’color’,[0.8 0.8 0.8]) cambia alguno de los atributos de la leyenda, como la fuente y su tama˜o, la inclinaci´n n o y el color de fondo. Otro ejemplo lo da el siguiente c´digo: o 01 02 03 04 05 06 07 08 09 10 x=linspace(0,4,1000); y=x.*log(x); figure(1); clf % borramos plot(x,y,’--’,’linewidth’,3); h2=gca; % accedemos al handle de la grafica set(h2,’xtick’,[0 0.25 0.5 1 2 4],’fontsize’,16,’ygrid’,... ’off’,’xgrid’,’on’,’linewidth’,2,’gridlinestyle’,’-.’) title(’x*log(x)’,’fontangle’,’oblique’,’fontname’,... ’Comic Sans ms ’,’fontweight’,’bold’,’fontsize’,20) que accede a la estructura de la gr´fica (gca), que esencialmente es el marco donde dea splegamos los dibujos. Las l´ ıneas 07-08 edita los atributos xtick, que se˜ala los puntos n donde se colocan las marcas en el eje OX, la fuente utilizada en el dibujo, activa la malla unicamente en la direcci´n OX, especifica la anchura de la l´ ´ o ınes y el patr´n que sigue. El o resultado se puede ver en la Figura 10.5. Todas las propiedades anteriores se pueden modificar m´s f´cilmente en la ventana a a gr´fica. Su manejo es f´cil e intuitivo (seleccionar, doble click, bot´n derecho del rat´n....). a a o o Con helpwin line y helpwin axes obtenemos la informaci´n de las diferentes opo ciones para la instrucci´n plot (y similares) y para la figura. o 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
  • 223. ´ LECCION V 10.1 Dibujos bidimensionales x log(x) 6 5 r do rra Bo 4 3 2 1 0 -1 0 0.25 0.5 1 2 4 Figura 10.5: Modificaci´n del entorno del dibujo. o Un ejemplo de caracter´ ısticas m´s avanzadas a Es posible asignar a un objeto gr´fico funciones que se ejecuten al realizar alguna a acci´n, como cuando se crean (´til especialmente si se redibuja constantemente) o cuando o u se seleccione con el rat´n. o 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 ´l con el rat´n, se e o ejecutar´ la instrucci´n dada en orden: a o >> v=get(h,’color’); set(h,’color’,v([3 1 2]))’; La variable orden es simplemente una cadena de caracteres con esta instrucci´n. Observa o como se repite ’ precisamente para insertar este car´cter y evitar as´ la confusi´n con el a ı o s´ ımbolo fin de cadena de caracteres. En ultima medida, estas caracter´ ´ ısticas enlazan con las interfaces gr´ficas de Mata lab (gui), donde los objetos gr´ficos pueden ser men´s desplegables, campos de textos, a u items,... Matlab dispone de una gu´ para el desarrollo de interfaces gr´ficos con su tuıa a torial correspondiente. Aqu´ no entraremos en la descripci´n y uso de estas interfaces, ı o pero animamos al lector a consultar la correspondiente ayuda mediante helpwin guide. Una vez dentro de la ayuda, aconsejamos seleccionar Go to online doc for guide y all´ acceder a Creating GUIs. ı 218
  • 224. ´ LECCION V 10.1.4. Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a El comando subplot Este comando permite la visualizaci´n de diferentes subventanas gr´ficas (axes) en o a una misma ventana. A modo de ejemplo, subplot(231) r do rra Bo define en la figure seis zonas para volcar las salidas gr´ficas dispuestas en 2 × 3 (dos filas, a tres columnas) y accede a la primera de ellas. La numeraci´n es la desplegada en la figura o 10.6. 1 2 3 4 5 6 Figura 10.6: Ejemplo de numeraci´n con subplot. o 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
  • 225. ´ LECCION V 10.1 Dibujos bidimensionales r do rra Bo 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 gr´ficas a Se˜alaremos a continuaci´n otros comandos relacionados con dibujos y gr´ficas bidin o a mensionales de manejo similar a plot plotyy: polar: semilogx, semilogy: loglog: stem: stairs: permite mostrar dos dibujos en la misma gr´fica con dos ejes a OY a la izquierda y a la derecha. curvas en polares. similar a plot pero utilizando, respectivamente, una escala logar´ ıtmica en el eje OX y en el eje OY. escala logar´ ıtmica en ambos ejes. dibuja puntos uni´ndolos con una linea vertical al eje OX. e traza una gr´fica en forma de escalera. a bar, barh, bar3: despliega gr´ficas en forma de barras. Muy apropiada para repa resentar datos y estad´ ısticas (estilo excel). area: muestra los datos en una gr´fica de forma acumulada. El cola or utilizado se controla mediante el comando colormap, cuyo funcionamiento veremos m´s adelante. a line: une puntos mediante l´ ıneas. Es una instrucci´n de bajo nivo el cuyo funcionamiento es similar a plot. De hecho, plot se construye a partir de line. fill: dibuja pol´ ıgonos cerrados y colorea su interior. patch: una instrucci´n tambi´n de bajo nivel, construye pol´ o e ıgonos, o caras en tres dimensiones y asigna un color a la cara definida. Comandos f´ciles de usar a Matlab tiene implementada una serie de comandos, asociados a la toolbox de c´lculo a simb´lico que vimos en la lecci´n anterior, que permiten dibujar de forma sencilla gr´ficas o o a de funciones. No se tiene un control tan completo como con plot pero se compensa con su f´cil uso. En el apartado que nos ocupa (gr´ficas bidimensionales) son resaltables a a 220
  • 226. ´ LECCION V Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a sin(x) cos(x) 1 0.5 0.5 0 0 -0.5 -0.5 r do rra Bo 0 2 4 6 0 2 sin(2x) 4 6 4 6 4 6 cos(2x) 1 0.5 0.5 0 0 -0.5 -0.5 0 2 4 6 0 2 sin(4x) cos(4x) 1 0.5 0.5 0 0 -0.5 -0.5 0 2 4 6 0 2 Figura 10.7: Disposici´n simult´nea de gr´ficas con subplot. o a a ezplot ezpolar La ayuda de Matlab es, en nuestra opini´n, suficiente para hacernos con su manejo. o 10.2. Gr´ficas en 3D a Comenzaremos con curvas en el espacio para pasar y tratar con mayor profundidad las superficies en 3D. Hemos decidido incluir en este apartado las instrucciones relativas a curvas de nivel aunque hablando propiamente son dibujos bidimensionales. Su origen y su posterior interpretaci´n nos conducen de nuevo al entorno espacial. o 10.2.1. El comando plot3 Este comando sirve, grosso modo, para dibujar curvas en el espacio. Su manejo es muy similar a plot, por lo que no nos detendremos demasiado en su explicaci´n. Esta es su o ´ sintaxis plot3(x,y,z,opciones) Las opciones son esencialmente las mismas que aparec´ en plot. He aqu´ un ejemplo ıan ı sencillo 221
  • 227. ´ LECCION V 10.2 Gr´ficas en 3D a r do rra Bo 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 Una curva en espiral... 30 25 eje OZ 20 15 10 5 0 30 20 30 10 20 0 10 0 -10 -10 -20 eje OY -20 -30 -30 eje OX Figura 10.8: Un dibujo en 3D con plot3. accesorios del dibujo (axes, title, xlabel, grid...) funcionan exactamente igual. Adem´s a aparecen algunos nuevos cuya utilidad y manejo no deber´ causar sorpresa: ıa zlabel zlim Para poder manipular, rotar en 3D, el objeto gr´fico basta presionar en la barra de a herramientas en el bot´n se˜alado en la Figura 10.9 y mover el rat´n sobre el objeto con o n o el bot´n pulsado o 222
  • 228. ´ LECCION V Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a r do rra Bo 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 m´s a simple se puede identificar con el dibujo de funciones de dos variables en el espacio. En este caso, el formato es surf(x,y,z) donde x e y especifican una malla en el plano y z la altura correspondiente. El color que se da a cada punto est´ asignado por defecto seg´n la altura en el eje Z. a u Queda pendiente, no obstante, c´mo construir una malla. Aunque se puede hacer a o mano (Matlab ofrece en su ayuda informaci´n detallada de c´mo hacerlo), es mejor utilizar o o los comandos propios de Matlab, en este caso, meshgrid. As´ si queremos representar una ı, superficie z = f (x, y) en un dominio rectangular utilizando los puntos de coordenadas x = (x1 , . . . , xn ) e y = (y1 , . . . , ym ), deberemos generar primero la malla formada por los puntos (xi , yj ). En Matlab simplemente tenemos que utilizar la orden [X,Y]=meshgrid(x,y) que crea las matrices de tama˜o m × n n   x 1 . . . xn  . .  .  X= . . . x 1 . . . xn   y 1 . . . y1  . . . .  Y= . . . y m . . . ym Es decir, las m filas de X son copias del vector x y las n columnas de Y son copias del vector y. La malla est´ formada por los puntos (X(i,j),Y(i,j)). Por ejemplo, a >> x=[0 0.33 0.67 1]; y=[-1 0 1]; >> [X,Y]=meshgrid(x,y) X = 0 0 0 0.3300 0.3300 0.3300 0.6700 0.6700 0.6700 1.0000 1.0000 1.0000 223
  • 229. ´ LECCION V 10.2 Gr´ficas en 3D a Y = -1 0 1 -1 0 1 -1 0 1 r do rra Bo -1 0 1 Ahora para representar la superficie z = f (x, y) utilizamos la orden surf(X,Y,Z) donde   f (x1 , y1 ) . . . f (xn , y1 )   . . . . Z = f (X, Y) =  . . . 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 seg´n los valores de un cuarto vector u (matriz m´s bien). Desde una interpretaci´n matem´tica, se tratar´ de dibujar los valores a o a ıa de una funci´n sobre una superficie: o >> 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
  • 230. ´ LECCION V Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a r do rra Bo Figura 10.11: Otro ejemplo de surf. despliega la gr´fica de la Figura 10.11. El comando colorbar muestra la barra de colores a de la derecha que informa sobre el valor num´rico que corresponde a cada color. e Tambi´n es posible dibujar superficies definidas sobre partes de un rect´ngulo. Para e a ello, cualquier punto cuya coordenada z sea un nan (not a number), no se dibuja. Por ejemplo >> >> >> >> >> x=linspace(-1,1,101); y=x; [X,Y]=meshgrid(x,y); Z=-X.^2-Y.^2; Z(sqrt(X.^2+Y.^2)<0.5)=nan; surf(X,Y,Z) ınea merece un comentario aunque despliega la superficie de la Figura 10.12). La cuarta l´ instrucciones parecidas han sido tratadas ya en la Lecci´n 1. Al hacer la comparaci´n o o sqrt(X.^2+Y.^2)<0.5, Matlab devuelve una matriz l´gica, de 1s y 0s seg´n el punto o u correspondiente est´ cerca del cero o no. La instrucci´n Z(sqrt(X.^2+Y.^2)<0.5)=NaN, e o √ hace que los puntos situados dentro del c´ ırculo de radio 1/ 2 (que es donde la expresi´n o l´gica es 1), tomen como valor NaN. De todos modos se observa la deficiente aproximaci´n o o de los cuadrados, propios de surf, del c´ ırculo interior. Al final de esta lecci´n veremos o una forma m´s elaborada para trabajar con superficies definidas sobre conjuntos m´s a a generales. Comandos del entorno 3D Nos limitaremos a hablar de cinco comandos que controlan las propiedades del entorno 3D, aunque ´stos no son los unicos disponibles en Matlab: e ´ 225
  • 231. ´ LECCION V 10.2 Gr´ficas en 3D a r do rra Bo Figura 10.12: Utilizaci´n de nan en un dibujo. o colorbar: despliega una barra de colores que informa sobre la correspondencia entre el valor num´rico y el color utilizado. Por defecto se despliega e verticalmente a la derecha del dibujo, aunque puede mostrarse horizontalmente si as´ se desea. ı colormap: especifica qu´ colores se van a utilizar en el dibujo (mapa de colores). e Existe un conjunto de formatos predefinidos que listamos a continuaci´n o autumn gray prism bone hot spring colorcube hsv summer cool jet white copper lines winter flag pink default Para cambiar a un formato basta ejecutar >> colormap(’bone’) Se pueden tambi´n definir formatos personalizados, bien mediante la e l´ ınea de comandos o desde la propia ventana gr´fica. a daspect: controla la relaci´n entre los ejes del dibujo. Baste decir que o 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
  • 232. ´ LECCION V Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a 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 par´metros: a view(az,el) r do rra Bo El primero es el azimuth (´ngulo de rotaci´n horizontal) y el segundo a o es el ´ngulo de elevaci´n vertical. Ambos deben especificarse en grados. a o Por defecto en dibujos tridimensionales az = −37.5 y el = 30. El comando surf: segundo y tercer nivel En un segundo nivel de utilizaci´n del comando anterior podemos acceder a algunas o opciones adicionales entre las que podr´ ıamos destacar:7 ’EdgeAlpha’: se especifica un valor entre 0 y 1 que define la transparencia que tiene la rejilla o red en el dibujo (con 0 la red es transparente y por tanto no se ve). ’FaceAlpha’: como la opci´n anterior pero relativa a las caras. o LineStyle: indica el formato de la rejilla: ’-’, ’--’, ’:’,.... Igual que en plot. Con ’none’ desaparece del dibujo. ’MeshStyle’ tiene tres opciones posibles both (por defecto), row y column. Especifica c´mo despliega la red: entera, s´lo las filas o s´lo o o o columnas, respectivamente. ’EdgeColor’: toma cuatro posible valores: un color (en el formato habitual), ’none’, ’flat’, ’interp’. Especifica qu´ color utilizar en la e rejilla. Por defecto es negro, pero se puede eliminar la rejilla (’none’), se puede utilizar el color marcado por el primer v´rtice (’flat’) o bien utilizar un color definido por los colores e de los dos v´rtices de cada eje (’interp’). e ’FaceColor’: con los mismos valores que en la opci´n anterior. La opci´n o o ’interp’ fija un color interpolado sobre la cara, eliminando as´ el aspecto de mosaico que en ocasiones adoptan las ı superficies. ’LineWidth’: anchura de las l´ ıneas utilizadas en el dibujo de la red. ’Marker’: indica qu´ marca colocar en cada punto del dibujo. Sigue el mise mo formato que plot (por defecto no coloca ninguna marca). ’MarkerEdgeColor’ ’MarkerFaceColor’: igual que en plot. ’MarkerSize’ Por ejemplo, la Figura 10.13 se obtiene con 7 siempre a nuestro juicio... 227
  • 233. ´ LECCION V 10.2 Gr´ficas en 3D a r do rra Bo 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
  • 234. ´ LECCION V Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a En un tercer nivel de dificultad (y de precisi´n), se puede manipular el dibujo v´ el o ıa handle que devuelve, de forma similar a como hac´ ıamos en plot. Como ejemplo ilustrativo, r do rra Bo >> 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, despu´s de dibujar, un puntero al dibujo. Podemos leer una propiedad e determinada mediante get: >> get(h,’facecolor’) ans = interp o bien ver todas con >> get(h) AlphaData = [1] AlphaDataMapping = scaled CData = [ (60 by 60) double 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 YData = [ (60 by 60) double ZData = [ (60 by 60) double FaceLighting = flat EdgeLighting = none ................ ................ array] array] array] array] Observar´ ıamos as´ algunas de las opciones que hemos comentado y otras muchas m´s que ı a no hemos estudiado. Para cambiar una propiedad utilizamos de nuevo el comando set: >> set(h, ’edgecolor’,[0.2 0 0],’linewidth’,1); >> set(h, ’facaalpha’,.5); 229
  • 235. ´ LECCION V 10.2 Gr´ficas en 3D a Mallados especiales Con sphere podemos obtener el mallado de una esfera. Puede utilizarse para dibujar bien una esfera o incluso funciones definidas sobre una superficie esf´rica. Por ejemplo, e mediante el siguiente fichero script hemos obtenido las representaciones gr´ficas de la a Figura 10.14. r do rra Bo [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 m´s a flexibles de lo que pueda parecer. As´ y aunque parezca parad´jico, ı, o 230
  • 236. ´ LECCION V Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a >> cylinder(0:0.1:1,40) dibuja un cono. r do rra Bo Ejercicio 10.6 Lee bien la ayuda de cylinder. ¿Podr´ dibujar una semiesfera utilizando ıas este comando?. 10.2.3. Otros comandos Comentaremos a continuaci´n otras instrucciones relacionadas con gr´ficas de objetos o a tridimensionales. pcolor Proporciona un dibujo bidimensional de una superficie vista desde arriba. Es equivalente a dibujar primero la superficie con la orden surf y posteriormente cambiar el punto de vista mediante view(0,90). Puedes ver un ejemplo en la Figura 10.15. Figura 10.15: Una superficie con surf y pcolor. contour y contourf Despliegan las l´ ıneas de nivel del dibujo. Propiamente generan una gr´fica en 2D. La a diferencia entre ellas es que la primera instrucci´n s´lo traza las curvas de nivel mientras o o que la segunda colorea el espacio entre ellas. Es posible a˜adir un texto sobre cada l´ n ınea de nivel utilizando clabel. Para ello basta hacer como en el ejemplo siguiente 231
  • 237. ´ LECCION V 10.2 Gr´ficas en 3D a 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 r do rra Bo >> >> >> >> >> >> >> >> >> 2 0. 04 .2 8 0. .6 0 -1 2 -0.5 6 0. 0. 6 0.2 0 9 .5 -0 9 99 0.2 1.5 0.6 -1 -0.5 -0.4 -0.6 -0.8 0.4 0.2 0 -0.2 -0.4 0 .6 0.2 -0.6 -0.2 -1.5 2 -0.2 0.6 0.2 -0.2 6 0. -0 .2 2 -0.0.2 -2 -2 0 2 .4 -0. -0.6 -0 . 8 -0 0.5 1 -0 .8 0 0.4 0 - 0.0.4 .2 0.2 0.6 6 0.8 0.6 0.4 1 0 0.4 0 -0 0 -0 .2 -0.4 -0 .6 .8 -1.5 0.6 0.2 0022 .. .8 -0 0.20 2 .6 4 - 0.0.4 -0-0. -2 -2 -1 0 .4 0.6 0.8 0.2 0. 2 0 -1 -0.2 0 -0 . -02 .5 99 0. 99 2 4 .4 8 0. .6 0 0 . 02 -0 . -0 .6 .8 -0 -0 1 0 0.6 .4 0.8 -0 .2 -0 -0.-0. 0 .8 6 4 El resultado es el de la Figura 10.16. 0 0.5 1 1.5 -0.8 2 Figura 10.16: L´ ıneas de nivel surfc y surfl Ambas son variantes de surf. La primera despliega la superficie y dibuja en el plano OXY (plano inferior) las curvas de nivel. La segunda es como surf pero el color que asigna a cada punto viene determinado por un punto de iluminaci´n exterior. El resultado es el de una superficie de un color o determinado iluminado desde un punto mesh, meshc, meshz y waterfall Todos ellos dibujan unicamente la malla (rejilla) del dibujo. La segunda adem´s a˜ade ´ a n las l´ ıneas de nivel, de forma semejante a como proced´ surfc. Finalmente, waterfall es ıa 232
  • 238. ´ LECCION V Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a como mesh pero a˜ade un efecto de caida en los bordes del dibujo8 . n 10.2.4. Comandos f´ciles de usar a Los comandos r do rra Bo ezplot3 ezcontour ezmesh ezcontourf ezmeshc ezsurf ezsurfc permiten trazar, de forma muy sencilla, curvas y superficies en el espacio. Su sencillez de uso (consulta la ayuda) queda lastrada con el inconveniente de que apenas se tiene control sobre el aspecto final. 10.3. Campos vectoriales Los comandos quiver y quiver3 despliegan en 2D y 3D campos de velocidades. Esto es, a cada punto se le asigna un vector y se dibuja. 2.5 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2.5 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 Figura 10.17: Campo de velocidades con quiver Por ejemplo, la Figura 10.17 se ha obtenido con >>x=-2:0.25:2; y=x; >>[X,Y]=meshgrid(x,y); >>ind=logical(zeros(size(X))); >>ind(X.^2+Y.^2<0.5^2)=1; >>X(ind)=[]; Y(ind)=[]; 8 % % % % Es m´s f´cil verlo que explicarlo... a a 233 malla del cuadrado [-2,2] x [-2,2] matriz logica de dimensi’{o}n la de X si (x,y) esta cerca de (0,0) vale 1 eliminamos estos puntos
  • 239. ´ LECCION V 10.4 Dibujos sobre dominios mallados en tri´ngulos a >>vx=-Y./(X.^2+Y.^2); >>vy=X./(X.^2+Y.^2); >>h=quiver(X,Y,vx,vy); >>axis square % calculamos vectores r do rra Bo Observa que cerca del (0,0) los vectores se hacen muy grandes. Para evitar que esto distorsione el dibujo hemos optado por no dibujar los vectores correspondientes a puntos muy cercanos al origen. Con este fin hemos utilizado una variable (en realidad una matriz) l´gica ind que toma valor uno unicamente si el punto correspondiente (X,Y) est´ cerca o ´ a del origen. Una vez salvada esta dificultad, hemos procedido a dibujar el campo de velocidades resultante. El comando quiver devuelve en realidad dos punteros, uno a las l´ ıneas y otro a la cabeza del vector. Sus valores opcionales son similares a los ya vistos en secciones anteriores. Ejercicio 10.7 Siguiendo con las instrucciones desplegadas arriba, observa qu´ sucede si se e ejecuta set(h(1),’linewidth’,1,’color’,’r’,’linestyle’,’:’) set(h(2),’color’,’k’) ¿Podr´ eliminar la punta de los vectores?. ıas Ejercicio 10.8 Utilizando el comando quiver3, dibuja el campo de velocidades que a cada punto le asigna el vector (velocidad) dado por − x x2 + y2 + z2 ,− y x2 + y2 + z2 ,− z x2 + y2 + z2 ) (Ayuda: el comando meshgrid es tambi´n el apropiado para construir mallas en 3D) e 10.4. Dibujos sobre dominios mallados en tri´ngulos a Los comandos que hemos estudiado a lo largo de la secci´n precedente est´n pensados o a para dibujar superficies definidas esencialmente sobre una cuadr´ ıcula. Aunque en muchos casos esto es suficiente, en otras muchas ocasiones se trabaja con funciones definidas sobre conjuntos, o dominios en la terminolog´ habitual, mucho m´s generales. ıa a Una forma muy simple de trabajar con estos dominios es dividirlos en tri´ngulos y a construir la superficie solapando diferentes planos definidos sobre cada tri´ngulo9 . Los a resultados que se obtienen son bastante satisfactorios, puesto que los tri´ngulos son m´s a a flexibles que los cuadril´teros a la hora de adaptarse a los dominios. a Esta divisi´n en tri´ngulos de un dominio se denomina triangulaci´n o mallado del o a o dominio. Se dice que un mallado se hace m´s fino si el tama˜o de los tri´ngulos disminuye. a n a Una triangulaci´n es conforme si la intersecci´n de dos lados cualesquiera del mallado o o es o bien vac´ (los tri´ngulos no se tocan), o un v´rtice o un lado entero. Es decir no ıa a e 9 Se utiliza el conocido resultado de que tres puntos no alineados definen un unico plano. Es f´cil ver ´ a tambi´n que la superficie as´ construida es continua e ı 234
  • 240. ´ LECCION V Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a r do rra Bo Figura 10.18: Triangulaci´n no conforme. o se admite que un lado de un tri´ngulo pueda ser parte de dos lados de dos tri´ngulos a a diferentes (v´ase la Figura 10.18). Por otro lado, una familia de triangulaciones se dice e regular si los tri´ngulos no se aplanan, es decir, los ´ngulos de los tri´ngulos no se hacen a a a muy peque˜os. n La siguiente cuesti´n es c´mo almacenar la informaci´n de una triangulaci´n. Si o o o o opt´ramos por guardar cada tri´ngulo, con sus correspondientes v´rtices, guardar´ a a e ıamos informaci´n redundante. Por ejemplo, un v´rtice compartido por 6 tri´ngulos ser´ almao e a ıa cenado 6 veces. En lugar de ello se opta por una estructura m´s elaborada pero m´s econ´mica. Se a a o empieza almacenando las dos coordenadas de los v´rtices en dos vectores que denotaremos e por x e y. En segundo lugar, apuntamos los v´rtices que corresponden a cada tri´ngulo. e a Esto se hace mediante una matriz, que llamaremos en lo que sigue t, de tres columnas y n´mero de filas igual al n´mero de tri´ngulos. Para saber los v´rtices que corresponden u u a e al tri´ngulo i basta leer la correspondiente fila de t y sus coordenadas ser´n a a [x(t(i,1)),y(t(i,1))], [x(t(i,2)),y(t(i,2))], [x(t(i,3)),y(t(i,3))] A modo de ejemplo, el mallado expuesto en la Figura 10.19 se guarda en las siguientes variables Triangulos 8 7 9 11 10 12 16 4 1 15 3 2 5 6 1 4 9 8 7 11 16 15 21 20 14 17 21 17 14 20 235
  • 241. ´ LECCION V 10.4 Dibujos sobre dominios mallados en tri´ngulos a 0.6 0.4 6 11 r do rra Bo 12 4 0.2 6 8 0 8 -0.2 3 -0.4 -0.6 4 25 17 20 1 12 19 20 16 15 26 13 2 14 10 15 2 18 22 13 18 24 14 16 27 23 9 19 21 7 21 5 17 28 9 3 5 -0.5 7 0 11 1 10 0.5 Figura 10.19: Ejemplo de triangulaci´n. En el gr´fico la numeraci´n de los tri´ngulos se o a o a rodea con un c´ ırculo. 5 6 14 2 17 18 3 18 16 8 10 14 19 14 12 13 13 5 10 12 7 11 13 15 9 13 13 16 14 15 13 18 17 18 16 19 19 20 15 15 20 20 16 19 17 17 19 18 21 19 20 20 21 21 coordenadas: x y 236
  • 242. ´ LECCION V Cap´ ıtulo 10. Matlab: Salidas gr´ficas en Matlab a -0.3584 0.2378 -0.3584 0.2378 -0.4603 0.3397 -0.0603 -0.0603 -0.4363 -0.4363 0.3157 0.3157 -0.1050 -0.1866 0.0614 -0.1991 0.0537 -0.0707 -0.2577 0.1306 -0.2912 r do rra Bo 0.5033 0.5033 -0.4967 -0.4967 0.0033 0.0033 0.5033 -0.4967 -0.2523 0.2590 0.2590 -0.2523 -0.0716 0.2924 0.2820 -0.2806 -0.2641 0.1204 0.0838 0.0113 -0.1031 La informaci´n anterior es suficiente para construir la malla, la triangulaci´n del doo o minio. Si adem´s se desea construir una superficie definida sobre ese dominio, basta a˜adir a n un vector adicional z de forma que z(j) sea el valor de la funci´n en el nodo j. o Figura 10.20: Un dominio mallado en tri´ngulos. a 237
  • 243. 10.4 Dibujos sobre dominios mallados en tri´ngulos a ´ LECCION V ´ Esta es una forma ya est´ndar de definir y trabajar con una triangulaci´n que tambi´n a o e 10 sigue Matlab con los comandos trimesh y trisurf. El primero despliega la malla triangular especificada por t, (la matriz conteniendo los tri´ngulos), x e y (que dan las coordenadas de los v´rtices), a e r do rra Bo trimesh(t,x,y) Se puede especificar la coordenada z de los v´rtices (la altura), e 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 manipular el aspecto final de la superficie son iguales que las de surf, incluyendo las ya vistas facecolor, facealpha, meshalpha, edgecolor,.... Nota. Un tema nada trivial es la construcci´n de un mallado sobre un dominio (poligo onal) dado. Existen multitud de algoritmos que tratan este problema. En principio se plantea la construcci´n de una malla gruesa, con pocos tri´ngulos y de ´rea considero a a able, con los tri´ngulos lo m´s regulares posibles (sin deformar, alargar, en demas´ los a a ıa tri´ngulos). a Posteriormente, se trata de refinar la malla, es decir, dividir los tri´ngulos en tri´ngulos a a m´s peque˜os hasta que se alcance una precisi´n adecuada. a n o Esta idea se esconde detr´s de aplicaciones como la interpolaci´n (aproximaci´n de a o o una funci´n) y especialmente el m´todo de elementos finitos, probablemente del m´todo11 o e e m´s utilizado en la resoluci´n de problemas de contorno para ecuaciones en derivadas a o parciales. Si se desea informaci´n de c´mo se puede inicializar un malla en Matlab, as´ como o o ı sobre el algoritmo utilizado se puede consultar el comando initmesh (incluido el tema de triangulaciones de Delaunay). Para el refinamiento puedes consultar refinemesh. . Existe otra posibilidad m´s visual, y por tanto m´s amigable para empezar a trabajar. a a Teclea >> pdetool Se cargar´ un entorno gr´fico para la resoluci´n de ecuaciones en derivadas parciales. No a a o entraremos en este tema por ser demasiado t´cnico. En lugar de ello, nos centraremos en e la definici´n de mallados. Una vez dibujado el dominio, y mallado, se puede exportar la o malla a la ventana de comandos en las variables t y p. La primera contiene en las tres primeras filas los tri´ngulos que componen la triangulaci´n mientras que las coordenadas a o de los v´rtices est´n guardadas en las dos filas de p. e a 10 La toolbox pdetool dedicada a la resoluci´n de ecuaciones en derivadas parciales sigue una variante o algo m´s complicada que la expuesta arriba. a 11 Propiamente hablando es una familia de m´todos. e 238
  • 244. r do rra Bo Cap´ ıtulo 11 Interpolaci´n. Curvas B´zier o e 11.1. Interpolaci´n polin´mica o o Un problema ya cl´sico es la construcci´n, o aproximaci´n de una funci´n conocidos a o o o unos pocos valores. Algunas referencias a este tipo de problemas se remontan al manejo de tablas trigonom´tricas y posteriormente logar´ e ıtmicas y exponenciales donde unos pocos valores estaban tabulados y para valores intermedios era necesario un proceso de interpolaci´n. Se habla en este caso de un problema de interpolaci´n de Lagrange. Si adem´s del o o a valor puntual, a˜adimos informaci´n sobre las derivadas estamos ante una interpolaci´n n o o de Hermite. En estos apuntes trataremos principalmente la interpolaci´n polin´mica, esto es, la o o construcci´n de polinomios que pasen por unos puntos predeterminados. Daremos tamo bi´n unos breves esbozos sobre la interpolaci´n por polinomios trigonom´tricos y la intere o e polaci´n polin´mica a trozos con las funciones spline. o o 11.1.1. Interpolaci´n polin´mica de Lagrange o o El problema que queremos resolver es el siguiente Dados un conjunto de n + 1 puntos {(x0 , y0 ), (x1 , y1 ), . . . (xn , yn )}, construir un polinomio pn de grado n tal que pn (xj ) = yj , j = 0, . . . , n. El polinomio pn recibe el nombre de polinomio de interpolaci´n de Lagrange. Hao bitualmente, yj son valores de una funci´n f que s´lo se puede evaluar en un conjunto o o finito de puntos porque o bien en el resto del intervalo es desconocida, o bien es cara computacionalmente de evaluar. Tenemos una serie de cuestiones pendientes: ¿Se puede construir siempre el polinomio de interpolaci´n pn ?. Y relacionada con o esta cuesti´n, ¿el polinomio de interpolaci´n es unico?. o o ´ ¿Existen formas ´ptimas para c´lcular este polinomio?. o a 239
  • 245. ´ LECCION V 11.1 Interpolaci´n polin´mica o o x 10 -9 5 4 r do rra Bo 3 2 1 0 -1 7.994 z6-46*z5+ 884*z4-9088*z3+52736*z2-163840*z+212992 (z-8)4*(4+(z-8)*(2+(z-8)) 7.996 7.998 8 8.002 8.004 8.006 Figura 11.1: Dos formas de escribir y evaluar un polinomio. ¿C´mo aproxima pn a esta funci´n f ?. Este punto es crucial ya que se trata del error o o que podemos esperar de nuestra aproximaci´n. o Como cuesti´n asociada, pero no menos importante, nos deber´ o ıamos plantear ¿Cu´l es la mejor forma de evaluar un polinomio?. Es decir, ¿nos interesa el polia nomio escrito en la manera tradicional o simplemente poder evaluarlo de forma f´cil, a r´pida y estable num´ricamente? a e Ejemplo En la Figura 11.1 hemos dibujado los polinomios (z−8)4 (4+(z−8)(2+(z−8))) y z 6 −46z 5 +884z 4 −9088z 3 +52736z 2 −163840z+212992 en un entorno de 8. Anal´ ıticamente son el mismo polinomio pero el resultado de evaluar una u otra expresi´n puede dar o un resultado muy diferente debido a los errores de redondeo. La primera expresi´n es o mucho m´s apropiada desde el punto de vista computacional aunque nosotros estemos a m´s acostumbrados a escribir los polinomios de la segunda manera. a El algoritmo m´s estable para evaluar un polinomio es el m´todo de Horner que a e est´ basado a su vez en el m´todo de Ruffini para dividir polinomios. Concretamente a e utiliza que el valor de p(a) es el resto de dividir p(z) por z − a . El algoritmo es f´cilmente a implementable y tiene un costo reducido. 11.1.2. Existencia del polinomio de interpolaci´n o Probaremos la existencia del polinomio de interpolaci´n mediante un razonamiento o directo. Tomemos Pn pn (x) = a0 + a1 x + a2 x2 + . . . + an xn , 240
  • 246. ´ LECCION V Cap´ ıtulo 11. Interpolaci´n. Curvas B´zier o e un polinomio de grado n. Obviamente, pn cuenta con n + 1 par´metros libres que son a simplemente sus coeficientes {aj }. Si exigimos que pn (xj ) = yj , j = 0, . . . , n, r do rra Bo nos encontramos con que los coeficientes satisfacen el sistema lineal 1 x0 x2 · · · xn 0 0   1 x x2 · · · xn 1  1 1   1 x2 x2 · · · xn 2 2    ..................         1 xn x2 · · · xn n n a0 a1 a2 . . . an         =       y0 y1 y2 . . . yn     .    (11.1) Por tanto el problema se reduce a la resoluci´n de un sistema de ecuaciones lineales y o la existencia y unicidad del polinomio de interpolaci´n a que el sistema en cuesti´n sea o o compatible determinado. La matriz del sistema (11.1) es de tipo Vandermonde que nos ha surgido repetidas veces en estos apuntes1 . Dado que el sistema tiene el mismo n´mero de ecuaciones que u de inc´gnitas, se tiene que la existencia de soluci´n para cualquier conjunto de o o datos es equivalente a la unicidad. Adem´s, la unicidad de soluci´n es equivalente a o a que la unica soluci´n posible para el t´rmino independiente nulo sea el polinomio cero. ´ o e Pero esto es inmediato puesto que todo polinomio no nulo de grado n tiene a lo sumo n ra´ ı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 ) i=j x − xi . xj − xi Es f´cil ver que Lj ∈ Pn y que adem´s a a Lj (xi ) := 1, 0, i = j, i = j. Por tanto, pn (x) = y0 L0 (x) + y1 L1 (x) + . . . + yn Ln (x) satisface las condiciones (11.1). Una vez probada la existencia deducimos por los mismos argumentos la unicidad del polinomio de interpolaci´n. o La f´rmula anterior se conoce como f´rmula de Lagrange del polinomio de ino o terpolaci´n y la base del espacio de polinomios Pn formada por {Lj }j se denomina base o de Lagrange del problema de interpolaci´n. o Ejercicio 11.1 Programar una funci´n que eval´e el polinomio de interpolaci´n seg´n la o u o u f´rmula de Lagrange en un conjunto de puntos. o 1 Cada columna es el resultado de elevar a una potencia el vector [1 x0 x1 · · · xn ] 241
  • 247. ´ LECCION V 11.1 Interpolaci´n polin´mica o o Soluci´n. He aqu´ una posible implementaci´n2 o ı o % % % % % % % % LAGRANGEP Y=LAGRANGEP(X0,Y0,X) devuelve en Y el valor del pol. de interp. que pasa por los puntos (X0,Y0) evaluado en x mediante la formula de Lagrange r do rra Bo 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 X0 y Y0 son dos vectores de la misma longitud, X puede ser un vector. function y=lagrangep(x0,y0,x) x0=x0(:).’; y0=y0(:).’; x=x(:).’; % todos vectores filas n=length(x0); if (length(y0)~=n) disp(’ERROR. Long de x0 debe ser igual a Long de y0’) return end y=x*0; % y es un vector nulo de igual dimension que x for j=1:n p=ones(size(x)); for i=[1:j-1 j+1:n] p=p.*(x-x0(i))./(x0(j)-x0(i)); end y=y+p*y0(j); end return Hemos testado el programa anterior para interpolar la funci´n exp(sen(6x)) en [0, π] o en diversos puntos uniformemente distribuidos (a igual distancia). El resultado, junto con el error cometido se muestra en la Figura 11.2. Ejercicio 11.2 Implementa la construcci´n del polinomio de interpolaci´n mediante la reso o oluci´n directa del sistema dado en (11.1). ¿Qu´ observas cuando el grado del polinomio o e crece?. 11.1.3. F´rmula de Newton o Es f´cil comprobar que la f´rmula de Lagrange tiene un costo computacional elevado. a o Por ello es necesario explorar formas alternativas de construir el polinomio de interpolaci´n o y de proceder a su evaluaci´n. o 2 Observa el for de la l´ ınea 20 242
  • 248. ´ LECCION V Cap´ ıtulo 11. Interpolaci´n. Curvas B´zier o e 2 exp(-x).*sin(6.*x) polinomio de grado 5 polinomio de grado 9 polinomio de grado 13 1.5 1 r do rra Bo 0.5 0 -0.5 -1 0 0.5 1 1.5 2 2.5 3 3.5 Error 1.5 1 0.5 0 -0.5 polinomio de grado 5 polinomio de grado 9 polinomio de grado 13 -1 -1.5 0 0.5 1 1.5 2 2.5 3 3.5 Figura 11.2: Polinomios de interpolaci´n con diferentes grados y el error cometido. o Observa que la f´rmula de Lagrange se basa en tomar como base de Pn la dada por o {L0 (x), L1 (x), . . . , Ln (x)}. En esta base, las coordenadas del polinomio de interpolaci´n son simplemente los valores o que toma la funci´n en los puntos donde se interpola. Es decir, no es necesario resolver o ning´n sistema de ecuaciones lineales (la matriz del sistema ser´ la matriz identidad). u ıa El precio que se paga como contrapartida es una evaluaci´n m´s cara del polinomio de o a interpolaci´n. o Podemos explorar otras bases que, aumentando el costo de la resoluci´n del sistema, o ofrezcan f´rmulas del polinomio de interpolaci´n cuya evaluaci´n sea menos costosa. o o o 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) Adem´s el sistema lineal que hay que resolver para obtener los coeficientes αj es ahora tria angular superior, por lo que su resoluci´n es pr´cticamente directa en O(n2 ) operaciones. o a 243
  • 249. ´ LECCION V 11.1 Interpolaci´n polin´mica o o A´n es m´s, si pn (x) interpola a f en n + 1 puntos, a˜adir un punto m´s (xn+1 , yn+1 ) es u a n a simplemente corregir el polinomio anterior en la forma siguiente pn+1 (x) = pn (x) + αn+1 (x − x0 ) · · · (x − xn ), donde r do rra Bo yn+1 − pn (xn+1 ) . (xn+1 − xn )(xn+1 − xn−1 ) · · · (xn+1 − x0 ) (11.3) αn+1 = (11.4) Es decir, el trabajo hecho para calcular el polinomio de interpolaci´n en n + 1 puntos se o puede utilizar si se desea a˜adir un punto m´s de interpolaci´n. n a o Estas identidades se pueden utilizar para calcular el polinomio de interpolaci´n utio lizando polinomios intermedios que vayan interpolando en subconjuntos crecientes de datos. Sin embargo, un an´lisis algo m´s detallado nos va a descubrir una manera m´s a a a apropiada de calcular los coeficientes del polinomio de interpolaci´n. Siguiendo la noo taci´n cl´sica, consideraremos que los valores yj que deseamos interpolar provienen de o a una funci´n f a priori desconocida, es decir, o 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 notaci´n es correcta. Esto es, el coeficiente o de (x − xk ) · · · (x − xk+r ) no depende de m. Obviamente, si k = 0 y m = n, entonces recuperaremos el polinomio de interpolaci´n en el conjunto inicial de valores. A estas o alturas f [xk , xk+1 , . . . , xk+r ] son todav´ simples coeficientes del polinomio de cuyo c´lculo ıa a nos ocupamos a continuaci´n. Es inmediato comprobar que si o 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 (pn (x) − qn (x)), x0 − xn+1 (11.6) es el polinomio que interpola en los n + 1 puntos (x0 , f (x0 )), (x1 , f (x1 )), . . . , (xn+1 , f (xn+1 )) . Deteng´monos un momento a examinar el coeficiente director de cada polinomio. El a coeficiente 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 244 (11.7)
  • 250. ´ LECCION V Cap´ ıtulo 11. Interpolaci´n. Curvas B´zier o e Como f [xj ] = f (xj ) r do rra Bo (simplemente porque el polinomio de grado 0 que pasa por (xj , f (xj )) es la constante f (xj )), obtenemos una forma recursiva de calcular los coeficientes del polinomio de interpolaci´n. El algoritmo resultante se puede representar esquem´ticamente mediante el o a diagrama de la Figura 11.3. En la literatura, f [xk , . . . , xk+r ] recibe el nombre de diferencia dividida de order r, mientras que la forma de escribir el polinomio expuesta en (11.2) y (11.5) recibe el nombre de f´rmula de Newton3 . o Obviamente, a partir de la f´rmula de Newton podemos expresar el polinomio que o interpola 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 m´s apropiada desde el punto de vista computacional que la forma cl´sica. a a En forma de pseudoc´digo podemos proceder del siguiente modo para evaluar el polio nomio de interpolaci´n utilizando la f´rmula de Newton: o o Diferencias divididas 01 02 03 04 05 06 07 08 09 10 11 12 13 14 x0 , y0 % datos n = length(x0 ) − 1 D(:, 0) = y0 ; for j=1:n for i=0:n-j D(i + 1, j − 1) − D(i, j − 1) D(i, j) = x0 (i + j) − x0 (i) end end % Evaluacion del polinomio y=D(0,n) for i=n-1:-1:0 y = (x − x0 (i)) ∗ y + D(0, i) end Con la notaci´n anterior o 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. 3 De nuevo los nombres utilizados dan idea de la antig¨edad de estas t´cnicas. Newton hall´ esta forma u e o de escribir el polinomio cuando estudiaba las f´rmulas de cuadratura de Newton-Cotes. o 245
  • 251. ´ LECCION V 11.1 Interpolaci´n polin´mica o o Orden 0 x0 Orden 1 Orden 2 Orden 3 / f [x0 , x1 , x2 ] / f [x0 , x1 , x2 , x3 ] / f [x0 , x1 ] l6 mm6 mm6 lll mm mm lll mmm mmm lll mmm mmm lll mmm mmm / f [x1 , x2 ] / f [x1 , x2 , x3 ] f (x1 ) = f [x1 ] m6 m mm6 mmm mmm mmm mmm mm mm mmm mmm / f [x2 , x3 ] f (x2 ) = f [x2 ] 6 mmm m mmm mmm mmm f (x0 ) = f [x0 ] r do rra Bo x1 x2 x3 f (x3 ) = f [x3 ] Figura 11.3: Estructura del c´lculo de las diferencias dividas. a Ejercicio 11.3 Implementa el c´lculo del polinomio de interpolaci´n mediante diferencias a o divididas. Soluci´n. Nuestra intenci´n es, si no se especifican valores donde evaluar el polinomio, o o que se devuelva el polinomio escrito en forma simb´lica. Es decir, declararemos x como o variable simb´lica y devolveremos el polinomio en esta variable. Podemos escoger hacerlo o en forma expandida o bien simplemente escrito en la forma anidada. Nosotros hemos escogido hacerlo en la segunda forma. Por otro lado y entrando ya en el tema de su implementaci´n, en el algoritmo anterior o todas las entradas de los vectores y matrices implicados se numeran de 0 a n. Hay que tener en cuenta, como ya hemos hecho repetidas veces, que la numeraci´n en Matlab comienza o necesariamente en 1 y por tanto los vectores y bucles ir´n de 1 a n+1. Recordemos que a n+1 es la longitud del vector de datos. Aunque en teor´ renumerar el algoritmo es ıa algo sencillo, hay que hacerlo con cierto cuidado. Dicho esto, una implementaci´n posible es la siguiente o 01 02 03 04 05 06 07 08 09 10 11 12 13 % NEWTONP % % Y= NEWTONP(X0,Y0) % % % Y= NEWTONP(X0,Y0,X) % devuelve el polinomio que interpola en (X0,Y0) escrito en forma de Newton devuelve en Y el polinomio interpolante evaluado en X function y=newtonp(x0,y0,varargin) x0=x0(:).’; y0=y0(:).’; n=length(x0)-1; if (length(y0)~=n+1) disp(’long de x0 debe ser igual long de y0’) 246
  • 252. ´ LECCION V return end if nargin>2 x=varargin{1}; % evaluamos x else syms x; % x es una variable simbolica end % calculo de las diferencias divididas D=zeros(n+1); % matriz n+1 x n+1 de ceros D(:,1)=y0.’; for j=2:n+1 for i=1:n-j+2 D(i,j)=(D(i+1,j-1)-D(i,j-1))/(x0(i+j-1)-x0(i)); end end % evaluacion del polinomio D=D(1,:); % tomamos las diferencias que vamos a usar y=x.^0.*D(n+1); % asi y tiene la longitud de x for i=n:-1:1 y=(x-x0(i)).*y+D(i); end return r do rra Bo 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 Cap´ ıtulo 11. Interpolaci´n. Curvas B´zier o e Ejercicio 11.4 El bucle interno en las l´ ıneas 25-27 se puede vectorizar. Hazlo. Un an´lisis m´s detenido muestra que no es necesario definir toda una matriz D sino a a que es posible realizar todo el proceso con un vector. Para ello observa que las diferencias D(i, j) con s´lo se utilizan dos veces, para construir D(i − 1, j + 1) y D(i, j + 1). Esto se o consigue modificando las l´ ıneas 03-08 del algoritmo como sigue Modificaci´n o 03 04 05 06 07 08 D = y0 ; for j=1:n for i=n:-1:j D(i) − D(i − 1) D(i) = x0 (i) − x0 (i − j) end end 247
  • 253. ´ LECCION V 11.1 Interpolaci´n polin´mica o o Observa que las diferencias se sobrescriben en el vector pero de una forma tal que un valor no es borrado hasta que ya ha sido utilizado. De ah´ que el bucle en 05 vaya hacia ı atr´s. Con esta modificaci´n a o D(i) =f [x0 , x1 , . . . , xi ]. r do rra Bo Ejercicio 11.5 Retoca el programa newtonp seg´n las indicaciones anteriores. u Ejercicio 11.6 El algoritmo de Neville para la evaluaci´n del polinomio de interpolaci´n se o o basa en la identidad (11.6). Dado el punto x donde evaluar el polinomio de interpolaci´n o y 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 en dos puntos ({{x0 , x1 }, {x1 , x2 }, . . . , {xn−1 , xn }}), seguidamente los de grado 2 interpolantes en tres puntos, ({{x0 , x1 , x2 }, {x1 , x2 , x3 }, . . . , {xn−2 , xn−1 , xn }}), y as´ sucesivamente hasta ı llegar al polinomio final de grado n. En todos los casos es la identidad (11.6) la que permite calcular el valor del polinomio de grado k + 1 en funci´n de dos de grado k. La evaluaci´n se puede representar en forma de o o estructura en ´rbol, muy similar a la que se obtiene para las diferencias divididas. ¿Podr´ a ıas dise˜ar y programar este algoritmo?. n Nota. Observa que el m´todo funciona a´n cuando los puntos x0 , . . . , xn no est´n e u e ordenados, aunque para una evaluaci´n del polinomio m´s estable es mejor que as´ sea. o a ı Adem´s la definici´n de las diferencias divididas no depende del orden de los puntos a o f [x0 , . . . , xi , . . . , xj , . . . xn ] = f [x0 , . . . , xj , . . . , xi , xn ]. De forma alternativa se puede escribir el polinomio de interpolaci´n mediante o 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 hemos tratado reciben el nombre de diferencias progresivas. Ejercicio 11.7 Modificar los algoritmos anteriores para trabajar con las diferencias regresivas. Interpolaci´n en Matlab o La interpolaci´n polin´mica est´ implementada en Matlab con polyfit. La sintaxis es o o a >> p=polyfit(x0,y0,n) donde x0 e y0 son los puntos a interpolar y n es el grado del polinomio utilizado. Si n se toma igual a length(x0) − 1, devuelve el polinomio de interpolaci´n mientras que para o n 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 matriz de Vandermonde y resolviendo el sistema mediante una descomposici´n QR que es m´s o a estable num´ricamente. Sin embargo, con un n´mero (muy) elevado de puntos, la inestae u bilidad num´rica subyacente se hace palpable. e 4 (p(xi ) − yi )2 . Es decir, calcular el polinomio de grado n, que minimiza i 248
  • 254. ´ LECCION V Cap´ ıtulo 11. Interpolaci´n. Curvas B´zier o e Ejercicio 11.8 Interpola la funci´n cos(8πx) en [0, 1] con 20,40, 80 y 160 puntos utilizando o el comando polyfit y las funciones lagrangep y newtonp y dibuja el resultado. ¿Qu´ obsere vas?. 11.1.4. An´lisis del error de interpolaci´n a o r do rra Bo El error entre la funci´n y el polinomio de interpolaci´n se puede estudiar utilizano o do algunas propiedades de las diferencias divididas que detallaremos m´s adelante. En a cualquier caso, el resultado relevante es el siguiente: si f es la funci´n regular que intero polamos en {x0 , x1 , . . . , xn } ⊂ [a, b], entonces el error en cada punto se puede escribir f (x) − pn (x) = 1 f (n+1) (ξx ) (x − x0 )(x − x1 ) · · · (x − xn ) (n + 1)! (11.10) ωn (x) donde ξx ∈ [a, b] depende de x. Vemos que hay varias contribuciones al error final: el factor 1/(n + 1)! que tiende r´pidamente a 0, a un factor que depende del crecimiento de la derivada n + 1, un t´rmino que depende de la colocaci´n de los nodos de interpolaci´n y que puede e o o ser muy oscilante. En vista de lo anterior ser´ f´cil concluir que hay convergencia del polinomio de ıa a interpolaci´n a la funci´n si ´sta es suave. Dicho de otra manera, funci´n y polinomio se o o e o volver´ indistinguibles si tom´semos un n´mero elevado de puntos. ıan a u o Desafortunadamente5 , la conclusi´n anterior es falsa. Uno de los primeros (con6 ıa tra)ejemplos lo encontr´ Carl Runge a finales del siglo XIX7 . Consist´ en interpolar la o funci´n o 1 f (x) = 1 + 25x2 en el intervalo [−1, 1] en un conjunto uniforme de puntos. El resultado (desastroso) se muestra en la Figura 11.4. Una forma de reducir el error es controlar la funci´n ωn (x) para que sea lo m´s peque˜a o a n posible. As´ el problema se plantea en los siguientes t´rminos8 ı, e ¿Qu´ elecci´n de los nodos {x0 , x1 , . . . , xn } hace que m´xx |ωn (x)| sea e o a m´ ınimo?. 5 Y contraintuitivamente. ¿C´mo entender si no que dos funciones regulares que coincidan en un n´mero o u cada vez mayor de puntos no acaben siendo muy similares? 6 Matem´tico alem´n de finales del siglo XIX. Tambi´n es conocido por ser codesarrollador del M´todo a a e e Runge-Kutta para la resoluci´n de problemas de valor inicial. o 7´ Este fue el siglo de la fundamentaci´n de las Matem´ticas. Se prob´ que multitud de resultados que se o a o ten´ como evidentes eran falsos y fue necesario reconstruir las Matem´ticas desde su base. Por ejemplo, ıan a en el mismo siglo se mostr´ la existencia de funciones no continuas en ning´n punto, de funciones continuas o u pero no derivables en ning´n punto, as´ como de funciones con un n´mero infinito de m´ximos y m´ u ı u a ınimos locales. Tambi´n se construyeron curvas que rellenaban el plano, curvas cerradas que englobando una ´rea e a finita ten´ una longitud infinita (fractales)... Algunas de estas construcciones, originarias esencialmente ıan en las Matem´ticas puras han encontrado en el siglo XX aplicaciones a problemas de ´ a ındole esencialmente pr´ctico. a 8 Un problema min-max: minimizar un m´ximo. a 249
  • 255. ´ LECCION V 11.1 Interpolaci´n polin´mica o o 2 1.5 1 0.5 0 r do rra Bo 2 1./(1+25.*x. ) polinomio de grado 5 polinomio de grado 10 polinomio de grado 15 polinomio de grado 20 -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 Error 4 3 2 1 0 -1 polinomio de grado 5 polinomio de grado 10 polinomio de grado 15 polinomio de grado 20 -2 -3 -4 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 Figura 11.4: Ejemplo de Runge. Polinomio de interpolaci´n y error cometido. o ´ Este es un problema cl´sico que fue resuelto por Pafnuty Lvovich Chebyshev9 en a t´rminos de una familia de polinomios conocidos como polinomios de Chebyshev de primer e tipo. Para un intervalo arbitrario [a, b], la disposici´n de los n + 1 puntos de interpolaci´n o o que minimizan el m´xx∈[a,b] |wn (x)| es la dada por los puntos a xk := a+b b−a π kπ + cos + , 2 2 2n + 2 n + 1 k = 0, . . . , n. (11.11) Es f´cil comprobar que la distribuci´n de puntos no es en medida alguna uniforme sino a o que tiende a concentrar puntos en los extremos. La elecci´n de estos puntos para la interpolaci´n no asegura la convergencia del o o polinomio pero s´ permite controlar mejor uno de los t´rminos que m´s r´pido pueden ı e a a crecer con n, con lo que en la pr´ctica se traduce en mejores resultados10 . De hecho con a esta elecci´n, o 1 m´x |ωn (x)| = n a x∈[a,b] 2 9 Matem´tico ruso del siglo XIX. Estos polinomios surgieron en sus estudios en aproximaci´n de funa o ciones por polinomios. Chebyshev hizo tambi´n importantes contribuciones en Teor´ de la Probabilidad. e ıa 10 Dicho de otra manera, es m´s dif´ dar con un ejemplo para el que esta disposici´n de nodos d´ un a ıcil o e polinomio interpolante que no converja a la funci´n original. o 250
  • 256. ´ LECCION V Cap´ ıtulo 11. Interpolaci´n. Curvas B´zier o e de forma que ωn (x) → 0 cuando n → ∞ (adem´s esta convergencia es r´pida). En la a a Figura 11.5 observamos como ahora el polinomio interpolante para el ejemplo de Runge converge a la funci´n. o r do rra Bo 2 1.5 1 0.5 0 1./(1+25.*x.2) polinomio de grado 5 polinomio de grado 10 polinomio de grado 15 polinomio de grado 20 -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 Error 4 3 2 1 0 -1 polinomio de grado 5 polinomio de grado 10 polinomio de grado 15 polinomio de grado 20 -2 -3 -4 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 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 la disposici´n de los puntos dados por (11.11). Dibuja los puntos obtenidos para diferentes o valores de n. Dibuja tambi´n el polinomio ωn (x). ¿A qu´ funci´n te recuerda?. e e o Ejercicio 11.10 (te´rico) Se trata de probar una serie de propiedades de las diferencias o divididas de las que finalmente se deduce la estimaci´n del error del polinomio de interpolaci´n o o dada en (11.10). (1) Prueba que f (j) (x) − p(j) (x) se anula en n + 1 − j puntos para j = 0, . . . , n + 1. (2) Utilizando (1), prueba que existe ξ tal que f [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 estimaci´n del error dada en (11.10). o 251
  • 257. ´ LECCION V 11.2 Extensiones adicionales (Ayuda: El Teorema de Rolle establece que si g es derivable en [a, b] con g(a) = g(b) entonces existe c ∈ (a, b) tal que g (c) = 0. Aplicando este resultado, concluimos que existe αj ∈ (xj , xj+1 ) (j = 0, . . . , n − 1) tal que r do rra Bo 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. Interpolaci´n de Hermite o La interpolaci´n de Hermite incorpora las derivadas como datos adicionales. Concreo 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 la derivada de orden 2 es dato, tambi´n lo es el valor de la funci´n y su primera derivada. e o El n´mero total de datos es u N := (m0 + 1) + (m1 + 1) + · · · + (mn + 1), por lo que el polinomio deber´ tener grado N − 1. ıa El an´lisis de este problema no tiene mayor dificultad que el ya realizado para la intera polaci´n polin´mica de Lagrange. La clave est´ en la fuerte relaci´n entre diferencias divio o a o didas y derivada, mostrada en el Ejercicio 11.10. As´ se hace la siguiente interpretaci´n: ı, o f [ xk , . . . , xk ] := f (m) (xk ). m + 1 veces La idea es ordenar los nodos y tomarlos repetidos seg´n el n´mero de datos que considu u eramos en cada punto de forma que tomaremos los N nodos {x0 , x0 , . . . , x0 , x1 , x1 , . . . , x1 , . . . , xn , xn , . . . , xn .} m0 +1 m1 +1 mn +1 Las diferencias divididas se definen de nuevo de forma recursiva  (m)  f (xi ) ,   m! f [xi , xi+1 , . . . , xi+m ] :=  f [xi , x1 , . . . , xi+m−1 ] − f [xi+1 , x1 , . . . , xi+m ]   , xi − xm 252 si xi = xi+m , en otro caso,
  • 258. ´ LECCION V Cap´ ıtulo 11. Interpolaci´n. Curvas B´zier o e y el polinomio de interpolaci´n se construye exactamente como antes, es decir, utilizando o la f´rmula (11.8) con las nuevas definiciones de los nodos y de las diferencias divididas. o El c´lculo de las diferencias y la evaluaci´n del polinomio en un punto en el caso de a o la interpolaci´n de Hermite puede describirse en lenguaje de pseudoc´digo de la siguiente o o forma: Diferencias divididas para la interpolaci´n Hermite o r do rra Bo 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 x0 , y0 datos n = length(x0 ) − 1 D = y0 ; for j=1:n for i=n:-1:j if x0 (i) == x0 (i − j) D(i) = D(i)/j else D(i) − D(i − 1) D(i) = x0 (i) − x0 (i − j) end end end % Evaluacion del polinomio y=D(n); for i=n-1:-1:0 y = (x − x0 (i)) ∗ y + D(i) end En este algoritmo la tabla de diferencias divididas se almacena de forma compacta, como se sugiri´ en el Ejercicio 11.5. Observa que desde el punto de vista computacional o las diferencias con respecto a la interpolaci´n de Lagrange son m´ o ınimas. Ejercicio 11.11 Entiende bien el algoritmo anterior. Implementa la interpolaci´n de Hermite o seg´n el siguiente prototipo u 01 02 03 04 05 06 07 08 HERMITEP Y=HERMITEP(X0,Y0) Devuelve en Y el polinomio de interpolacion de Hermite X0 debe estar ordenados. Los nodos repetidos se interpretan como derivadas sucesivas en ese punto Y=HERMITE(X0,Y0,X) Devuelve en Y la evaluacion del polinomio en X Observa que, una vez implementada esta funci´n, o >> x0=[0 0 0 0 0 0]; y0=[1 1 1 1 1 1]; >> p=hermitep(x0,y0) 253
  • 259. ´ LECCION V 11.2 Extensiones adicionales devuelve de hecho el polinomio de Taylor de orden 5 de f (x) = exp(x) en el cero. La orden >> simple(hermitep(x0,y0)) hace m´s evidente esta identidad. a r do rra Bo 11.2.2. Interpolaci´n de funciones peri´dicas o o Si una funci´n es peri´dica es natural reemplazar en el problema de interpolaci´n los o o o polinomios por funciones peri´dicas sencillas con el mismo periodo. Por simplificar, vamos o a suponer que estamos considerando unicamente funciones 2π–peri´dicas, aunque las ideas ´ o que a continuaci´n expondremos se extienden f´cilmente a funciones con cualquier periodo. o a Concretamente, si se trata de funciones 2π–peri´dicas podemos utilizar o sen(nx), cos(nx), n ∈ N ∪ {0} para interpolarlas, o bien, n ∈ Z. exp(inx), Ambas son equivalentes, como ya vimos en la Lecci´n 3 con la FFT, pero la utilizaci´n o o de exponenciales complejas facilita tanto el an´lisis como la manipulaci´n as´ como la a o ı extensi´n de la interpolaci´n a funciones complejas o o Supongamos que tomamos un n´mero impar 2n+1 de puntos de interpolaci´n equidisu o tantes: 2kπ , k = 0, . . . , 2n. xk = 2n + 1 El problema queda as´ definido: calcular ı n p2n+1 (x) := αj exp(ijx) j=−n tal que n yk = p2n+1 (xk ) = αj exp j=−n 2πijk . 2n + 1 La resoluci´n de este problema se puede llevar a cabo con la transformada de Fourier o Discreta, y por tanto es aplicable la FFT. Ejercicio 11.12 Comprueba que efectivamente se reduce todo a una transforma de Fourier discreta. (Ayuda: Observa que exp − 2πijk 2πi(2n + 1 − j)k = exp . 2n + 1 2n + 1 Por tanto el problema es equivalente a encontrar αj tales que n yk = p2n+1 (xk ) = αj exp j=0 2πijk + 2n + 1 2n α2n+1−j exp j=n+1 2πijk . 2n + 1 Ejercicio 11.13 ¿Qu´ pasa si se toma un n´mero par de puntos de interpolaci´n? e u o 254
  • 260. ´ LECCION V Cap´ ıtulo 11. Interpolaci´n. Curvas B´zier o e Nota. El interpolante converge a la funci´n bajo hip´tesis mucho m´s d´biles que en o o a e el caso no peri´dico. Por ejemplo, basta con que la funci´n tenga derivada continua. No o o existen por tanto fen´menos como el de Runge para funciones peri´dicas con condiciones o o m´ ınimas de regularidad. r do rra Bo 11.2.3. Interpolaci´n polin´mica a trozos o o Los polinomios tienen un importante inconveniente que desaconseja su utilizaci´n para o a la interpolaci´n en un n´mero elevado de puntos. La Figura 11.6 ilustra esta problem´tica o u con un problema de interpolaci´n para el que el polinomio correspondiente exhibe un como portamiento ciertamente irracional. Ello se debe a que se obliga a que el polinomio sea pr´cticamente constante en dos zonas con un salto en medio. El polinomio es excesivaa ´ e mente r´ ıgido11 que en ultima medida provoca que ´ste se rompa. 2 1.5 1 0.5 0 -0.5 0 0.2 0.4 0.6 0.8 1 Figura 11.6: Rigidez polin´mica o Como forma de solventar estos problemas se opta por utilizar elementos m´s complia cados pero que sean m´s flexibles. a Uno de los elementos m´s populares son los splines. Un spline12 es una funci´n a o polin´mica a trozos que cuenta con cierta regularidad. Es decir, diferentes polinomios o sobre diferentes subintervalos se unen exigiendo adem´s que la funci´n resultante sea cona o tinua y derivable hasta cierto orden. Los representantes m´s sencillos son las constantes a a 11 Es un s´ ımil con lo que sucede si se dobla una vara muy r´ ıgida. El problema al utilizar polinomios es que basta modificar un s´lo dato para que el polinomio se cambie en todo el dominio, en muchas ocasiones o sin ning´n control. Sin embargo, en un interpolante uno deber´ esperar que la modificaci´n de un punto u ıa o afectara s´lo al entorno de dicho punto. o 12 aceptaremos el anglicismo a partir de ahora. 255
  • 261. ´ LECCION V 11.2 Extensiones adicionales r do rra Bo trozos y las poligonales. En este ultimo caso, se trata sencillamente de unir los puntos por ´ segmentos obteni´ndose una curva poligonal. Sin embargo para las constantes a trozos no e podemos exigir continuidad y para las poligonales no podemos exigir derivabilidad en los puntos de contacto (tiene picos). Los splines c´bicos son probablemente los m´s utilizados. Partiendo de una subdivisi´n u a o del intervalo a = x0 < x1 < · · · < xn = b, se trata de construir una funci´n sn tal que o 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 interpolaci´n y de modo que o tanto la funci´n sn como sus derivadas primera y segunda sean continuas13 en todo el o intervalo [a, b]. Por tanto tenemos que exigir que l´ s(j) (x) = l´ − s(j) (x), ım n ım n x→x+ j j = 0, 1, 2. x→xj La continuidad de la primera derivada preserva la existencia de recta tangente (no hay picos) y por tanto la velocidad de recorrido de la curva, mientras que con la continuidad de la derivada segunda garantizamos que curvatura de la curva sea tambi´n continua en e todo el dominio de definici´n. o Dado que tenemos n subintervalos, y cuatro par´metros sobre cada intervalo (sn es un a polinomio de grado 3 en cada intervalo), disponemos de 4n variables. Por contra, los datos de interpolaci´n fijan n + 1 restricciones y las condiciones de continuidad del spline y de o sus dos primeras derivadas en las interfaces de los subintervalos dan otras 3n condiciones. En total tenemos n + 1 + 3(n − 1) = 4n − 2 restricciones, por lo que el problema precisa fijar dos condiciones adicionales para poder hablar, siquiera plantear, la unicidad del spline. Estas son algunas de las elecciones habituales sn (x0 ) = sn (xn ) = 0, spline natural. Datos adicionales sn (x0 ) = y−1 , sn (xn ) = yn+1 , spline grapado. Condiciones de periodicidad: si los datos son peri´dicos se puede imponer sn (x0 ) = o o sn (xn ), sn (x0 ) = sn (xn ), spline peri´dico. 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 t´cnicas m´s eficientes, y por tanto e a complejas, que la forma directa que se deduce de su definici´n. o Entre las buenas propiedades de los splines destacamos que convergen a la funci´n si o ´sta es continua. A´n es m´s, si la funci´n f que se interpola es regular (de hecho basta e u a o con que su derivada cuarta sea continua) m´x |sn (x) − f (x)| ≤ C m´x(xj+1 − xj )4 a a x j con C una constante dependiente de f pero independiente de los puntos. 13 Si forz´ramos la continuidad de la tercera derivada tendr´ a ıamos globalmente un polinomio de grado tres. 256
  • 262. ´ LECCION V Cap´ ıtulo 11. Interpolaci´n. Curvas B´zier o e r do rra Bo Nota. Los splines tienen un origen muy natural. Exist´ una herramienta de dibujo, ıa ya anticuada, que recib´ el nombre de spline, o trazador en castellano. Consist´ en ıa ıa una especie de regla hecha de un material flexible que se moldeaba para hacer coincidir el trazado por una serie de puntos. La curva as´ trazada es f´ ı ısicamente equivalente a resolver el problema de construir una curva que pase por una serie de puntos y que minimice la energ´ el´stica. La soluci´n matem´tica a este problema es un spline natural ıa a o a (polinomio c´bico a trozos con derivada segunda nula en los extremos) lo que justifica su u denominaci´n. o Se pueden definir splines de mayor grado, siguiendo exactamente la idea anterior, esto es, pegando polinomios a trozos y dando la mayor regularidad posible. Splines en Matlab Matlab dispone de dos comandos encargados de esta tarea: ppval spline El primero (piecewise polynomial value) eval´a una funci´n polin´mica a trozos. Uno u o o de sus argumentos es la propia estructura de la funci´n seg´n una sintaxis propia de o u Matlab. La segunda instrucci´n devuelve una estructura de este tipo que contiene el spline o que interpola a datos. A modo de ejemplo, he aqu´ el spline natural que interpola a los datos desplegados en ı 14 la Figura 11.7 >> >> >> >> >> x0=linspace(0,1,21); y0=[zeros(1,6) ones(1,15)]; p1=spline(x0,y0); % spline natural x=linspace(0,1,200); h=plot(x0,y0,’o’,x,ppval(p1,x),’r’,’linewidth’,2); Por otro lado Matlab tiene implementada una serie de funciones para trabajar con splines m´s generales en una toolbox. Al ejecutar splinetool podemos acceder a un a entorno gr´fico donde testar las capacidades de Matlab en este campo. a 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 param´tricas e x(t) := (x(t), y(t)), t ∈ [0, T ] (11.12) tal que x(tj ) = (xj , yj ). (11.13) Una buena elecci´n es utilizar splines. Para ello se trata de calcular dos splines cx(t) y cy(t) o que satisfagan, obviamente, cx(tj ) = xj , 14 cy(tj ) = yj . Los splines siguen conservando cierta rigidez pero se adaptan mucho mejor a los datos. 257
  • 263. ´ LECCION V 11.2 Extensiones adicionales 1.2 1 r do rra Bo 0.8 0.6 0.4 0.2 0 -0.2 0 0.2 0.4 0.6 0.8 1 Figura 11.7: Interpolaci´n con splines c´bicos naturales o u Tenemos as´ dos problemas de interpolaci´n desacoplados, esto es, cada uno se resuelve inı o dependiente del otro. Queda como cuesti´n pendiente la elecci´n de T en (11.12) y de los o o puntos tj en (11.13). Una buena elecci´n es tomar o 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 02 03 04 05 SPLINE2D SPLINE2D(X,Y) Traza una curva en el plano que pasa por (X(i),Y(i)) utilizando splines cubicos Ejercicio 11.15 El comando ginput permite introducir los puntos a trav´s del rat´n. Lee e o bien la ayuda y modifica el programa anterior para que haga posible la lectura de los datos con el rat´n en caso de que se llame a la funci´n sin argumentos. o o Entre las posibilidades que ofrece est´ la de controlar qu´ tecla o bot´n del rat´n se ha a e o o utilizado. 258
  • 264. ´ LECCION V Cap´ ıtulo 11. Interpolaci´n. Curvas B´zier o e Ayuda. Deduce qu´ realiza el siguiente c´digo... e o r do rra Bo 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 seleccionado con el rat´n. o 11.3. Curvas B´zier e Las curvas B´zier son curvas en el plano que quedan determinadas por un conjunto e de puntos que marcan su recorrido, aunque estas curvas no pasan necesariamente por ´ todos los puntos. Estos forman un pol´ ıgono de control en el siguiente sentido: la curva est´ contenida en el pol´ a ıgono formado por esos puntos e imita con cierta libertad la poligonal que dibujan. La curva se construye utilizando los polinomios de Bernstein de orden n: n Bj (t) = n j t (1 − t)n−j , j j = 0, 1, . . . , n. Es un simple ejercicio comprobar que los polinomios cumplen las siguientes propiedades: n {Bj }n son una base de Pn . Dicho de otra forma, cualquier polinomio se puede j=0 escribir como una combinaci´n de estos polinomios. o 259
  • 265. ´ LECCION V 11.3 Curvas B´zier e n n Bj (t) = 1, ∀t ∈ R. j=0 A partir de unos puntos con i = 0, . . . , n, r do rra Bo xi = (xi , yi ), se construye ahora la curva de B´zier utilizando estos polinomios: e n n n Bj (t)xj S(t) := = j=0 n n Bj (t)xj , j=0 n Bj (t)yj , t ∈ [0, 1]. j=0 El par´metro t se mueve de forma que para t = 0 estamos en el punto inicial y para t = 1, a en el final. N´tese que los puntos utilizados para dibujar la curva est´n ordenados: hay o a un punto inicial x0 , uno final xn y a xj le sigue xj+1 ... Podemos comprobar (v´ase la Figura 11.8), que la curva se adapta a la forma que mare can los puntos. Sin embargo, unicamente podemos garantizar que esta curva pasar´ por ´ a el primer y ultimo punto ya que S(0) = x0 y S(1) = xn pero en general S(t) = xj para ´ j = 0, n. 1 1 0.8 0.8 0.6 0.6 0.4 0.4 0.2 0.2 0 0 0.2 0.4 0.6 0.8 0 1 1 0.8 1 0 0.2 0.4 0.6 0.8 1 0.4 0.2 0.6 0.6 0.4 0.4 0.8 0.6 0.2 1 0.8 0 0.2 0 0 0.2 0.4 0.6 0.8 0 1 Figura 11.8: Curvas B´zier para algunas configuraciones de puntos. e 260
  • 266. ´ LECCION V Cap´ ıtulo 11. Interpolaci´n. Curvas B´zier o e Ejercicio 11.16 Utilizando el c´digo mostrado en el Ejercicio 11.15, programa las curvas o B´zier. Compara con las curvas que definen la interpolaci´n por splines y la polin´mica. e o o r do rra Bo Ejercicio 11.17 Implementa la siguiente extensi´n del programa anterior: permitir que el o usuario seleccione puntos y pueda moverlos o borrarlos (por ejemplo, con el bot´n derecho del o rat´n) y as´ comprobar la sensibilidad de la curva al pol´ o ı ıgono de control. Una sugerencia: una vez le´ los puntos, y dibujada la correspondiente curva nos situamos ıdos de nuevo en la ventana gr´fica con ginput y leemos la selecci´n hecha por el rat´n. Ahora a o o hay tres opciones Si pulsamos cerca de un punto, entendemos que hemos seleccionado dicho punto. • Si se ha pulsado con el bot´n derecho lo eliminamos del dibujo, redibujamos la o curva y esperamos de nuevo. • Si pulsamos cerca de un punto con el bot´n izquierdo entendemos que vamos a o mover ese punto. Esperamos otra selecci´n del rat´n (otro ginput), reemplazamos o o el punto seleccionado por el nuevo y redibujamos. Si pulsamos lejos de todos los puntos, entendemos que a˜adimos un nuevo punto. n Llam´moslo y. En este punto hay un tema no trivial: c´mo ordenamos el nuevo punto e o y respecto a los puntos anteriores {xj }. y xj θj x j+1 x j+2 Figura 11.9: Ordenaci´n de nodos para la curva B´zier. o e Una forma de determinar15 este orden es medir el ´ngulo entre los vectores a − u = −j y, x→ − v = −j+1 y x− → y quedarse con aqu´l para el que ´ngulo θj sea mayor (v´ase la Figura 11.9). Para ello, e a e basta utilizar que |u · v| | cos(θj )| = . u v 15 Gracias a Jon Garc´ por sugerirnos esta soluci´n. ıa o 261
  • 267. ´ LECCION V 11.3 Curvas B´zier e Escogeremos entonces j para que | cos(θj )| sea m´ ınimo, y construiremos la curva B´zier e con puntos {x1 , . . . , xj , y, xj+1 , . . . , xn } {xj , xj+1 }. r do rra Bo Nota. Las curvas B´zier fueron introducidas por los ingenieros Pierre B´zier y Paul e e de Casteljau, que trabajaban entonces en Renault y Citr¨en. Concretamente, buscaban o herramientas para el dise˜o de parachoques de forma que la curva que diera su forma n fuera controlada por una serie de puntos y que tuviera buenas propiedades geom´trice as. Los algoritmos iniciales (todav´ se utilizan en la pr´ctica hoy en d´ segu´ ideas ıa a ıa) ıan o u a muy geom´tricas16 , y se tard´ alg´n tiempo en darle la forma que hemos mostrado, m´s e matem´tica. Como resultado de este estudio surgieron las curvas B-spline, que reemplaza aban a los polinomios de Bernstein por splines de grados adecuados. Las curvas B-spline son m´s flexibles que las curvas B´zier y en su caso l´ a e ımite incluyen a ´stas. Por lo tanto e pueden interpretarse como una generalizaci´n de las mismas. o Por otro lado existen formas mucho m´s eficientes de evaluar y calcular este tipo de a curvas que permiten en ultima media su implementaci´n en una forma m´s interactiva, ´ o a de forma que el usuario mueva los puntos (cambie el pol´ ıgono de control) y que la curva se redibuje constantemente. 16 La versi´n original ni siquiera hablaba de polinomios. o 262
  • 268. r do rra Bo Bibliograf´ ıa [1] Atkinson, K. (1993): Elementary Numerical Analysis. Wiley. [2] Burden, R.L. y Faires, J.D. (1998): An´lisis Num´rico. International THOMSON. a e [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´ de Jal´n, J. (2004): Aprenda Matlab 6.5 como si estuviera en primero. ıa o Publicaci´n electr´nica, disponible en o o http://mat21.etsii.upm.es/ayudainf/aprendainf/varios.htm [8] Gander, W. y Hˇeb´cek, J. (2004): Solving problems in Scientific Computing using r ıˇ Maple 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 century” en J. Comput. Appl. Math. 123 (2000), 35–65. [11] Greenbaum, A. (1997): Iterative Methods for Linear Systems. SIAM. [12] H¨nmerlin, G. y Hoffmann, K.H. (1991): Numerical Mathematics. Springer–Verlag. a [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): M´todos num´ricos. Teor´ problemas y pr´cticas e e ıa, a con Matlab. Anaya. [17] Kharab, A. y Guenther, R.B. (2001): An Introduction to Numerical Methods: A MATLAB Approach. Chapman & Hall. [18] Kincaid, D. y Cheney, W. (1994): An´lisis num´rico. Las matem´ticas del c´lculo a e a a cient´ ıfico. Addison–Wesley Iberoamericana.
  • 269. [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/. r do rra Bo [21] Marchand, P. y Holland, T.O. (2003): Graphics and GUIs with Matlab, tercera edici´n. Chapman & Hall/CRC. o [22] Maron, M.J. (1987): Numerical Analysis. A practical approach. Macmillan. [23] Mathews, J.H. y Fink, K.(2000): M´todos Num´ricos con Matlab. Prentice Hall. e e [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 the 20th century” en J. Comput. Appl. Math., 123, 1-33 (2000). [32] Stewart, G.W. (1996): Afternotes in Numerical Analysis. SIAM. [33] Stewart, G.W. (2001):Matrix Algorithms: Vol. I. Basic decompositions. SIAM. [34] S¨li, E. y Mayers, D. (2003): An Introduction to Numerical Analysis. Cambridge u University Press. 264
  • 270. r do rra Bo ´ Indice de figuras 2.1. 2.2. 2.3. 2.4. Pantalla Principal. Pantalla de ayuda. Ayuda con helpwin Ayuda on line. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1. Diagrama de un matriz sparse . . . . . . . . . . . . . . . . . . . . . . . . 64 5.1. 5.2. 5.3. 5.4. 5.5. Resultado de reordenar las filas y columnas con symrcm y symmmd. Eliminaci´n gaussiana y su representaci´n como un grafo. . . . . . o o Historial del residuo para el m´todo del Gradiente. . . . . . . . . . e Historial del residuo para el m´todo del Gradiente Conjugado . . . e Efecto del en el Gradiente Conjugado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 75 93 98 103 7.1. 7.2. 7.3. 7.4. 7.5. 7.6. 7.7. 7.8. 7.9. Reglas de cuadratura: punto medio y trapecio Regla de Simpson . . . . . . . . . . . . . . . . Diagrama del m´todo de Romberg . . . . . . . e Integraci´n adaptativa . . . . . . . . . . . . . o √ Integraci´n adaptativa de x . . . . . . . . . o Primeras exponenciales trigonom´tricas. . . . . e Coeficientes de Fourier y transformada discreta Ruido y su Transformada de Fourier Discreta . Filtrado del ruido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 119 128 130 133 136 143 144 145 9.1. 9.2. Profile aplicado al m´todo de Jacobi. . . . . . . . . . . . . . . . . . . . 184 e Una web muy sencilla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 10.1. 10.2. 10.3. 10.4. 10.5. 10.6. 10.7. 10.8. 10.9. 10.10. 10.11. Ventana gr´fica. . . . . . . . . . . . . . . . . . . a Ventana gr´fica. . . . . . . . . . . . . . . . . . . a Edici´n de un dibujo. . . . . . . . . . . . . . . . o Una muestra de dibujos. . . . . . . . . . . . . . Modificaci´n del entorno del dibujo. . . . . . . . o Ejemplo de numeraci´n con subplot. . . . . . . o Disposici´n simult´nea de gr´ficas con subplot. o a a Un dibujo en 3D con plot3. . . . . . . . . . . . Icono para rotar los dibujos. . . . . . . . . . . . Ejemplo de una superficie creada con surf. . . . Otro ejemplo de surf. . . . . . . . . . . . . . . 265 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . de Fourier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 15 16 17 208 210 212 214 218 219 221 222 223 224 225
  • 271. Utilizaci´n de nan en un dibujo. . . o Algunas opciones con surf. . . . . Esferas en 3D. . . . . . . . . . . . . Una superficie con surf y pcolor. . L´ ıneas de nivel . . . . . . . . . . . . Campo de velocidades con quiver . Triangulaci´n no conforme. . . . . . o Numeraci´n de tri´ngulos . . . . . . o a Un dominio mallado en tri´ngulos. . a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 228 230 231 232 233 235 236 237 11.1. 11.2. 11.3. 11.4. 11.5. 11.6. 11.7. 11.8. 11.9. Dos formas de escribir y evaluar un polinomio. . . . . . . . . . . . . . Polinomios de interpolaci´n con diferentes grados y el error cometido. o Estructura del c´lculo de las diferencias dividas. . . . . . . . . . . . . a Ejemplo de Runge. Polinomio de interpolaci´n y error cometido. . . . o Ejemplo de Runge con otros nodos. . . . . . . . . . . . . . . . . . . . Rigidez polin´mica . . . . . . . . . . . . . . . . . . . . . . . . . . . . o Interpolaci´n con splines c´bicos naturales . . . . . . . . . . . . . . . o u Curvas B´zier para algunas configuraciones de puntos. . . . . . . . . . e Ordenaci´n de nodos para la curva B´zier. . . . . . . . . . . . . . . . o e . . . . . . . . . . . . . . . . . . 240 243 246 250 251 255 258 260 261 r do rra Bo 10.12. 10.13. 10.14. 10.15. 10.16. 10.17. 10.18. 10.19. 10.20. 266
  • 272. r do rra Bo ´ Indice general 1. Introducci´n o 1.1. ¿Qu´ es? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 1.2. ¿C´mo trabaja? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 1.3. ¿C´mo aprenderemos? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 1 1 2 4 I Primeros pasos en Matlab. M´todos directos para sistemas de ecuaciones lineales e 5 2. Matlab: Primeros pasos 2.1. Entorno de trabajo . . . . . . . . . . . . . . . . . . 2.2. Comandos de ayuda . . . . . . . . . . . . . . . . . 2.3. Variables . . . . . . . . . . . . . . . . . . . . . . . . 2.4. Ficheros script y funciones . . . . . . . . . . . . . . 2.4.1. Ficheros script . . . . . . . . . . . . . . . . . 2.4.2. Funciones . . . . . . . . . . . . . . . . . . . 2.5. Vectores y matrices . . . . . . . . . . . . . . . . . . 2.5.1. Definici´n de matrices y vectores . . . . . . o 2.5.2. Operaciones . . . . . . . . . . . . . . . . . . 2.5.3. Detalles adicionales . . . . . . . . . . . . . . 2.5.4. Acceso a partes de matrices . . . . . . . . . 2.6. Bucles y estructuras de decisi´n . . . . . . . . . . . o 2.6.1. Bucles: el comando for . . . . . . . . . . . . 2.6.2. Operadores l´gicos y estructuras de decisi´n o o . . . . . . . . . . . . . . 9 9 14 16 19 19 19 22 22 24 25 27 30 30 31 . . . . . . . . 37 37 38 41 43 44 44 47 48 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. M´todos directos para sistemas de ecuaciones lineales e 3.1. M´todo de Gauss . . . . . . . . . . . . . . . . . . . . . . e 3.1.1. M´todo de Gauss sin pivotaje . . . . . . . . . . . e 3.1.2. M´todo de Gauss con pivotaje parcial . . . . . . . e 3.1.3. M´todo de Gauss con pivotaje parcial ficticio . . e 3.2. Descomposiciones matriciales . . . . . . . . . . . . . . . 3.2.1. Descomposici´n LU . . . . . . . . . . . . . . . . . o 3.2.2. Casos particulares . . . . . . . . . . . . . . . . . . 3.2.3. Comandos correspondientes en Matlab . . . . . . 267 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  • 273. II Programaci´n Avanzada. M´todos iterativos o e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 55 55 60 64 66 iterativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 71 76 77 78 79 88 . . . . . r do rra Bo 4. Matlab: programaci´n avanzada o 4.1. Retorno a las matrices . . . . . . . . . . . . . . . . 4.1.1. Acceso a partes estructuradas de una matriz 4.1.2. M´s operaciones sobre matrices . . . . . . . a 4.1.3. Matrices sparse . . . . . . . . . . . . . . . . 4.2. Argumentos de funciones . . . . . . . . . . . . . . . 51 5. Matrices sparse en Matematicas. Metodos 5.1. M´todo de Gauss para matrices sparse . . e 5.2. M´todos iterativos para sistemas lineales . e 5.2.1. Definici´n . . . . . . . . . . . . . . o 5.2.2. Detalles sobre la implementaci´n . o 5.2.3. M´todos iterativos cl´sicos . . . . . e a 5.2.4. M´todos de tipo gradiente . . . . . e III Funciones como argumento. Recursividad F´rmulas de cuadratura. FFT o 6. Matlab: Funciones como argumentos. 6.1. Funciones inline . . . . . . . . . . . 6.2. Funciones como argumentos . . . . . 6.2.1. Recursividad . . . . . . . . . 105 Recursividad 109 . . . . . . . . . . . . . . . . . . . . . 109 . . . . . . . . . . . . . . . . . . . . . 111 . . . . . . . . . . . . . . . . . . . . . 112 7. F´rmulas de cuadratura. FFT o 7.1. F´rmulas de cuadratura . . . . . . . . . . . . . . . . . o 7.1.1. Primeras nociones . . . . . . . . . . . . . . . . . 7.1.2. Reglas simples . . . . . . . . . . . . . . . . . . . 7.1.3. Retorno a las reglas compuestas . . . . . . . . . 7.1.4. Reglas gaussianas . . . . . . . . . . . . . . . . . 7.1.5. Extrapolaci´n de Richardson . . . . . . . . . . . o 7.1.6. Integraci´n adaptativa . . . . . . . . . . . . . . o 7.2. Transformada r´pida de Fourier . . . . . . . . . . . . . a 7.2.1. Transformada de Fourier discreta . . . . . . . . 7.2.2. C´lculo de la transformada de Fourier Discreta . a 7.2.3. Aplicaciones a la eliminaci´n de ruido . . . . . . o 7.2.4. Transformada r´pida de Fourier . . . . . . . . . a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 115 115 118 122 125 126 129 134 135 140 142 144 IV C´lculo simb´lico, arrays y celdas en Matlab. Valores y a o vectores propios. Google. 153 8. Matlab: C´lculo simb´lico y estructuras de datos. a o 157 8.1. Polinomios y c´lculo simb´lico . . . . . . . . . . . . . . . . . . . . . . . . . 157 a o 8.1.1. Polinomios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 268
  • 274. 8.2. Procesador simb´lico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 o 8.3. Tensores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 8.4. Vectores de celdas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 171 173 174 174 178 179 179 183 185 186 192 193 195 196 196 r do rra Bo 9. C´lculo num´rico de valores y vectores propios. a e 9.1. Introducci´n . . . . . . . . . . . . . . . . . . . . . o 9.2. Matrices semejantes . . . . . . . . . . . . . . . . . 9.3. M´todo de potencias . . . . . . . . . . . . . . . . e 9.3.1. Descripci´n del m´todo . . . . . . . . . . . o e 9.3.2. Variantes del m´todo de potencias . . . . . e 9.4. M´todo de Jacobi . . . . . . . . . . . . . . . . . . e 9.4.1. Descripci´n del m´todo . . . . . . . . . . . o e 9.4.2. Variantes del m´todo de Jacobi . . . . . . e 9.5. M´todo QR de Francis . . . . . . . . . . . . . . . e 9.5.1. Factorizaci´n QR . . . . . . . . . . . . . . o 9.5.2. M´todo QR de Francis . . . . . . . . . . . e 9.5.3. Comentarios adicionales . . . . . . . . . . 9.6. Valores y vectores propios en Matlab . . . . . . . 9.7. Notas hist´ricas . . . . . . . . . . . . . . . . . . . o 9.8. Google . . . . . . . . . . . . . . . . . . . . . . . . V Salidas gr´ficas en Matlab. Interpolaci´n a o 10.Matlab: Salidas gr´ficas en Matlab a 10.1. Dibujos bidimensionales . . . . . . 10.1.1. El comando plot . . . . . . 10.1.2. Comandos asociados a plot 10.1.3. Comandos get y set . . . . 10.1.4. El comando subplot . . . . 10.1.5. Otras salidas gr´ficas . . . . a 10.2. Gr´ficas en 3D . . . . . . . . . . . a 10.2.1. El comando plot3 . . . . . 10.2.2. El comando surf . . . . . . 10.2.3. Otros comandos . . . . . . . 10.2.4. Comandos f´ciles de usar . a 10.3. Campos vectoriales . . . . . . . . . 10.4. Dibujos sobre dominios mallados en . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tri´ngulos a 203 . . . . . . . . . . . . . 11.Interpolaci´n. Curvas B´zier o e 11.1. Interpolaci´n polin´mica . . . . . . . . . . . . . o o 11.1.1. Interpolaci´n polin´mica de Lagrange . . o o 11.1.2. Existencia del polinomio de interpolaci´n o 11.1.3. F´rmula de Newton . . . . . . . . . . . . o 11.1.4. An´lisis del error de interpolaci´n . . . . a o 11.2. Extensiones adicionales . . . . . . . . . . . . . . 11.2.1. Interpolaci´n de Hermite . . . . . . . . . o 269 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 207 207 213 215 219 220 221 221 223 231 233 233 234 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 . 239 . 239 . 240 . 242 . 249 . 252 . 252
  • 275. 11.2.2. Interpolaci´n de funciones peri´dicas . . . . . . . . . . . . . . . . . 254 o o 11.2.3. Interpolaci´n polin´mica a trozos . . . . . . . . . . . . . . . . . . . 255 o o 11.3. Curvas B´zier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 e r do rra Bo 270
  • 276. ´ Indice de comandos de Matlab r do rra Bo [], 30 %, 10 |, 32 &, 32 ’, 57 .’, 58 ./, 24 /, 24 <, 32 <=, 32 ==, 32 >, 32 >=, 32 @, 110 , 24 ., 24 ~=, 32 : def. de vectores, 27 selecci´n de submatrices, 28 o 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
  • 277. 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 r do rra Bo else, 33 elseif, 34 end con for, 30 con if, 33 con while, 35 en arrays, 35 eps, 20 exp, 15 expand, 161 eye, 26 ezcontour, 231 ezcontourf, 231 ezmesh, 231 ezmeshc, 231 ezplot, 218 ezplot3, 231 ezpolar, 218 ezsurf, 231 ezsurfc, 231 factor, 161 factorial, 111 feval, 109 fft, 147 figure, 207 fill, 218 fontangle, 212 fontname, 212 fontsize, 212 fontweight, 212 for, 30 format, 12 fourier, 160 full, 65 function, 20 gca, 215 gcf, 215 get, 213 ginput, 256 grid, 211 gtext, 257 help, 14 helpwin, 14 hess, 193 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
  • 278. nargin, 66 nargout, 66 nnz, 65 norm, 62 num2str, 149 roots, 157 rotate, 212 r do rra Bo 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 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 273
  • 279. r do rra Bo svd, 194 switch, 35 symamd, 72 symmmd, 70 symrcm, 70 symsum, 160 tan, 15 tanh, 15 taylor, 160 text, 211 tic, 183 title, 211 toc, 183 tril, 55 trimesh, 236 triplequad, 132 trisurf, 236 triu, 55 varargin, 66 varargout, 66 vectorize, 108 view, 223 vpa, 160 waterfall, 230 while, 35 whitebg, 211 who, 17 whos, 17 xlabel, 211 xlim, 211 ylabel, 211 ylim, 211 zeros, 23, 26 zlabel, 220 zlim, 220 274