CursoMEtodosNumericos Matlab[1]

Embed Size (px)

Citation preview

Introduccin informal a Matlab y Octavehttp://iimyo.forja.rediris.es/18 de mayo de 2008 Guillem Borrell i Nogueras

2Este documento est publicado segn la siguiente licencia:

GNU Free Documentation LicenseCopyright c 2005-2008 GUILLEM BORRELL I NOGUERAS. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled GNU Free Documentation License.

sfxX WUVEVRETWIEQTPTEQMatlab R y MathWorks R son nombres registrados por MathWorks Revisin 48 Pendientes de ampliacin las secciones marcadas con (+)

A Typeset by L T X E Escrito en Kubuntu GNU/Linux y Gentoo GNU/Linux. No ha sido necesaria ninguna herramienta comercial para preparar este texto, sirva como demostracin que el software no por ser ms caro debe ser mejor. Este es un proyecto de documentacin libre. La fuente del documento junto con el cdigo necesario para generarlo se encuentra en Guillem Borrell Introduccin Informal a Matlab y Octave

httpXGGiimyoFforjFredirisFes. Este libro parte del proyecto original de httpXGGtorrojFdmtFupmFesGguillemGlogG.

NDICE GENERAL

I Introduccin y elementos del lenguaje Matlab1. Introduccin1.1. 1.2. 1.3. 1.4. 1.5. Lenguajes interpretados o de scripting El entorno de desarrollo Matlab. 1.4.1. 1.5.1. 1.5.2. 1.5.3. 1.6. 1.6.1. 1.6.2. 1.6.3. 1.6.4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un lenguaje de scripting cientco, Matlab. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

151717 17 18 21 21 21 23 23 24 24 24 25 25 25

Octave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . El entorno de desarrollo Octave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . El ciclo de desarrollo clsico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rapid Application Development o RAD . . . . . . . . . . . . . . . . . . . . . . . . . . Otros lenguajes orientados a RAD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Errores tpicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Los proyectos de software y los lenguajes de programacin . . . . . . . . . . . . . . . . . . . .

Una visin contempornea del desarrollo de aplicaciones de simulacin . . . . . . . . . . . . . Cul es entonces el espacio de Matlab? . . . . . . . . . . . . . . . . . . . . . . . . . . Y el espacio de Octave? Los lenguajes pegamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2. MATLAB2.1. 2.2. El lenguaje y las bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Convenciones 2.2.1. 2.2.2. 2.3. 2.4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operaciones elementales con Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . Algunas palabras clave y atajos de teclado.

2727 28 28 29 29 30 30 30 31 31 32 32 32 35 35 36 36 37 37 37 37 39 40

La Ayuda(I) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de archivos en Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4.1. 2.4.2. 2.4.3. 2.4.4. 2.4.5. Funciones(I) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nuestra primera funcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nuestro primer script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Una gran diferencia entre Matlab y Octave

2.5.

Argumento 2.5.1. 2.5.2. 2.5.3. 2.5.4. 2.5.5. 2.5.6.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de argumentos matriciales . . . . . . . . . . . . . . . . . . . . . . . . . Contadores no enteros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.1.1. 2.5.2.1. Secuencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Submatrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nmeros Complejos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cadenas de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Argumentos lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores aritmticos

2.6.

Operadores 2.6.1. 2.6.2.

Operadores de comparacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

42.6.3. 2.6.4. 2.7. 2.7.1. 2.7.2. 2.7.3.

NDICE GENERALOperadores lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores de comparacin por bits en enteros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Acceso a las variables: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funciones dedicadas a variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.7.3.1. 2.7.3.2. 2.7.3.3. 2.8. 2.8.1. 2.8.2. 2.8.3. 2.8.4. 2.8.5. 2.8.6. 2.9. 2.9.1. 2.9.2. 2.9.3. 2.9.4. 2.9.5. Estructuras de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 40 41 41 43 43 44 44 46 47 47 48 49 50 51 51 51 52 52 52 53 54 55 56 57 57 58 59 59 60 60 60 61 62 62 63 63 63 63 64

Variables

Cell Arrays.

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

La necesidad de los cell arrays y los tipos derivados

Sentencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

if . . . . . . . . . . swith. . . . . . . . Las sentencias for y while . . . 2.8.3.1. Mal uso de while . . . La sentencia doEuntil . . . . . . Las sentencias rek y ontinue La sentencia try . . . . . . . . .La sentencia La sentencia Funciones matemticas bsicas La Ayuda(II) Argumentos de entrada y salida.

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

Funciones (II) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

inline2.9.5.1. 2.9.5.2. 2.9.5.3.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funciones annimas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funciones como argumentos de funciones. . . . . . . . . . . . . . . . . . . . . Acceso a las variables desde las funciones annimas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Function handles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.9.6. 2.9.7. 2.9.8. 2.9.9.

Funciones recursivas

Encapsulado de funciones

Sobrecarga de funciones.(Octave) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Herramientas tiles para la manipulacin de funciones. . . . . . . . . . . . . . . . . . .

2.10. Entrada/Salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.10.1. E/S bsica por pantalla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.10.2. E/S bsica con archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.11. Anlisis crtico del lenguaje Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.11.1. Parntesis y corchetes. Tuples y celdas . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.11.2. La notacin del punto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.11.3. Versatilidad o por qu preero el intrprete Octave.

2.11.4. La orientacin a objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.11.5. Mdulos y funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.11.6. Matlab 2 y otros lenguajes de programacin . . . . . . . . . . . . . . . . . . . . . . . .

II La biblioteca de funciones3. Matrices y lgebra lineal3.1. 3.2. 3.3. Rutinas de creacin de matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1. 3.2.1. 3.3.1. 3.3.2. 3.3.3. 3.3.4. Tipos de argumentos matriciales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creacin directa de matrices de dimensin mayor que 2. . . . . . . . . . . . . . . . . . Matrices cuadradas regulares. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mtodos directos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mtodos iterativos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Matrices sparse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.4.1. 3.3.4.2. 3.3.4.3. 3.3.4.4. 3.3.5. Anlisis de matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Almacenamiento de matrices sparse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creacin de matrices sparse . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manipulacin y operaciones con matrices sparse Rutinas de manipulacin de forma. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sistemas de ecuaciones lineales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

656767 68 69 70 71 73 73 74 74 74 74 76 76 77

Matrices tridiagonales (Octave) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

NDICE GENERAL3.3.6. Matrices no regulares. 3.3.6.1. 3.3.6.2. 3.4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

577 77 78 78

Singular Value Decomposition (SVD)

Problemas con defecto o exceso de ecuaciones.

Autovalores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4. Grcos4.1. 4.2. 4.3. 4.4. 4.5.

pigure, hold y suplot. . . . itle, xlel, ylel, legend

79. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . y

text.

79 80 82 84 84 84 84 85 85

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

Dibujo de curvas en el plano. Grcas tridimensionales. 4.5.1. 4.5.2. 4.5.3.

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

Grcas estadsticas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un error bastante comn. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La funcin que tenemos que utilizar Las funciones que no tenemos que utilizar . . . . . . . . . . . . . . . . . . . . . . . . .

4.6.

Las funciones

get

y

set

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

5. Clculo y Anlisis.5.1. 5.2. 5.3. 5.4. 5.5. Funciones elementales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Polinomios Derivadas Integrales 5.4.1. 5.5.1. 5.5.2. 5.5.3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8787 87 88 88 89 89 90 91 92 92 93 94 96 96 97 97

Integracin en dos dimensiones. Diferencias entre Matlab y Octave . . . . . . . . . . . Octave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Matlab 5.5.3.1. 5.5.3.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Integracin del problema no sti (vdpI) . . . . . . . . . . . . . . . . . . . . . Solucin de la ecuacin de Van der Pol . . . . . . . . . . . . . . . . . . . . . . . . . . . Integracin del problema sti (vdpIHHH) . . . . . . . . . . . . . . . . . . . . .

Ecuaciones diferenciales ordinarias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5.5.4. 5.6. 5.6.1. 5.6.2. 5.6.3.

Inestabilidades y caos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Denicin de variables y funciones simblicas . . . . . . . . . . . . . . . . . . . . . . . Funciones simblicas elementales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operaciones simblicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Clculo simblico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6. Toolkits6.1. Estadstica descriptiva y anlisis de datos 6.1.1. 6.2. 6.1.1.1. 6.2.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ajuste de curvas por mnimos cuadrados. Qu calcula el ajuste polinmico por mnimos cuadrados?

9999 99 . . . . . . . . . . 100

Interpolacin y aproximacin de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Interpolacin polinmica a trozos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 6.2.1.1. 6.2.1.2. 6.2.2. 6.2.3. Splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 . . . . . . . . . . . . . . 102 Regeneracin de funciones mediante datos discretos

Transformadas rpidas de Fourier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Aproximacin de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 . . . . . . . . . . . . . . . . . . . . . . . 106 . . . . . . . . . . . . . . . . 107

6.3.

Resolucin de ecuaciones no lineales y optimizacin. 6.3.1. 6.3.2. 6.3.3. 6.3.4. 6.3.1.1. 6.3.2.1.

Resolucin de ecuaciones no lineales. Root nding. . . . . . . . . . . . . . . . . . . . . 106 Ms incompatibilidades entre Matlab y Octave. Bsqueda de soluciones de sistemas de ecuaciones no lineales. . . . . . . . . . . . . . . 108 Algunas de las cosas que pueden salir mal . . . . . . . . . . . . . . . . . . . . 108 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 Minimizacin de funciones.(+) Minimizacin de funcionales.(+)

7. Temas avanzados7.1. 7.1.1. 7.1.1.1. 7.1.1.2. 7.1.2. 7.1.3.

111El truco ms importante de la programacin en Matlab . . . . . . . . . . . . 112 Por qu son tan lentos los bucles? . . . . . . . . . . . . . . . . . . . . . . . . 112 . . . . . . . . . . . . . . 113 . . . . . 113

Aumentar la calidad del cdigo escrito en Matlab . . . . . . . . . . . . . . . . . . . . . . . . . 111 Vectorizar, la clave para aumentar la velocidad . . . . . . . . . . . . . . . . . . . . . . 111

Control de las variables de entrada y salida en funciones.(+)

Comunicacin entre el entorno de ejecucin global y el entorno de la funcin

Introduccin informal a Matlab y Octave

67.2. 7.3. 7.4. 7.5. Array Masking

NDICE GENERAL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 . . . . . . . . . . . . . . . . . . . . . . . . . . 117

Introduccin al debbugging 7.4.1. 7.5.1. 7.5.2. 7.5.3.

Optimizacin de la evaluacin de funciones.(+) OCTS (Octave Control Theory Suite)

Polinomios de Chebyshev. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 La representacin del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 Diagramas de Bloques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 7.5.2.1. 7.5.3.1. Ejemplo de aplicacin. Un sistema realimentado simple . . . . . . . . . . . . 124 Anlisis en frecuencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

Ejemplo de anlisis en frecuencia . . . . . . . . . . . . . . . . . . . . . . . . . 127

7.6.

Anlisis Numrico de Ecuaciones en Derivadas Parciales . . . . . . . . . . . . . . . . . . . . . 127 7.6.1. Resolucin de la ecuacin del calor con simetra axial por volmenes nitos en un cilindro. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

8. Extender Octave con otros lenguajes.8.1. 8.2. 8.3. Extender Octave con C++ 8.2.1. 8.3.1. 8.3.2. 8.3.3. 8.3.4. 8.3.5. 8.4. 8.5.

131

Una advertencia antes de empezar a programar. . . . . . . . . . . . . . . . . . . . . . . . . . . 131 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 . . . . . . . . . . . . . . . . . . . . . . . . . 136 Llamar funciones desde C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Por qu Fortran? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

Extender Octave con Fortran

La difcil comunicacin entre C y Fortran

Llamar una funcin de C desde Fortran o la manera ms difcil de sumar 2+2 . . . . . 138 Punteros y arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 Escritura de wrappers para funciones en Fortran. . . . . . . . . . . . . . . . . . . . . . 139 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

Extender C++ con Octave MEX (+) 8.5.1. 8.5.2. 8.5.3. El tipo mxArray

Un ejemplo que simplemente funciona. . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 Paso de argumentos

III Ejercicios9. Ejercicios resueltos9.1. 9.1.1. 9.1.2. 9.2. 9.2.1. 9.2.2. 9.3. 9.3.1. 9.3.2. Gua para la resolucin del ejercicio

147149. . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

Ejercicio. Clculo de un gradiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Solucin del ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Gua para la resolucin del ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

Ejercicio. Diseo de una tobera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Solucin del ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Gua para la resolucin del Ejercicio 9.3.2.1. 9.3.2.2. 9.3.2.3. 9.3.2.4. 9.3.2.5. 9.3.2.6. Octave

Ejercicio. El atractor de Lorentz

Solucin del ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 Octave no sti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 Octave y C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Octave y C++ no sti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Octave, C++ y Fortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

9.4.

Ejercicio. Clculo de una integral doble 9.4.1. 9.4.2.

Gua para la resolucin del ejercicio

Solucin del ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Gua para la resolucin del ejercicio 9.5.2.1. 9.5.2.2. 9.5.2.3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

9.5.

Ejercicio. Resolucin de la ecuacin de Laplace en un dominio bidimensional . . . . . . . . . . 155 9.5.1. 9.5.2. Solucin del ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 Mejorar la solucin. Clculo de tiempos. . . . . . . . . . . . . . . . . . . . . . 158 Resolucin del problema mediante matrices sparse(+) . . . . . . . . . . . . . 159 Resolucin del problema con un mtodo iterativo. . . . . . . . . . . . . . . . 159

9.6.

Ejercicio. Un problema de calor unidimensional . . . . . . . . . . . . . . . . . . . . . . . . . . 160

NDICE GENERAL9.6.1. 9.6.2. 9.6.3. 9.6.4. 9.7. 9.7.1. 9.7.2. Gua para la resolucin del ejercicio Solucin del ejercicio (Octave) Solucin del ejercicio (Matlab)

7. . . . . . . . . . . . . . . . . . . . . . . . . . . . 161

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 . . . . . . . . . . . . . . . . . . . . . . . . . . 162

Comprobacin de la evolucin temporal Introduccin Algoritmo. 9.7.2.1. 9.7.2.2. 9.7.2.3. 9.7.2.4. 9.7.2.5.

Ejercicio. Mtodos espectrales.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163

Operador Operador

c . xx

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

Los operadores

x6 y x2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

El operador Residuo.

Sistema de ecuaciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 Convergencia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

9.7.3. 9.7.4.

Anlisis de los resultados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 9.7.3.1. Anlisis crtico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

10.Ejercicios propuestos

171

10.1. Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 10.2. Programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 10.3. lgebra lineal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 10.4. Clculo y Ecuaciones Diferenciales Ordinarias. . . . . . . . . . . . . . . . . . . . . . . . . . . 174 10.5. Estadstica y anlisis de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 10.6. Control automtico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175

IV ApndicesA. Gua de estilo. Los 10 mandamientos A B. Pequea introduccin a TEX y L TEXB.1. Tabla con algunos caracteres T X. E

177179 183 185 187 187. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

C. Software y formatos libres. D. GNU Free Documentation License GNU Free Documentation License1. APPLICABILITY AND DEFINITIONS 2. VERBATIM COPYING 4. MODIFICATIONS 3. COPYING IN QUANTITY 5. COMBINING DOCUMENTS

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 . . . . . . . . . . . . . . . . . . . . . . . . 190

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

6. COLLECTIONS OF DOCUMENTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 7. AGGREGATION WITH INDEPENDENT WORKS 8. TRANSLATION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 9. TERMINATION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 10. FUTURE REVISIONS OF THIS LICENSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 ADDENDUM: How to use this License for your documents . . . . . . . . . . . . . . . . . . . . . . 191

Introduccin informal a Matlab y Octave

8

NDICE GENERAL

NDICE DE FIGURAS

1.1. 1.2. 1.3. 1.4. 1.5. 2.1. 2.2. 2.3. 2.4. 2.5. 3.1. 4.1. 4.2. 4.3. 4.4. 4.5. 4.6. 4.7. 5.1. 5.2. 5.3. 5.4. 6.1. 6.2. 6.3. 6.4. 6.5. 7.1. 7.2. 7.3. 7.4. 9.1. 9.2. 9.3. 9.4.

Esta es una consola Linux, mucho ms til que el Command Prompt de Windows Ventana principal de Matlab El editor de Matlab

. . . . . .

18 19 20 20 22 29 32 42 42 43 76 80 81 82 82 83 85 85 93 94 95 95

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

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

Navegador de ayuda de Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Emacs editando un archivo matlab, uno en C++ y debugeando simultneamente. . . . . . . . Tab completion en Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comparacin del desarrollo de Taylor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comportamiento normal de una variable llamada por una funcin

Comportamiento de una variable global denida en el programa principal

Propiedades de una variable persistente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elementos no nulos de una matriz sparse creada con Ejemplo de uso de

sprnd

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

suplot text

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

Insercin de nombres en las guras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Insercin de caracteres griegos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo de uso de Estilos de lnea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Curvas de nivel del resultado de la funcin

peks.

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

Introduccin de curvas de nivel personalizadas. Solucin de la ecuacin de Van der Pol con Solucin de la ecuacin de Van der Pol con Solucin del dipolo de Rikitake Curva solucin del dipolo de Rikitake

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

=1 . . = 1000

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

Ajuste por mnimos cuadrados de una serie de puntos Demostracin del fenmeno de Runge

. . . . . . . . . . . . . . . . . . . . . . 100

Comparacin de los mtodos de interpolacin . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Uso de los nodos ptimos de Chebyshev para reducir el error de interpolacin . . . . . . . . . 105 Representacin de las funciones a resolver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Diagrama de bloques del sistema ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

Diagrama de bloques resuelto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 Diagrama de Nyquist del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 Grca bode del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 Resultado del script Resultado del script Supercie solucin Supercie solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

9

109.5. 9.6. 9.7. Patrn de elementos no nulos de la matriz del sistema Evolucin del perl de temperaturas

NDICE DE FIGURAS. . . . . . . . . . . . . . . . . . . . . . 159

Figura solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163

Unas palabras

Los libros envejecen como el tema del que tratan. Si un libro habla sobre la vida, el amor, o poltica probablemente mantenga su vigencia durante siglos. Por desgracia el software es un mundo en constante cambio y este libro empezaba a notar el paso del tiempo de forma peligrosa. Octave ha cambiado; tambin lo ha hecho Matlab, sin duda para mejorar. Era consciente de este peligro mientras lo escriba pero an ms durante el ao y medio en el que no he hecho ningn cambio por falta de tiempo e inters. Las circunstancias que me llevaron a tomarme el tiempo necesario para sentarme a escribir han pasado; vuelvo a ser el to siempre ocupado con mil cosas distintas en la cabeza. No puedo vivir sin algn desafo intelecutal, no por instinto de superacin sino por puro entretenimiento. Mi profesin es la Ingeniera Aeronutica y Octave me mantuvo ocupado cuando me vi obligado a aparcarla durante un tiempo. He vuelto a mi carrera, he encontrado otras preocupaciones y Octave ha sido el primer damnicado. Es por este motivo que he decidido liberarlo con la esperanza que a su alrededor se forme una pequea comunidad entusiasta. No tiene ningn sentido que siga en mis manos donde no tiene futuro alguno. Seguro que en algn lado hay alguien que puede dedicarle el tiempo del que ahora carezco. No tengo la sensacin de haber completado el texto. Obviando las erratas y los posibles errores no he ni mucho menos terminado el que creo que es el captulo ms importante: el uso de Octave en aplicaciones multilenguaje. Tampoco he podido dedicarle el tiempo necesario a describir las funciones de representacin grca, estadstica y matrices sparse. Adems creo que el libro requiere un giro en su planteamiento. Muchas de las explicaciones matemticas son prescindibles porque este no es un libro de texto ni pretende ensear Clculo Numrico. Lo abandono con la sensacin de dejar mucho por hacer pero tambin con la satisfaccin del trabajo bien hecho. No me gustara terminar sin dar mi agradecimiento a todos los que me han demostrado su apoyo en una etapa bastante difcil de mi vida. A mis compaeros de departamento Oscar, Mark, Juan Carlos, Miguel, Sergio, lvaro, Leo, Isabel, Samuel, Jorge, Mario y Yoshi. A Javier Jimnez por conar en m sin darle motivos para ello, a Rafa por darme trabajo y a Vassilis por aguantarme. A Juanjo por invitarme a la Universidad de La Rioja, a la Delegacin de Alumnos de Aeronuticos por su conanza y a Nico (en paz descanse) por ser el nico profesor de mi escuela en felicitarme por el libro. Tampoco quiero olvidarme de Pedro, Virginia, Jose, Miguel, Juan Pedro y Alberto; compaeros a los que aprecio tantsimo. Por ltimo y los ms importantes: mis padres, mi abuela, mi hermana y Jaime; ojal mi sobrina Sara pueda leer este libro y pueda sentirse orgullosa del trabajo que un da su to empez.

Guillem Borrell i Nogueras Madrid, 10 de Noviembre de 2007

11

12

NDICE DE FIGURAS

Prlogo de la primera edicin

Hay muchos libros de Matlab, algunos muy buenos, pero en ninguno es tratado como un lenguaje de programacin. El enfoque habitual es pensar en Matlab como programa, como un entorno de desarrollo completo. No se habla nunca del intrprete Octave ni a las ventajas y defectos respecto a otros lenguajes de programacin. No son libros, son manuales. Creo que es muy importante aplicar el sentido crtico a cualquier herramienta y todo lo editado hasta a hora no es de gran ayuda. Octave es un programa magnco, lo he usado durante aos. No llega a la magnitud de Matlab pero debe ser tenido en cuenta. Estos apuntes empezaron como material adicional mal escrito para un curso de seis horas; con tiempo y dedicacin han crecido hasta lo que son ahora. Escribir sobre un lenguaje de programacin es largo, difcil y laborioso; nunca sabes si el lector va entender los conceptos que plasmas sobre el papel. Esto requiere el esfuerzo extra de reducir las ideas a lo ms bsico. Es una experiencia graticante, sobre todo cuando uno mismo tiene que reformular conceptos que ya crea asimilados. Uno aprende a escribir, a explicarse y a tener paciencia. Es un curso informal, pretende ser cercano y ameno incluso cuando se tratan conceptos complejos o abstractos. Este libro es libre y abierto; quera que fuera as desde un principio. Todo el que quiera participar en l puede hacerlo sin ninguna restriccin. Su nica nalidad es ayudar a los dems. Espero que quien lo sostenga en sus manos aprecie esta pequea muestra de altruismo y decida colaborar; estar siempre abierto a sugerencias y correcciones. Incluso si alguien propone una reescritura o la inclusin de un captulo no tengo ningn reparo en otorgarle la coautora.

Guillem Borrell i Nogueras Calella, 13 de Agosto de 2005

13

14

NDICE DE FIGURAS

Parte I

Introduccin y elementos del lenguaje Matlab

15

CAPTULO 1Introduccin1.1. Lenguajes interpretados o de scriptingUn script o guin es una serie de rdenes que se pasan a un intrprete para que las ejecute. No cumplen la denicin de programa porque no son ejecutables por ellos mismos. Un programa se comunica directamente sistema operativo. En este proceso de comunicacin el programa no es el script, el archivo de cdigo, sino el intrprete que lee lnea por lnea el cdigo y que no ejecuta la siguiente orden hasta que no ha terminado con la anterior. Esta es la diferencia entre los lenguajes basados en cdigo fuente de los lenguajes de scripting. Los primeros son C, C++, Fortran, Ada, Cobol, Pascal... El cdigo fuente escrito es transformado por un compilador en un archivo ejecutable binario que slo es capaz de entender el ordenador. Los lenguajes de scripting ms conocidos son, en el caso de los lenguajes de uso general, Java, Python y Ruby. La popularidad de Java se debe a su naturaleza de producto comercial muy sencillo de administrar mientras que Python y Ruby son Software Libre; de igual o ms calidad pero sin publicidad. Python es un lenguaje basado en la consistencia que ofrece una gran productividad y versatilidad. Ruby es uno de los lenguajes ms recientes, su popularidad est aumentando gracias a la aplicacin Ruby on Rails orientada al desarrollo de pginas web. Existe una gran variedad en los lenguajes de scripting orientado a matemticas. Matlab, Maple, Mathematica, Scilab, Octave, Euler, O-Matrix, R o S son lenguajes de scripting. Los ms conocidos son Matlab, Mathematica y Maple. No debemos considerar Matlab como nicamente un producto. El scripting cientco es una gran herramienta que hay que dominar independientemente del programa. Una vez hayamos aprendido a usar Matlab es posible que se tengamos que aprender a utilizar R, orientado a anlisis de datos, o Scilab si trabajamos en Francia. con el sistema operativo mientras que un script lo hace con un intrprete que a su vez enva comandos al

1.2. Un lenguaje de scripting cientco, Matlab.Un lenguaje interpretado se parece a una herramienta que todos conocemos perfectamente, una calculadora. Es incomprensible como alguien se siente completamente cmodo delante de una cajita con una pantalla y muchas teclas y en cambio le invade el miedo delante de una consola como la de la gura 1.1: Si hacemos el esfuerzo de abstraccin y simplicamos la ventana anterior nos queda el smbolo de entrada:

bbQu hacemos a parte de quedarnos paralizados? Pues si esto es una calculadora vamos a usarlo como una calculadora:

bb PCP ns a R17

18

1.3. EL ENTORNO DE DESARROLLO MATLAB.

Figura 1.1: Esta es una consola Linux, mucho ms til que el Command Prompt de Windows

Este ejemplo no sirve para nada pero resume perfectamente el uso de Matlab. En el fondo es una calculadora programable con unas posibilidades casi innitas. Si a esto se suma un lenguaje intuitivo y una gran biblioteca de funciones el resultado es una herramienta verdaderamente til para ingenieros y cientcos. Esta manera de trabajar no es un invento de Matlab, los lenguajes interpretados ya existan mucho antes. Lo que s es novedoso es basar la arquitectura del lenguaje en conceptos matemticos; entre ellos uno muy importante: la funcin. Mientras los lenguajes clsicos se basan en subrutinas o objetos Matlab dispone de una biblioteca formada exclusivamente por funciones. Este diseo tan simple es lo que ha llevado Matlab a su xito, es un acercamiento matemtico a la programacin orientada a matemticas. Si queremos calcular el seno de

2 lo que haremos ser llamar a la funcin como se hara sobre el papel:

bb sin@piGPA ns a IEntonces nada impide usar el mismo concepto para resolver problemas mucho ms complejos:

bb qud@d@xA esselj@PFSDxADHDRFSA ns a IFIIUVAcabamos de hacer la siguiente integral de la funcin real de Bessel de primera especie:

4,5

J2,5 (x)dx0

quddetalles.

y

esselj

son funciones que se han compuesto del mismo modo que se compondran funciones

matemticas. Esta lnea de cdigo puede ser incomprensible pero al nal la entenderemos con todos los

1.3. El entorno de desarrollo Matlab.Matlab como programa no se limita a un intrprete en una consola, es un entorno de desarrollo al completo. Al iniciar Matlab nos aparecer la ventana principal con la consola, el navegador de variables y el historial de comandos (gura 1.2) . Evidentemente lo ms importante es la consola; todo lo dems, aunque til, es prescindible. La ventana principal no es ms que la consola con algunas herramientas adicionales. Para completar un entorno de desarrollo son necesarios dos elementos ms: un editor y un navegador de ayuda. El primero aparece cuando editamos un archivo

1

Fm

desde el gestor de archivos o cuando creamos uno nuevo desde la

1 En

Unix Matlab puede funcionar tambin desde el intrprete de comandos mediante la funcin

-nojvm.

Es una opcin

interesante cunando no hemos instalado ninguna mquina virtual de Java

CAPTULO 1. INTRODUCCIN

19

Figura 1.2: Ventana principal de Matlab

ventana principal. Su funcin es facilitar la creacin de archivos de cdigo Matlab y para ello cuenta con Syntax Highlighting, tabulado automtico, soporte grco para debugging...

Introduccin informal a Matlab y Octave

20

1.3. EL ENTORNO DE DESARROLLO MATLAB.

Figura 1.3: El editor de Matlab

Es muy importante llegar a dominar todas las posibilidades del editor. Cuanto mejor lo conozcamos ms fcilmente y rpidamente programaremos. Finalmente el navegador de ayuda. Adems de ser el mejor sitio donde buscar ayuda puntual sus tutoras nos servirn para perfeccionar nuestra habilidad con el lenguaje y el entorno. Podemos acceder a l desde el men relp o mediante el icono con el smbolo interrogante en la barra de herramientas.

Figura 1.4: Navegador de ayuda de Matlab

CAPTULO 1. INTRODUCCIN

21

1.4. OctaveOctave es tambin un lenuaje de scripting cientco. Aunque su nacimiento nada tiene que ver con Matlab ha ido convergiendo hacia la compatibilidad. Octave fue pensado como aplicacin para la consola UNIX. No tiene interfaz grca propia, navegador de ayuda, visor de variables, editor, debugger... Se puede decir que no tiene nada de nada. Es un intrprete muy estable, ligero y orientado a programadores ms experimentados. Octave es Software Libre soportado por una comunidad de desarrolladores sin nimo de lucro. Es un proyecto en colaboracin cuyos miembros nos prestarn ayuda cuando la solicitemos. Sus listas de correo son pblicas y son una gran fuente de informacin. Formar parte del desarrollo de Octave es la mejor manera de conocer Matlab en profundidad. El lenguaje Octave es un poco ms potente y mejor diseado, si no nos importa sacricar la compatibilidad tendremos un poco ms de libertad programando. Como parte del proyecto GNU su integracin en un entorno GNU/Linux es excelente; es por ello que se comunica perfectamente con otros lenguajes de programacin. Puede ser una buena excusa para perfeccionar o utilizar nuestros conocimientos de C++ o para profundizar en UNIX. Tampoco es verdad que Octave sea tan minimista. Existen esfuerzos para dotar a Octave de ms y ms herramientas fuera del paquete ocial. El ms relevante es sin duda Octave-forge. Cualquiera que eche de menos una funcin en Octave puede escribirla y mandarla al proyecto; si lo creen conveniente la incorporarn en la prxima versin de la coleccin. Adems Octave-forge es un gran directorio de cdigo escrito. Puede servirnos para aprender como escribir una funcin como es debido o como implementar algoritmos especialmente complejos. La calidad de las funciones es variable pero la media es muy alta. Otro proyecto interesante Octave Workshop de Sbastien Loisel. Se trata de una interfaz grca a la Matlab para Octave, orientada sobre todo hacia usuarios de Windows. Es un proyecto muy joven pero prometedor; desde el principio ha apostado por una solucin integrada. Llena un vaco muy importante, de otro modo la curva de aprendizaje se alarga por la necesidad de aprender a utilizar herramientas de UNIX en un entorno Windows.

1.4.1. El entorno de desarrollo OctaveCuando hemos hablado del entorno de desarrollo de Matlab han aparecido tres ingredientes bsicos: la consola, el editor y el naveador de ayuda. Como aplicacin para la consola UNIX debemos conar en las herramientas propias del sistema: un editor polivalente como emacs o vim, pginas de ayuda en formato info... Aunque todas las piezas de este entorno existen en Windows carecen de la misma integracin con el sistema operativo. En este caso optaremos por un entorno de desarrollo integrado como Octave Workshop. El editor que mejor se complementa con Octave es Emacs (gura 1.5), parte esencial del proyecto GNU. Emacs cuenta con un plugin para adecuarlo a la edicin de archivos este ltimo muy adecuado para los usuarios de Windows. El programa ms utilizado para dar soporte grco a Octave es GNUPlot. Sus funcionalidades no son comparables a las ofrecidas por Matlab pero son sucientes. Desde hace bastante tiempo se busca un sustituto pero an no ha aparecido ningn candidato adecuado. Probablemente nuestra instalacin de Octave incorpore GnuPlot, si no es as tendremos que instalarlo puesto que es un requerimiento casi indispensable. Sobre el navegador de ayuda es muy conveniente obtener el directorio de Octave-forge. Es un documento HTML comprimido que cualquier navegador puede mostrar. No se acerca a las posibilidades de la ayuda de Matlab pero es una buena herramienta de consulta. En compensacin, la ayuda interactiva de las funciones de Octave suele ser de mayor calidad gracias al uso del formato texinfo.

Fm

y la comunicacin con el intrprete

Octave. Si no nos sentimos cmodos con l siempre podemos optar por otros editores como VIM o SciTe,

1.5. Los proyectos de software y los lenguajes de programacinCuando afrontamos un proyecto de sofware, sea del tipo que sea, la primera consideracin que se hace es la eleccin de la herramienta de trabajo. En este caso un lenguaje de programacin. Actualmente existen un centenar de ellos y la eleccin no es sencilla. Cules son los criterios principales? Que todos los miembros del proyecto dominen o conozcan el lenguaje. El acceso a todas las herramientas necesarias. El tiempo total de desarrollo del proyecto.

Introduccin informal a Matlab y Octave

22

1.5. LOS PROYECTOS DE SOFTWARE Y LOS LENGUAJES DE PROGRAMACIN

Figura 1.5: Emacs editando un archivo matlab, uno en C++ y debugeando simultneamente.

La calidad del resultado nal. La relacin esfuerzo resultado.

Aunque estas condiciones parecen obvias no siempre han sido las mismas. Durante las dcadas de los 70 y 80 programar se consideraba una tarea laboriosa y complicada en la que no deba ahorrarse horas de trabajo. Que un ingeniero pasara miles de horas sentado delante de un ordenador no se consideraba tiempo malgastado. Exista la creencia de que ninguna tecnologa era capaz de competir con la pericia y que cualquier aumento en el rendimiento compensaba con creces el tiempo dedicado. Durante los 90 aparecieron multitud de herramientas orientadas a aumentar la productividad y con ellas un cambio esencial de losofa. El criterio era mucho ms pragmtico: todo cuenta. Debemos valorar el tiempo total de desarrollo, la calidad del cdigo escrito, la portabilidad del programa... Ya no era slo el programador y su programa, se haba convertido en una pieza dentro de una gran maquinaria fuera consciente de ello o no. La aparicin de los lenguajes interpretados acentu an ms esta concepcin. Tareas que antes llevaban das podan hacerse en horas y cada vez se haca menos necesario un conocimiento preciso de informtica para programar.

CAPTULO 1. INTRODUCCIN

23

El criterio esencial pas de ser la calidad del resultado nal a ser la relacin esfuerzo por resultado. Los lenguajes interpretados suelen mejorar dicha relacin gracias a simplicar la metodologa de trabajo. Hemos hablado de la distincin entre lenguajes de cdigo fuente o compilados y los lenguajes interpretados pero no hemos tratado sus diferencias en el uso. Un lenguaje interpretado elimina la necesidad del ciclo escritura-compilado-debugging.

1.5.1. El ciclo de desarrollo clsicoTodas las herramientas de desarrollo de sofware en general intentan paliar los problemas derivados de este ciclo. Cuando programamos con un lenguaje compilado como C o Fortran nos vemos obligados a convertir el cdigo fuente en un programa, ejecutar el programa, analizar el resultado y, en el caso que sea necesario, realizar un debugging. El debugging es el proceso de depuracin en tiempo de ejecucin. Un programa compilado se ejecuta entero y escupe un resultado nal; si no es el esperado y el cdigo parece correcto nos veremos obligados a analizar los resultados intermedios. Cmo puede hacerse eso en un ejecutable que parece un bloque monoltico? Introduciendo pausas en la ejecucin llamadas breakpoints que paran el hilo para comprobar los resultados intermedios. Este ciclo es rentable slo en el caso de grandes aplicaciones muy integradas con las libreras o que requieren una mxima optimizacin. Qu sucede si nuestra aplicacin busca simple y llanamente un resultado despus de un tiempo de desarrollo lo ms corto posible? Entonces sacricaremos los lenguajes de programacin clsicos en favor de los lenguajes interpretados

1.5.2. Rapid Application Development o RADLa ventaja de los lenguajes interpretados respecto a los compilados es evidente, uno de los pasos del ciclo de desarrollo, la compilacin, desaparece y el debugging es trivial. Esta diferencia que puede parecer irrisoria suele condicionar enteramente el proceso. Los lenguajes de scripting nacieron como una manera sencilla de hacer tareas complejas o repetitivas. Por ejemplo, tenemos en un directorio cualquiera medio centenar de archivos de los que no conocemos el nombre. Nuestro objetivo es aadir al nal de todos los que contengan la combinacin de letras abc el smbolo de python en el sistema lo conseguiremos con:

.

Realizar manualmente esta tarea puede requerir unos cuantos minutos pero si disponemos de un intrprete

bbb import os bbb for file in osFlistdir@9F9AX FFF if fileFfind@99A ba HX FFF osFsystem@9mv 7s 7s7s9 7@fileDfileD99AAParece fcil. Verdad? Si para los administradores de sistemas conocer un lenguaje interpretado de propsito general es as de til Por qu no iba a serlo para un ingeniero? Cuntas lneas de cdigo seran necesarias para programar lo mismo en C o Fortran? Los ordenadores incrementan exponencialmente su potencia y cada ao los lenguajes interpretados son ms y mas competitivos; ahora se usan para casi cualquier aplicacin y han obligado a todo el mundo a cambiar su punto de vista. Los lenguajes interpretados se utilizaban nicamente cuando se quera una interaccin directa con el usuario, una manera de extender las capacidades de un programa que estaba escrito en un lenguaje compilado. Ahora podemos utilizar lenguajes interpretados para aplicaciones de alto coste computacional y pasaremos a un programa puramente compilado slo en caso de necesidad. Las aplicaciones de simulacin suelen ser programas no muy largos que pueden o no solicitar una optimizacin mxima. En cualquiera de los dos casos se utilizar un lenguaje interpretado porque nuestro objetivo es el RAD o Rapid Application Development. En programas cortos porque es el nico modo de acortar el tiempo de desarrollo y en los largos para la fase de prototipado. Para que un lenguaje interpretado pueda ser utilizado como una herramienta de RAD debe cumplir los siguientes requisitos: 1. Debe ser lo sucientemente polivalente como no necesitar acudir a otros lenguajes de programacin durante del proceso de diseo. 2. Debe poner a nuestra disposicin sucientes herramientas como para que no sea necesario buscar. 3. Debe formar parte de un entorno de desarrollo cmodo y verstil y sencillo.

Introduccin informal a Matlab y Octave

24 1.6. UNA VISIN CONTEMPORNEA DEL DESARROLLO DE APLICACIONES DE SIMULACIN4. Su sintaxis debe ser clara para que el cdigo sea leble. En la mayora de los casos los cdigos se reciclan y mutan en el tiempo. Si cada vez que cambia de manos requiere ser ledo cinco o seis veces para saber qu est haciendo es cualquier cosa menos rpido. Matlab cumple sobradamente todos estos requisitos. El lenguaje es sencillo, cmodo y leble; las bibliotecas de funciones son enormes y siempre que no nos salgamos del clculo numrico no tenemos que acudir a otros lenguajes de programacin.

1.5.3. Otros lenguajes orientados a RAD.Matlab tiene competencia, esperada e inesperada. La esperada viene de programas comerciales como Mathematica o Scilab. Adems Mathematica concepto un concepto interesante conocido como Notebook, ya introducido por Maple, para potenciar las sesiones interactivas. Lo que probablemente no esperaban los desarrolladores de Matlab es que la competencia les llegara por parte de los lenguajes interpretados de propsito general. Si nos obligamos a mantener el sentido crtico aplicado a las herramientas debemos tener en cuenta lenguajes como Python o Ruby, sobre todo Python gracias al proyecto SciPy. De momento son opciones poco consolidadas pero puede que en un futuro sean una referencia en el desarrollo de aplicaciones de simulacin.

1.6. Una visin contempornea del desarrollo de aplicaciones de simulacinEs muy comn que un ingeniero o un cientco tenga que programar a menudo. El desarrollo de aplicaciones de software est ligado a la necesidad de simular un sistema de cualquier tipo. En la mayora de los casos los programadores son ingenieros, matemticos o fsicos sin una formacin terica en lenguajes de programacin. La mayora de ellos son autodidactas sin conocimientos especcos sobre metodologa y prctica de la programacin. En muchos casos se construyen programas decientes con herramientas inadecuadas y del peor modo posible. No se usan bien los editores, los debuggers brillan por su ausencia, no se aplican las metodologas orientadas a la programacin sin errores... La raz de estos problemas es que el jefe del proyecto es el primero en desconocer el entorno ideal. Casi siempre existen carencias en el diseo de la aplicacin y en la eleccin de las herramientas. Cuntos ingenieros han odo hablar del UML ? Y de la refactorizacin? Cuntas aplicaciones de simulacin estn escritas con un lenguaje orientado a objetos? Y en un lenguaje interpretado? Los ingenieros somos tan

2

soberbios como todoterrenos. Somos tan capaces de arreglar cualquier cosa como incapaces de reconocer que un mejor diseo nos ahorrara muchos quebraderos de cabeza. En programas que requieren desarrollos dehoras o de das el coste de empezar de cero por culpa de un mal diseo no es ningn problema; medida que los tiempos de desarrollo crece las situacin se vuelve ms y ms crtica.

1.6.1. Errores tpicosEl ingeniero tipo escribe un cdigo lamentable, ilegible. Si en la construccin del ala de un avin no se puede hacer una chapuza... Por qu puede serlo el cdigo del programa que simula su inestabilidad? Porque funciona? Otra consideracin fundamental es que si queremos producir una pieza especialmente complicada construiremos antes un prototipo para saber si cumple con los requisitos funcionales. Si aplicramos los mismos principios al desarrollo de simulaciones sera intolerable ponerse a escribir en Fortran ms de 2000 lneas de cdigo sin haber probado antes el algoritmo en Matlab. Esta prctica es tan poco comn en la empresa como en el mbito cientco. Otro error es el de subestimar el tiempo de desarrollo. Un programa de simulacin decente, con requerimientos computacionales medios o grandes, puede desarrollarse en uno o dos aos. Lo que suele hacerse es tomar un lenguaje lo ms rpido posible para minimizar el tiempo de clculo. Los lenguajes rpidos son principalmente dos, C y Fortran. Normalmente se trabaja sin diseo, sin prototipos... Los errores incomprensibles pueden alargar la aparicin del primer ejecutable en un 50 % del tiempo del proyecto, mucho ms que lo que ahorraramos en el tiempo de ejecucin. Quizs la peor prctica de todas es la de no documentar el cdigo a medida que se escribe. Un cdigo sin documentacin o uno sin una documentacin adecuada puede ser un inerno hasta para uno mismo.

2 UML

son las siglas del Universal Modelling Language. Es un

estndar

para la creacin de diagramas que modelan la

estructura de cualquier cosa, aunque fueron pensados para sistemas altamente lgicos como los programas de ordenador.

CAPTULO 1. INTRODUCCIN

25

Si leemos cdigo escrito por nosotros mismos un ao antes es como si lo hubiera escrito alguien que no conocemos de nada. Esto sucede de verdad! Os lo digo por mi propia experiencia. Los comentarios son muy tiles, hay que comentar cualquier estructura que no tenga una lgica aplastante y escribir cdigo obvio no es tan fcil como parece.

1.6.2. Cul es entonces el espacio de Matlab?Matlab es absolutamente superior en aplicaciones cortas y sencillas. Reduce la longitud del cdigo y el tiempo de desarrollo signicativamente adems de ser un lenguaje leble, escalable herramientas necesarias estn dentro de la misma aplicacin y la documentacin est embebida en el propio programa . Es una opcin interesante en el proceso de diseo (cuando existe) y es esencial en el proceso de anlisis de datos, mucho menos exigente computacionalmente. La mayora de los programas que escribe un ingeniero son cortos, y requieren casi siempre las mismas herramientas matemticas (lgebra lineal, representacin de funciones, integracin numrica...). Se busca efectividad, rapidez y pocos errores. Matlab es el lenguaje de programacin y la aplicacin que mejor encaja en todos estos requisitos en lo que a ingeniera se reere.

3 y sencillo. Todas las

4

1.6.3. Y el espacio de Octave?Octave ha ido lentamente acortando las diferencias con Matlab. Hace unos aos no era ms que una sencilla aplicacin para la consola en Linux. Ahora, en su versin 3, es una aplicacin multiplataforma con una enorme biblioteca capaz de competir directamente con Matlab en aspectos puramente tcnicos. Octave sigue siendo una alternativa a Matlab, pero una alternativa cada da ms seria. Octave se usa activamente en los siguentes entornos: En universidades de pequeo y medio tamao, donde no se puede asumir el coste de las licencias de Matlab para todos los estudiantes de una aula de informtica para las clases de clculo numrico. Es importante recordar que Octave naci en un entorno acadmico como herramienta de apoyo a los alumnos. En empresas, tambin peuqeas y medianas, donde el coste de las licencias tampoco es asumible. En este caso existe una tercera alternativa: la piratera. Octave tendra un impacto mucho mayor en este sector si pudiera darse a conocer de algn modo. Octave sigue siendo una herramienta de uso personal para quien preere utilizar GNU/Linux. En algunos casos por sencillez, en otros por una tendencia a utilizar herramientas libres. Octave ha mejorado y sigue mejorando aunque este libro no sea capaz de reejar sus cambios.

1.6.4. Los lenguajes pegamentoOtra caracterstica de los lenguajes interpretados es que ellos mismos estn construidos sobre lenguajes compilados. Matlab, por ejemplo, est escrito casi enteramente en C, mientras que Octave lo est en C++. Esto signica que pueden integrarse perfectamente con sus lenguajes padre. Es de sobra sabido que los lenguajes interpretados son entre uno y dos rdenes de magnitud ms lentos que los compilados. La solucin es acoplarles rutinas escritas en algunos lenguajes compilados como C, C++ o Fortran para conseguir un aumento signicativo de velocidad. Matlab empez como una coleccin de subrutinas en Fortran que se acoplaban a un intrprete interactivo. Si este proceso se realiza sistemticamente durante el desarrollo se dice que el lenguaje interpretado sirve de pegamento entre las unidades de programa. Se puede decir que se buscan las ventajas de los dos planteamientos, nos acercamos a la velocidad del cdigo enteramente compilado mientras mantenemos la Matlab es capaz de convertir cdigo en C o Fortran en archivos tipo mex y Octave cuenta con el programa mkotfile (seccin 8) que realiza una labor parecida. Lenguajes ms polivalentes como Python, Ruby o Perl cuentan con mejores herramientas. versatilidad de un script.

3 Se dice que un lenguaje es escalable cuando todas sus virtudes se mantienen independientemente de la longitud del programa.Matlab es escalable pero hasta un lmite; en aplicaciones especialmente grandes empiezan los problemas de uso de memoria y de acumulacin de archivos de funcin. Los lenguajes compilados son tpicamente escalables y algunos lenguajes interpretados como java y python tambin escalan perfectamente.

4 La

ayuda de Matlab es un ejemplo de cmo se debe documentar una coleccin de funciones.

Introduccin informal a Matlab y Octave

26 1.6. UNA VISIN CONTEMPORNEA DEL DESARROLLO DE APLICACIONES DE SIMULACIN

CAPTULO 2MATLAB2.1. El lenguaje y las bibliotecasAntes de entrar en materia es importante que sepamos qu diferencias hay entre las sentencias de un lenguaje de programacin y la biblioteca de funciones. Las sentencias son las palabras clave independientes. Esto signica que si las eliminaremos del lenguaje no podramos sustituirlas con ninguna combinacin del resto de sentencias del lenguaje. Esta denicin no es estricta; algunas palabras clave comunes se consideran sentencias cuando se hace un uso muy frecuente de ellas. El total de sentencias y de reglas de escritura son lo que forman el lenguaje de programacin descrito en un documento llamado referencia. Como Matlab es un programa comercial no existe tal documento. El resto de funciones y subrutinas son parte de la biblioteca. Son palabras clave que cumplen una tarea y no pueden ser consideradas sentencias porque estn escritas con ellas. Algunas funciones de uso muy frecuente llegan a ser parte del mismo lenguaje, el grupo que forman se llama biblioteca estndar . El conjunto de sentencias y biblioteca estndar se conoce como especicaciones y en el caso que el lenguaje tome vida propia, es decir, sus especicaciones pasen a ser pblicas; se llama estndar. Estos documentos existen para la mayora de los lenguajes de programacin conocidos: C, C++, Ada, Fortran, Python... Matlab no es uno de ellos. Al ser un lenguaje sujeto a una herramienta Matlab es Matlab y punto; sin embargo podemos aplicar estas deniciones estrictas para acercarnos a l como lo haramos con el resto de lenguajes. La organizacin interna de Octave sigue este criterio. Se podra decir que Octave es el conjunto de sentencias mas la biblioteca estndar y que el resto de colecciones de funciones (y hay bastantes) son los toolkits. La Compatibilidad entre los dos se sita slo en las sentencias aunque se extiende en gran manera con la biblioteca de funciones. Por lo menos las funciones bsicas son compatibles, casi idnticas. Matlab tiene muy pocas sentencias. Como lenguaje es muy sencillo aunque cada versin incluye nuevas especicaciones. En los ltimos aos se ha aadido la extensin para programacin orientada a objetos y el diseo de interfaces grcas. Octave es ligeramente distinto en su concepcin; es ms minimista y cuenta con muchas menos funciones pero es ms fcilmente extensible. Son las diferencias tpicas entre los productos libres y los comerciales. Este captulo es la referencia del lenguaje; en l veremos argumentos, variables, operadores y sentencias que nos servirn para programar funciones y scripts as como la arquitectura general del programa. Es con diferencia la parte ms importante del libro y no se ha dividido en varios captulos para no romper el hilo conceptual.

Siempre que se hable exclusivamente de Matlab nos referiremos a las caractersticas comunes de Matlab y Octave. Cuando la palabra Matlab se utilice en una diferencia respecto a Octave nos estaremos reriendo al programa comercial. Por sencillez no se ha diferenciado tipogrcamente la palabra Matlab en los dos contextos.

27

28

2.2. CONVENCIONES

2.2. ConvencionesA partir de ahora escribiremos un comando escrito en la consola de la siguiente manera:

bb 7isto es un omentrio puesto en l onsol de wtlEscribiremos todas las palabras clave con letra de formato jo como esta funcin:

sin@xA.

Veremos que la sintaxis de Matlab no es muy distinta de la de cualquier otro lenguaje; las diferencias sern las de siempre, los smbolos de continuacin, los comentarios... Aunque sea un poco temprano los listamos a continuacin:

99 7 5

Comillas simples. Sirven para introducir texto literal, todo lo que se encuentre en este entorno ser tomado como texto y no como el nombre de una variable Comillas dobles. Smbolo de carcter tambin soportado en Octave.

Porcentaje. Es el smbolo del comentario. Todo lo que est por detrs de este smbolo en una lnea es ignorado por el intrprete. Almohadilla. Smbolo del comentario slo soportado por Octave. Es muy til cuando se quieren aadir comentarios en la cabecera de una funcin sin que el parser

1 lo tome como parte de la ayuda.

FFF Y

Tres puntos. Al aadir alguno de estos dos smbolos al nal de una lnea signica que se tomar la posterior como continuacin

Barra invertida. El smbolo de continuacin de C, C++ y Python tambin est soportado en Octave. Punto y coma. Smbolo de retorno de carro. Sirve para concatenar ms de una sentencia en la misma lnea y para inhibir la salida por consola del resultado.

Importante:

El punto y coma al nal de una sentencia explicita el retorno de carro e inhibe que salga el

resultado por pantalla.

2.2.1. Operaciones elementales con MatlabLas convenciones para las operaciones en Matlab son idnticas que en cualquier otro lenguaje de programacin o que en una calculadora programable. El orden de asociacin de las operaciones es tambin el mismo. Primero se operan las funciones matemticas elementales (senos, cosenos, logaritmos...), las multiplicaciones y divisiones y luego sumas y restas. Por ejemplo, para realizar la siguiente operacin:

2 0,11/2introduciremos enla consola:

1

0,4 21/3

bb IG@@PGHFI @IGPAAE@HFRGP @IGQAAAEvidentemente Matlab no distingue entre elementos numricos y variables, la ecuacin:

b cd

a

e gf

bb G@GdEeGgfALos parntesis sirven para variar el orden normal de las operaciones a realizar.

1 Todos los lenguajes interpretados procesan el cdigo con una herramienta llamada parser. El parser lee cada lnea y distinguelas palabras clave, las variables y los argumentos para que el intrprete pueda hacer su trabajo sin problemas.

CAPTULO 2. MATLAB

29

2.2.2. Algunas palabras clave y atajos de teclado.La consola es un entorno de trabajo ms potente de lo que parece gracias a una serie de atajos de teclado de gran utilidad. Uno de los ms potentes es la capacidad de auto-completar alguna palabra clave con la tecla de tabular, tab completion en ingls. Por ejemplo, si nos encontramos en el intrprete Octave y nos acordamos cmo se escribe exactamente la funcin para trasponer una matriz podemos hacer lo siguiente, escribimos slo el inicio de la palabra y luego presionamos la tecla de tabular:

bb tr`efb tre trnspose

trpz

Esta es una caracterstica comn de casi todas las consolas existentes, ya sea una consola de UNIX o el Command Prompt de Windows. La consola grca de Matlab es un poco ms potente gracias a su interfaz (gura 2.1):

Figura 2.1: Tab completion en Matlab A continuacin una lista de palabras clave y atajos de teclado que pueden hacernos la vida mucho ms fcil:

exit

Cierra el intrprete, equivalente a cerrar la ventana. Corta la ejecucin del comando actual (kill)

`gvbE

Reescribe lneas anteriores. A medida que presionemos este carcter aparecern en la lnea actual todos los comandos escritos anteriormente. Una vez estemos viendo los comandos podemos movernos entre ellos mediante los cursores.

`gvbC`Db l

Hace avanzar o retroceder el cursor por palabras en vez de por caracteres.

Limpia la pantalla del intrprete de comandos

2.3. La Ayuda(I)La manera ms fcil de acceder a la ayuda tanto en Matlab como en Octave es mediante la consola y el comando

help.

Cada comando y funcin lleva consigo la informacin necesaria para que conozcamos su uso

y sus funcionalidades . Para acceder a la ayuda de una funcin teclearemos

2

bb help

{nomre de l funin} helpsin ningn argumento

Esto signica que debemos saber cmo se llama la funcin. Si introducimos

nos aparecer una ayuda general desde donde podremos encontrar cualquiera de las funciones disponibles. Uno comando bastante til cuando trabajamos desde una consola o por red es comando con

more. Si activamos el more on activaremos el paginador de modo que cuando el texto que aparezca en pantalla se salga

de la misma interrumpir el texto hasta que nosotros le pidamos que contine. Esto evita el comportamiento tan desagradable que tienen las ayudas especialmente largas en las que siempre tenemos que utilizar la barra de desplazamiento para ver el principio. Para salir del texto sin tener que desplazarnos hasta el nal pulsaremos la tecla

`b.

2 Ms

adelante aprenderemos cmo introducir esta informacin a cualquier funcin que escribamos

Introduccin informal a Matlab y Octave

30

2.4. TIPOS DE ARCHIVOS EN MATLAB

2.4. Tipos de archivos en MatlabAl igual que el intrprete es capaz de entender comandos mediante su consola interactiva, tambin es capaz de leer archivos de cdigo o scripts. En el caso de Matlab los archivos asignados al intrprete son los que terminan con la extensin

Fm.

Pero para entender cmo estos archivos interactan con el intrprete es

necesario que entendamos la arquitectura interna de Matlab. Gran parte de la funcionalidad de Matlab se basa en su biblioteca de funciones. Una funcin en Matlab es equivalente a una funcin matemtica; es una tarea encapsulada que puede depender de una o varias variables. Matlab tiene una extenssima biblioteca de funciones, la mayora de ellas son archivos con la extensin

Fm

que lee el intrprete. Pero el intrprete no puede saber por ciencia infusa dnde se encuentran

dichas funciones. Si en la consola introducimos:

bb sin@xACmo sabe Matlab dnde se encuentra la funcin seno? La respuesta es que Matlab ya sabe en qu directorios del sistema puede encontrar archivos

Fm

desde su instalacin.

Signica esto que si creamos nuestras funciones debemos guardarlas en estos directorios? Ni mucho menos. Matlab cuenta con un directorio especial en el que tambin busca funciones; es el llamado directorio

de trabajo. Si estamos utilizando la interfaz grca de Matlab lo seleccionaremos en la barra de herramientas.Si en cambio accedemos a Matlab por consola o optamos por Octave el directorio de trabajo ser el directorio actual (en UNIX el contenido en la variable de sistema PWD). Cada vez que se invoque una funcin en Matlab buscar en los directorios habituales y en el directorio de trabajo.

2.4.1. Funciones(I)Una funcin es una unidad de programa, una tarea independiente que puede o no depender de variables externas. Las unidades de programa tpicas son las funciones, las subrutinas, las clases... Matlab basa toda su potencia y su sencillez en el constante uso de funciones. La razn es bien sencilla; si Matlab es un programa para clculo numrico es normal que la unidad de programa esencial sea la que tiene un signicado ms matemtico En Matlab se dene una funcin del siguiente modo: :

3

funtion vrilesdeslida nomre@vrilesdeentrdA gomndos que terminmos signndo ls vriles de slid {end}Por ejemplo,si queremos implementar una funcin que sume dos escalares debemos hacer lo siguiente:

funtion asum@DA aCYY lo guardaremos en un archivo que se llame igual que la funcin; en el caso del ejemplo ser Luego lo guardaremos en nuestro directorio de trabajo. El concepto de funcin va ms all pero esta descripcin es suciente para entender su papel dentro de la arquitectura de Matlab.

sumFm.

2.4.2. ScriptsLos scripts hacen la funcin de un programa completo, su hilo de sentencias tiene un principio y un nal y no necesita actuar con ninguna variable externa al cdigo. La diferencia entre un script y un archivo de cdigo fuente es que el script es una transcripcin literal de comandos de consola; se dice que es secuencial. Esto no nos permite explotar las posibilidades de los formatos libres ni utilizar secuencias de control tipo

goto4 .

Tambin tienen la extensin

Fm

y se pueden ejecutar de varios modos:

Dentro del intrprete. Si hemos guardado el archivo en alguno de los directorios de bsqueda de funciones el intrprete ejecutar toda la secuencia de comandos introducindole el nombre del script

3 El

comando

end

slo es necesario en Octave cuando queremos acoplar funciones en los scripts o ms de una funcin en un

mismo archivo. En Matlab no es necesario porque cada funcin est asociada a un nico archivo, el nal del mismo hace de textttend.

4 Mejor,

porque este tipo de estructuras no son nada aconsejables.

CAPTULO 2. MATLAB

31

bb nomredelrhivoFuera del intrprete. Dentro de una consola llamando el intrprete con el nombre de archivo como argumento. Por ejemplo, en una consola cualquiera:

6b mtl nomredelrhivoPodemos llamar a funciones en nuestros scripts siempre que sea con variables que hayamos inicializado antes de la llamada. El concepto es el mismo, no es ms que la transcripcin de los comandos que se introduciran en la consola.

2.4.3. Nuestra primera funcinEn esta primera funcin no usaremos ninguno de los elementos caractersticos de la programacin en Matlab. Estos son los que encontramos en cualquier cdigo de simulacin: contadores, funciones elementales, condicionales, casos... Empezaremos con el archivo de Taylor en 0 de la funcin seno. Para ello editamos el archivo nuevo de nombre que nos diga Matlab o Octave segn el caso y pondremos en ella lo siguiente:

prsinFm, que es la aproximacin de orden 3 del desarrollo prsinFm en el directorio

funtion outaprsin@xA outaxExQGTYVemos que asignamos a la variable

out

las operaciones que hacemos sobre la variable de entrada

x.

La

idea es mantener las caractersticas de una funcin matemtica. Una vez la hayamos guardado en el directorio de trabajo esta funcin puede ser llamada por el intrprete de Matlab o por cualquier script. Para probarlo nos vamos a la consola y tecleamos:

bb yaprsin@IFQAque debe darnos como resultado:

y a HFWQQVQAn es pronto para algunos conceptos, hay que aclarar un par de cuestiones: Las variables

x

y

out

son de uso interno de la funcin. Desde la consola o desde un script podemos

usar las variables que queramos. Esta abstraccin es comn en todos los lenguajes de programacin; la entenderemos cuando hablemos de la diferencia entre variable y argumento. El punto y coma signica lo mismo que el retorno de carro. Tenemos que recordar siempre que la diferencia entre hacer un retorno de carro y poner el punto y coma es que en el segundo caso el programa no nos da ningn output. Llenaremos siempre las funciones de puntos y comas para no recibir resultados intermedios intiles.

2.4.4. Nuestro primer scriptVamos a comparar nuestra aproximacin de la funcin seno con la funcin exacta y lo vamos a escribir en un guin. Para ello creamos el archivo

omprrFm

y escribimos lo siguiente en l:

xalinspe@EpiDCpiDIHHAY for iaIXIHH y@iAaprsin@x@iAAY end plot@xDyYsin@xAAPara ejecutarlo vamos a la consola y tecleamos:

bb omprrE inmediatamente va a aparecer la gura 2.2: An es temprano para entender exactamente qu hace el script, lo iremos viendo paso a paso; pero ha servido para ver cul es la relacin entre funciones, los scripts y Matlab.

Introduccin informal a Matlab y Octave

32

2.5. ARGUMENTO

Comparacion sin vs aprsin

2

aprsin sin

1.5

1

0.5

0

-0.5

-1

-1.5

-2 -3 -2 -1 0 1 2 3

Figura 2.2: Comparacin del desarrollo de Taylor

2.4.5. Una gran diferencia entre Matlab y OctaveMatlab no puede denir funciones directamente en el intrprete o en un script. Cualquier funcin debe ser un archivo independiente por simple que esta sea. Por ejemplo, si en Matlab escribimos:

bb funtion asum@DA ccc funtion asum@DA | irrorX puntion definitions re not permitted t the prompt or in sriptsFRecibimos un error. En cambio Octave puede denir funciones tanto en el intrprete como en un script, algo que dota a este intrprete alternativo de algo ms de versatilidad. ste es uno de los grandes puntos dbiles de Matlab. Ignoro el hecho por el que an no lo soportan. Lo que no se puede hacer ni en Matlab ni en Octave es acceder a varias funciones distintas en un mismo archivo. No es muy difcil ver por qu. El lenguaje Matlab, cuando llama a una funcin, busca por los directorios algn archivo que se llame como la funcin, y luego busca una sentencia ejecutable en l. Esto implica que cada archivo slo puede contener una cabecera . Si pensamos un poco tambin vemos que en Octave se puede usar un pequeo truco para cargar varias funciones sin necesitar una cabecera. Simplemente creamos un script cuyo nombre no coincida con ninguna de las funciones que contiene. ste archivo lo empezamos con algo que no sea la sentencia

5

funtion

y a continuacin escribimos todas las

funciones que necesitemos. Luego, en el programa principal lo llamamos con un:

bb soure@9hederFm9A

2.5. ArgumentoEl concepto preciso de argumento o valor es complejo pero a nosotros nos bastar con saber que es cualquier elemento manipulable en un cdigo. Los argumentos de un programa de simulacin numrica son los nmeros, los ndices, las matrices, las secuencias... Tenemos que hacer el esfuerzo conceptual de separar el concepto de argumento del de variable. Una variable es su contenedor, es lo que les da nombre y sirve para manipularlos. Sucede lo mismo en cualquier

5 Puede

contener ms funciones pero slo se puede llamar una. Esta es la funcin que tenga la cabecera en la primera linea

cuyo nombre coincida con el nombre del archivo. Esta funcin puede llamar a otras funciones que se pueden encontrar en el mismo archivo, pero nunca podremos acceder desde fuera a las donde se encuentran

subfunciones puesto que Matlab no tiene informacin para saber

CAPTULO 2. MATLAB

33

frmula matemtica; siempre se expresa mediante variables y toma sentido cuando stas contienen algn argumento. Matlab tiene varios tipos de valores y variables; en consecuencia ser valida cualquier combinacin entre ellos. Estos son los tipos de argumentos soportados :

6

2.5.1. MatricesMatlab no distingue entre escalares y matrices. Si se dice que Matlab es un lenguaje de clculo matricial es porque todos los nmeros son en el fondo matrices. El nmero vez sin ningn problema:

1

puede ser escalar, vector y matriz a la

bb aI a I bb @IA ns a I bb @IDIA ns a I bb @IDIDIA ns a ITampoco distingue si sus elementos son enteros o reales, todos los nmeros tienen la misma precisin en coma otante, que es doble precisin siempre que no le indiquemos lo contrario. Las entradas

bb aIHS a IHS bb aIFHSeCP a IHS bb aIHSHeEI a IHS bb aIHSF a IHSson equivalentes. Estas son las dos caractersticas ms importantes del lenguaje. Las matrices se estiran y encogen sin ninguna limitacin ni en el tamao ni en las dimensiones. Si intentamos llenar el dcimo elemento de un vector

inexistente con un 1.

bb foo@IHAaIel programa lo va a hacer sin ningn problema

foo a H H

H H

H

H

H

H H

I

y si ahora le pido

bb foo@IIDRAaPobtengo

foo a H H H H H H H H H H H H6 Los

H H H H H H

H H H H H H

H H H H H H

H H H H H H

H H H H H H

H H H H H H

H H H H H H

I H H H H Harrayque es consistente con la denicin de tensor. Esto

fsicos tericos y los matemticos encontrarn mucho ms til Python; lenguaje que probablemente desconozcan. La

extensin numrica estndar de Python, numpy, soporta el tipo

permite operar con tensores de varias dimensiones de una forma mucho ms natural. Es muy recomendable echarle un vistazo, la combinacin de Python y la coleccin de bibliotecas SciPy es una mejor opcin en el caso de aplicaciones ms complejas en las que Matlab escale mal.

Introduccin informal a Matlab y Octave

34

2.5. ARGUMENTO

H H H H H

H H H H H

H H H H H

H H H H P

H H H H H

H H H H H

H H H H H

H H H H H

H H H H H

H H H H H

Vemos que el comportamiento es un poco extrao. Si nosotros utilizamos nicamente un ndice obtenemos un vector la, mientras que en una matriz la notacin es la usual, el primer elemento es el nmero de la y el segundo el nmero de columna. Esto nos obligar a trasponer vectores ms de una vez, sobretodo para resolver sistemas lineales de ecuaciones .

7

8 e inconvenientes.

Esta caracterstica facilita la tarea de escribir los algoritmos por primera vez pero tiene grandes peligros

Importante:

Cualquier nmero es en realidad una matriz sin fronteras jas.

Las matrices se ordenan en Matlab del mismo modo que en la realidad, por las y columnas. La notacin para diferenciar si una serie de nmeros se encuentran en la misma la o en la misma columna es el siguiente: el espacio y la coma (,) separan elementos de una misma la el retorno de carro y el punto y coma (;) separan elementos de una misma columna Por ejemplo, si queremos escribir el vector la

e = (1 2 3)

lo haremos con:

bb eaIDPDQ e a I P Q bb eaI P Q e a I P QEn cambio, para escribir el mismo vector pero en forma de columna:

bb faIYPYQ f a I P Q bb faI b P b Q f a I P QEsta es exactamente la misma notacin que se sigue para introducir una matriz entera. Lo intentamos con:

1 4 77 En 8 ElOctave existe la variable

2 5 8

3 6 9prefer_column_vectors=1el vector por

prefer_column_vectors.

Activando esta variable con

defecto ser columna en vez de la emulando el comportamiento de Fortran. Sirva esto para mostrar que Octave es totalmente congurable. principal peligro de la asignacin dinmica de memoria es que nosotros no sabemos cundo usamos demasiada. Es muy importante en cdigos no usar ms memoria en ningn momento que la RAM disponible, porque en el caso que 'pisemos' fuera de la RAM, el proceso empezar a escribir sobre el disco duro y el rendimiento puede bajar hasta en dos rdenes de magnitud. El problema es que en ste caso lo hacemos sin querer y adems el programa no nos avisa. Es bueno entonces tener algn monitor del sistema que nos diga cunta memoria estamos usando en tiempo de ejecucin y si estamos pisando fuera, es decir, escribimos en el espacio 'swap'.

CAPTULO 2. MATLAB

35

bb maIDPDQYRDSDTYUDVDW m a I P Q R S T U V WAunque cualquier combinacin de las anteriores sera perfectamente vlida, por ejemplo:

bb maI P Q b R S T b U V W m a I P Q R S T U V WLa llamada simple a un elemento cualquiera de una matriz se hace indicando su la y su columna por ese orden. En el caso de la matriz

m:

bb m@PDIA ns a RAprenderemos a crear matrices de ms dimensiones en la seccin 3.2.1.

2.5.1.1. Tipos de argumentos matricialesCuando se habla del tipo de un argumento no estamos hablando slo de si es una matriz, una cadena de caracteres, un nmero complejo. El concepto en el mbito del clculo numrico va mucho ms all. Se llama tipo a la representacin que tiene un argumento en la memoria del ordenador. Cuando almacenamos un nmero podemos hacerlo en varias representaciones; coma otante de simple precisin, entero de 32 bits... Antes hemos hablado de la conguracin por defecto de Matlab que almacena todos los elementos de una matriz como reales de doble precisin (64 bits o 8 bytes). Todo lo dicho anteriormente para la representacin interna de nmeros es vlida slo por defecto. En ningn momento armamos que el nico tipo de escalar posible es el real de doble precisin. Podemos denir explcitamente nmeros ,es decir, matrices; con tipos distintos al real de doble precisin (DOUBLE). Los tipos soportados por matlab son los mismos que C excepto por el tipo long double (real de 128 bits). Esta representacin tiene una limitacin evidente; como la formulacin de los argumentos en Matlab es matricial slo podremos tener matrices de un nico tipo. No podremos construir matrices con elementos enteros y elementos reales a la vez. Esta es una limitacin comn a todos los lenguajes de programacin y viene dado por la manera en la que cualquier programa reserva (alocatea) memoria. Por ejemplo, si deseamos operar con matrices de nmeros enteros de 8 bits utilizaremos la funcin

intV

del modo siguiente:

bb xaintV@IDPYIHWPQURHIVPQHSTIVUQTSDVQFHWQVA x a I P IPU VQLlama la atencin el hecho de que el nmero 109237401823056187365 se ha convertido en el 127. Esto es debido a que el mayor entero de 8 bits que podemos almacenar es precisamente 127. Si necesitamos una aritmtica de mayor precisin entera siempre podemos hacer lo siguiente:

xaintTR@IDPYIHWPQURHIVPQHSTIVUQTSDVQFHWQVA x a I P WPPQQUPHQTVSRUUSVHU VQNi siquiera el mayor entero disponible es capaz de almacenar el nmero anterior. Podemos tener la necesidad de manipular la cantidad de memoria dedicada a cada elemento de una matriz por dos motivos

Introduccin informal a Matlab y Octave

36

2.5. ARGUMENTO1. Estamos deniendo matrices de gran tamao y tenemos la necesidad de reducir la precisin de los argumentos reales; ya sea por la necesidad de reservar memoria o por requerimientos de velocidad de clculo 2. Necesitamos operar con tipos de enteros, ya sean con signo o sin signo para realizar con ellos operaciones lgicas por bits o utilizar lgica entera.

En Octave slo es posible lo segundo porque el tipo de real es siempre el de doble precisin. Hablaremos un poco ms de los tipos de argumentos escalares en la seccin dedicada a rutinas de creacin de matrices.

2.5.2. SecuenciasSon parecidas a los vectores pero no lo son. Aparecen por todos los elementos del lenguaje, en las submatrices, en los contadores en el funcionamiento interno de muchas funciones... Siempre que necesitemos contar algo aparecern las secuencias porque una lista de nmeros que nos cuente del

es el mtodo propio Matlab para contar.hacerlo es tan fcil como:

Si queremos

1

al

10

bb seueniaIXIH seueni a I P Q Rsucesivos:

S

T

U

V

W

IH1en

Si queremos manipular el contador para que no sea de

1

podemos introducir el salto entre dos nmeros

bb seueniaIXPXIH seueni a I Q S U W

2.5.2.1. Contadores no enteros.Las secuencias soportan intervalos distintos a los nmeros enteros. Podemos introducir la secuencia:

bb HXHFSXR ns a golumns I through VX HFHHHHH HFSHHHH IFHHHHH golumn WX RFHHHHH bb HXHFSPXR ns a HFHHHHH HFSPHHH

IFSHHHH PFHHHHH PFSHHHH

QFHHHHH

QFSHHHH

Si el intervalo que introducimos no ajusta exactamente al lmite superior parar de contar sin pasarse.

IFHRHHH

IFSTHHH PFHVHHH PFTHHHH

QFIPHHH

QFTRHHH

Evidentemente este tipo particular de contadores no son adecuados para contar ndices porque genera nmeros no enteros. Su utilidad se encuentra en la discretizacin de intervalos necesaria, por ejemplo, en los ejes de coordenadas.

2.5.3. SubmatricesPara asignar partes de matrices a variables o operar dentro de una matriz con una parte de la misma es necesario asignarles una secuencia de ndices. Se puede decir que la submatriz se genera contando los ndices de la primera Para entender mejor cmo funciona este tipo de asignaciones mejor hacerlo mediante ejemplos. Iniciaremos una sesin en Matlab creando una matriz de nmeros aleatorios:

bb fooarnd@SDSA foo a HFVHVHRV HFVHRVHV HFIIRWTS HFSPRSQI HFRUTQSS HFSRRPQT HFUQTIHQ HFPQIVUT HFVHUHHP HFPRRIUP

HFVUIITT HFPIHUVW HFPSRHHW HFIISUHT HFSHUQSS

HFTHTRIP HFITQSRP HFVIVITR HFQQTQHQ HFVIRITH

HFVTUUIT HFTQWHWR HFHWIWQR HFRUVHRP HFUWPPSQ

CAPTULO 2. MATLABAhora crearemos una submatriz llamada de la tercera a la quinta.

37

r

que contendr las las de la segunda a la quinta y columnas

bb rafoo@PXSDQXSA r a HFPIHUVW HFITQSRP HFPSRHHW HFVIVITR HFIISUHT HFQQTQHQ HFSHUQSS HFVIRITH

HFTQWHWR HFHWIWQR HFRUVHRP HFUWPPSQ qweque sean, de la matriz

Pero las secuencias tienen la capacidad de contar de modos distintos, en el caso siguiente contaremos las las de 2 en 2 como muestra el siguiente ejemplo. En l crearemos una submatriz a la tercera.

foo

las las de la primera a la quinta de 2 en 2 (la primera, la tercera y la quinta) y las columnas de la primera

bb qweafoo@IXPXSDIXQA qwe a HFVHVHS HFVHRVI HFVUIIU HFRUTQS HFSRRPR HFPSRHI HFVHUHH HFPRRIU HFSHUQSSi omitimos los elementos de la secuencia y dejamos slo el smbolo los elementos de la la o de la columna. Adems de una secuencia los ndices pueden introducirse mediante vectores:

X, el resultado ser que tomaremos todos

bb qweafoo@IDPDIDPA

2.5.4. Nmeros ComplejosEn realidad deberan llamarse matrices cuyos elementos son nmeros complejos, pero se ha abreviado. Las reglas matriciales son exactamente las mismas, lo nico que cambia es el carcter individual de cada elemento. La manera de introducir un nmero complejo como argumento en una variable es el uso del nmero

i

que multiplica a la parte imaginaria.

bb numomaPCQiTambin podemos usar otros signos para expresar complejo completo. Adems del nmero racionales

i

como

j, s

o

t.

Evidentemente tambin podemos

crear vectores, matrices y tensores de nmeros complejos, y al buscar un ndice en ellos tendremos el nmero

como

pi

o

i tenemos e.

otros nmeros relevantes embebidos dentro de Matlab, como los nmeros

2.5.5. Cadenas de textoPodemos asignar a una variable una cadena de texto introducindola entre comillas simples o dobles:

bb sludoa9hol que