Sunteți pe pagina 1din 206

[Escribir el ttulo del documento]

ESCUELA SUPERIOR POLITCNICA DEL LITORAL

14 de ago.

MATLAB
Matrix Laboratory
Daniel Pacheco Borja

2011

BASADO TAMBIEN EN FUNDAMENTOS DE COMPUTACION

DANIEL PACHECO BORJA

NDICE DE CONTENIDO

FDC
FDC ____________________________________________________________________ I Historia _________________________________________________________________VI Prlogo ________________________________________________________________ VII Introduccin ___________________________________________________________ VIII  Fundamentos de programacin __________________________________________ IX CAPTULO I ______________________________________________________________ 1 I. II. III. IV. Matlab es un lenguaje de programacin___________________________________ 1 Matlab es un lenguaje interpretado ______________________________________ 3 Matlab es un lenguaje dinmico _______________________________________ 6 La interfaz grfica de Matlab __________________________________________ 8

V. La arquitectura de Matlab _____________________________________________ 14


V.I. Simulink _________________________________________________________________ 14 V.II. Octave __________________________________________________________________ 17 V.III. QtOctave _______________________________________________________________ 18

VI. VII.

Nuestro primer programa en Matlab __________________________________ 19 Nuestro primer programa en Octave ___________________________________ 20

CAPTULO II_____________________________________________________________ 22 II.I. Escalares, vectores y polinomios ________________________________________ 22


II.I.I. Scripts y sesiones interactivas ______________________________________________ 22 II.I.II. Operaciones aritmticas bsicas ____________________________________________ 23

II.II. Definicin de funciones _______________________________________________ 29


II.II.I Vectores _______________________________________________________________ 30 Pgina I de 206

MATLAB
II.II.II. Polinomios _____________________________________________________________ 37 II.II.III. Ejercicio de sntesis _____________________________________________________ 44

II.III. Matrices y lgebra Lineal _____________________________________________ 49 II.IV. Rutinas de creacin de matrices _______________________________________ 53
II.IV.I. Operaciones con matrices ________________________________________________ 56 II.IV.II. Multiplicacin matricial _________________________________________________ 57 II.IV.III. Divisin matricial ______________________________________________________ 59 II.IV.IV. Potencia de matrices ___________________________________________________ 63 II.IV.V. Traspuesta y conjugada _________________________________________________ 63

II.V. Control de Flujo de Ejecucin __________________________________________ 65


II.V.I. Iteradores______________________________________________________________ 65 II.V.II. Condicionales __________________________________________________________ 67

II.VI. Representacin Grfica ______________________________________________ 69


II.VI.I. Curvas en el plano ______________________________________________________ 69 II.VI.II. Figura activa___________________________________________________________ 72 II.VI.III. Etiquetas _____________________________________________________________ 73 II.VI.IV. Otros comandos _______________________________________________________ 78 II.VI.V. Plot handles _______________________________________________________ 80 Subplots____________________________________________________________________ 86

II.VII. Representacin de datos en el plano ___________________________________ 87


II.VII.I. Ejercicio de sntesis _____________________________________________________ 87

II.VIII. Estadstica Descriptiva y anlisis de datos ______________________________ 95


II.VIII.I. Distribuciones de frecuencias ____________________________________________ 96 II.VIII.II. Medidas de concentracin_______________________________________________ 99 II.VIII.III. Medidas de dispersin ________________________________________________100

II.IX. Funciones de densidad de probabilidad conocidas ________________________ 101 II.X. Integracin y Ecuaciones Diferenciales Ordinarias ________________________ 105
II.X.I. Integracin Numrica ___________________________________________________106 II.X.II. Integracin de problemas de Cauchy_______________________________________110 Pgina II de 206 Pgina II de 206

DANIEL PACHECO BORJA


II.X.III. Programacin en Matlab _________________________________________________ 117 II.X.IV. Funciones ____________________________________________________________117

II.XI. Diseo de aplicaciones en Matlab _____________________________________ 119


II.XI.I. Los dos axiomas _______________________________________________________120 II.XI.II. Parmetros y variables. _________________________________________________123

II.XII. Persistencia ______________________________________________________ 126


II.XII.I. Archivos binarios ______________________________________________________126

II.XIII. Estudio del pndulo invertido _______________________________________ 129 CAPTULO III ___________________________________________________________ 145 III.I Mandar un cohete al espacio __________________________________________ 145
III.I.I. Frmulas adicionales ____________________________________________________148

III.II. Algunas inconsistencias _____________________________________________ 171


III.II.I. Matlab en la enseanza _________________________________________________171 III.II.II. El estndar Matlab ____________________________________________________173 III.II.III. La verdad sobre la indexacin recursiva ___________________________________174 III.II.IV. La innecesaria distincin entre filas y columnas _____________________________179 III.II.V. Funciones y archivos ___________________________________________________185 III.II.VI. Cul es el paradigma de Matlab? ________________________________________185 III.II.VII. La orientacin a objetos _______________________________________________187 III.II.VIII. El punto de la muerte _________________________________________________189 III.II.IV. El punto y coma absurdo _______________________________________________189 III.II.V. Funciones y sentencias o cmo ahorrarse parntesis _________________________190

Pgina III de 206

MATLAB

NDICE DE GRAFICOS
GRAFICO 1 CAPTURA DE INTERFAZ GRAFICO __________________________________________________ 9 GRAFICO 2 EDITOR_____________________________________________________________________ 12 GRAFICO 3 FUNCTION 1 _________________________________________________________________ 15 GRAFICO 4 GRAFICA DEL SENO ____________________________________________________________ 70 GRAFICO 5 GRAFICA DEL SENO SEGMENTADO________________________________________________ 71 GRAFICO 6 FIABILIDAD DEL LMITE _________________________________________________________ 75 GRAFICO 7 HIPERBLICOS _______________________________________________________________ 77 GRAFICO 8 POLARIDAD__________________________________________________________________ 80 GRAFICO 9 DOBLE LINEABILIDAD __________________________________________________________ 85 GRAFICO 10 EXPONENCIAL _______________________________________________________________ 91 GRAFICO 11 LOGARITMICA _______________________________________________________________ 93 GRAFICO 12 ASCENDENCIA_______________________________________________________________ 98 GRAFICO 13 HISTOGRAMA ______________________________________________________________ 103 GRAFICO 14 OSCILACIN _______________________________________________________________ 113 GRAFICO 15 INDICE DE PARCIALIDAD ______________________________________________________ 115 GRAFICO 16 PENDULO _________________________________________________________________ 130 GRAFICO 17 PENDULO 2 ________________________________________________________________ 131 GRAFICO 18 ALAGARMINETOS Y COMPRENSIONES __________________________________________ 139 GRAFICO 19 OSCILACION 2 ______________________________________________________________ 141 GRAFICO 20 GUSANOS DE PARADOJA _____________________________________________________ 143 GRAFICO 21 PUNTOS DE ENCUENTRO _____________________________________________________ 167 GRAFICO 22 PUNTOS DE ENCUENTRO 2 ____________________________________________________ 168 GRAFICO 23 TRAMOS CONTINUOS ________________________________________________________ 169 GRAFICO 24 DESORGANIZACION DE TRAMOS _______________________________________________ 170

Pgina 4 de 206 Pgina 4 de 206

DANIEL PACHECO BORJA

INDICE DE ECUACIONES
ECUACION 1 NUMEROS COMPLEJOS _______________________________________________________ 27 ECUACION 2 TANGENTE 1________________________________________________________________ 28 ECUACION 3 PRODUCTO ESCALAR _________________________________________________________ 34 ECUACION 5 SUMATORIA SUCESIONAL _____________________________________________________ 37 ECUACION 4 SUMATORIA ESCALAR ________________________________________________________ 37 ECUACION 6 SUMATORIA ________________________________________________________________ 38 ECUACION 7 OPERACIN CON FUNCIONES __________________________________________________ 40 ECUACION 8 POLINOMIO ________________________________________________________________ 41 ECUACION 9 EXPONENCIAL ______________________________________________________________ 44 ECUACION 10 DESPEJE 1 _________________________________________________________________ 59 ECUACION 11 DESPEJE 2 _________________________________________________________________ 59 ECUACION 12 SISTEMA 1 ________________________________________________________________ 62 ECUACION 13 INTEGRAL 1 _______________________________________________________________ 98 ECUACION 14 DESVIACIN ______________________________________________________________ 100 ECUACION 15 DESVIACION TIPICA ________________________________________________________ 102 ECUACION 16 DERIVADAS ______________________________________________________________ 105 ECUACION 17 OSCILACION FORMULADA ___________________________________________________ 111 ECUACION 18 ECIACION DIFERENCIAL _____________________________________________________ 124

Pgina 5 de 206

MATLAB

Historia
Fue creado por Cleve Moler en 1984, surgiendo la primera versin con la idea de emplear paquetes de subrutinas escritas en los cursos de lgebra lineal y anlisis numrico, sin necesidad de escribir programas en dicho lenguaje. El lenguaje de programacin M fue creado en 1970 para proporcionar un sencillo acceso al software de matrices LINPACK y EISPACK sin tener que usar Fortran. En 2004, se estimaba que MATLAB era empleado por ms de un milln de personas en mbitos acadmicos y empresariales.

DANIEL PACHECO BORJA

Prlogo
Esta es una breve introduccin al lenguaje de programacin Matlab orientada a alumnos que no han asistido nunca a un curso de programacin. El nico requisito para seguir este manual es una mente abierta. Matlab es til y sencillo pero est lleno de sutilezas. Cualquiera puede escribir programas sencillos con Matlab despus de un par de horas de prctica pero debemos tener siempre en cuenta que programar bien implica ser consciente de los detalles. Se necesita una mente abierta para entender que hacer las cosas bien es siempre importante

Pgina VII de 206

MATLAB

Introduccin
Tras encender Matlab la sensacin puede ser de saturacin. La interfaz grfica de Matlab no se corresponde a la sencillez de uso real del programa. Al final terminaremos usando un par de cosas e ignorando el resto. Por ahora nos interesan slo dos herramientas: la consola y el editor. El editor nos servir para escribir o modificar los programas y la consola ser nuestra va principal de comunicacin con Matlab. Cualquiera de las operaciones de la interfaz grfica pueden realizarse nicamente escribiendo comandos en la consola. De momento es en lo nico que debemos centrarnos, durante esta primera introduccin bastar cone escribir comandos detrs del smbolo >>.

Pgina VIII de 206

DANIEL PACHECO BORJA

 Fundamentos de programacin
Nuestro punto de partida es as de simple: >> a = 1; Hay tres elementos en esta lnea de cdigo:

y y y

a es una variable = es el operador asignacin 1 es el literal que define el nmero 1.

Una variable es una palabra cualquiera. La nica restriccin es que no podemos utilizar unos pocos caracteres reservados como +, - o *. Debemos escoger siempre nombres bien descriptivos que permitan descifrar el algoritmo que se est implementando. Las velocidades pueden llamarse v y las coordenadas x e y respectivamente.

Pgina IX de 206

MATLAB
El operador asignacin almacena en memoria el resultado de la operacin de su derecha y la asigna (por eso su nombre) a la variable. En Matlab cada comando slo puede obtener un operador asignacin y a su izquierda slo puede haber una variable.

Nota

Otros lenguajes de programacin como C++ permiten la asignacin en cualquier estructura de cdigo. Por ejemplo #include <iostream>

int main(int argc, char *argv[]) { int c; if(c = 1 > 0){ std::cout << "Mayor que cero" << std::endl; } std::cout << c << std::endl; return 0; } Tiene la siguiente salida por pantalla:

Pgina X de 206

DANIEL PACHECO BORJA


Mayor que cero 1 Esta estructura es sencillamente imposible en Matlab. Ahora tenemos un mecanismo para almacenar cualquier resultado independientemente de su naturaleza en la memoria del ordenador. Esta es la esencia de la programacin: calcular a partir de datos almacenados en la memoria. Ahora tenemos muchas preguntas por contestar. Qu estamos calculando realmente? Cmo se

almacenan los resultados en la memoria? etc. Todas estas preguntas encontrarn respuesta ms tarde.

Importante

Matlab distingue entre letras maysculas y minsculas en los nombres de las variables. Para ayudarnos en las sesiones interactivas Matlab define una variable especial llamada ans y que no debemos sobrescribir nunca. Cada vez que ejecutemos un comando y no asignemos su resultado a una variable Matlab har dicha asignacin de manera completamente automtica a la variable ans.

Pgina XI de 206

MATLAB
>> 2+2 ans = 4

Pgina XII de 206

DANIEL PACHECO BORJA

CAPTULO I I. Matlab es un lenguaje de programacin


Matlab es un lenguaje de programacin, un conjunto de reglas para escribir programas de ordenador. Matlab es un lenguaje de programacin orientado al Clculo Numrico (de ah su nombre Matrix Laboratory) y es difcil encontrarle cualquier otra aplicacin. Desde un punto de vista esttico y prctico Matlab es un buen lenguaje de programacin para realizar programas breves y simples. Matlab no es adecuado para: Implementacin de algoritmos complejos que requieran de modelos de datos complejos organizados de forma jerrquica. Aunque con Matlab podemos programar utilizando la orientacin a objetos no puede considerarse un buen lenguaje para ello.
y

Computacin de alto rendimiento. El HPC es un caso de uso extremo de los recursos de clculo. Matlab tiene un rendimiento razonable en la mayora

Pgina 1 de 206

CAPITULO I

MATLAB

de los casos pero un buen programador puede multiplicar entre diez y cien veces la velocidad de ejecucin de un programa utilizando C o Fortran.
y

Grandes proyectos de software. Matlab no es una buena eleccin para un programa que crece ms all de unos cuantos miles de lneas. No hay una razn nica para ello pero se podra decir que la complejidad del cdigo escala mal.

Pero lo realmente valioso de Matlab no son sus capacidades como lenguaje sino las siguientes: Existe un uso generalizado de Matlab en Ingeniera, es una herramienta de gran popularidad y es til para una carrera profesional. Esto lo ha convertido en un estndar de-facto para la escritura de pequeos programas de simulacin.
y

Matlab cuenta con una extensa biblioteca de funciones que cubren casi todas las disciplinas de la Ciencia y la Ingeniera extensamente documentada y de fcil uso.

Pgina 2 de 206

DANIEL PACHECO BORJA

II. Matlab es un lenguaje interpretado


Los lenguajes de programacin, como los lenguajes naturales escritos, no son ms que una serie de normas para transmitir conceptos. Mientras el lenguaje escrito sirve para que los seres humanos se comuniquen entre ellos los lenguajes de programacin se crearon para comunicarse con los ordenadores mediante una serie finita de claves. Los lenguajes de programacin tambin tienen gramtica y lxico pero son mucho ms simples que, por ejemplo, los de la lengua castellana. Los seres humanos estamos educados para convertir palabras y frases en sonidos. Hay que dotar a los ordenadores de un mtodo para convertir el cdigo implementado en un lenguaje de programacin en rdenes que sea capaz de cumplir. Hay casi una infinidad de maneras de lograr este objetivo. A diferencia de la mayora de los cursos sobre lenguajes de programacin los describiremos por orden cronolgico, aunque no rigurosamente. Cuando apareci el ordenador programable la nica manera de comunicarse con l era describir sin ambigedad qu suceda con cada posicin de memoria. Este cdigo de bajo nivel, llamado comnmente ensamblador, es traducido a lenguaje
Pgina 3 de 206

CAPITULO I

MATLAB

mquina que ya un ordenador es capaz de entender. Aunque hoy este mtodo de programacin pueda parecer inverosmil es la mejor manera de mover mquinas lentas y con poca memoria como las de entonces. El paso siguiente lleg con la aparicin de los compiladores. A medida que los ordenadores se hacan ms potentes escribir los programas en ensamblador empez a hacerse una tarea muy laboriosa. El nmero de direcciones de memoria creca exponencialmente y las arquitecturas, aunque seguan el modelo de Von Neumann, se hacan ms complejas. El siguiente paso fue utilizar el mismo ordenador para traducir desde un lenguaje ms humano, de alto nivel, a ensamblador. El ensamblador pas de ser un lenguaje de uso a un lxico intermedio. El programa que convierte este cdigo de alto nivel se llama compilador. Este planteamiento tiene una ventaja adicional. El cdigo ensamblador no es el mismo para todas las arquitecturas. Un programa compilado para x86 no puede ejecutarse en SPARC o POWER pero el cdigo es el mismo. El programa de Kernighan y Ritchie [KnR]

#include "stdio.h" int main() { printf("Hello, world!\n"); }

Pgina 4 de 206

DANIEL PACHECO BORJA


Produce exactamente el mismo resultado en cualquier ordenador siempre que disponga de un compilador de lenguaje C. Esto asegura la portabilidad a nivel de cdigo, no a nivel de ejecutable. El paso siguiente es poder utilizar un ensamblador independiente de cada arquitectura mediante un traductor de cdigo propio a cdigo mquina. Esta aplicacin se llama mquina virtual. Una mquina virtual es tan lista como se desee (mucho ms lista que un procesador) y realizar tareas como la declaracin de variables, la liberacin de memoria o la gestin del flujo de ejecucin. El conjunto compilador y mquina virtual se denomina intrprete y los lenguajes que soportan este funcionamiento se llaman lenguajes interpretados. Que el cdigo sea ejecutado por un programa y no por el propio ordenador es mucho ms lento, por este motivo las mquinas virtuales no se popularizaron hasta finales de los noventa. El paso siguiente es hacer desaparecer incluso este ensamblador intermedio y con l el compilador. Ya no existe un compilador y una mquina virtual sino que slo un programa, el intrprete, realiza todo el trabajo. Este ltimo planteamiento no es necesariamente superior en eficacia o rendimiento a una mquina virtual, simplemente es ms fcil de disear e implementar. Matlab pertenece a este ltimo grupo.

Pgina 5 de 206

CAPITULO I

MATLAB

III. Matlab es un lenguaje dinmico


En muchos lenguajes de programacin como C o Fortran es imprescindible declarar cada variable. La definicin estricta de declaracin es la de identificar un determinado espacio en la memoria del ordenador con un nombre. Volviendo otra vez a un C que cualquiera pueda entender la declaracin

int a;

significa que un espacio en la memoria fsica lo suficientemente grande como para almacenar un entero va a recibir el nombre de a. Estos lenguajes, los que asocian variables a memoria, se llaman estticos La llegada de los lenguajes interpretados permiti manejar la memoria de una manera mucho ms verstil. Java, que aunque es interpretado es tambin esttico, incluye un recolector de basura que descarga al programador de la tarea de limpiar la memoria. Pero la mayora de los lenguajes interpretados modernos como Python o Ruby son adems dinmicos. En un lenguaje dinmico no existen declaraciones porque el concepto de variable es distinto, ya no es el nombre que se asocia a un espacio en la memoria, es el nombre de un valor. De esta manera
Pgina 6 de 206

DANIEL PACHECO BORJA


la variable tiene un sentido mucho ms natural, ms matemtico. Matlab es un lenguaje dinmico aunque no puede considerarse moderno. Desde el punto de vista del intrprete cualquier variable o estructuras de variables son mutables en tiempo de ejecucin complicando significativamente el manejo de memoria. Programar con un lenguaje dinmico es completamente distinto hacerlo con uno esttico. La mayor versatilidad suele venir acompaada de mayor coste computacional o de nuevos errores de programacin. No debemos perder nuca de vista que la programacin es la manipulacin de datos almacenados en la memoria de un ordenador y con un lenguaje dinmico estamos ms lejos de los mismos.

Pgina 7 de 206

CAPITULO I

MATLAB

IV. La interfaz grfica de Matlab


La interfaz grfica de Matlab es prcticamente idntica en cualquiera de sus versiones independientemente del sistema operativo.

Pgina 8 de 206

DANIEL PACHECO BORJA

GRAFICO 1 CAPTURA DE INTERFAZ GRAFICO

Pgina 9 de 206

CAPITULO I

MATLAB

Vemos que la ventana principal est dividida en apartados con una funcin especfica. Cada uno de estos apartados, a excepcin del men, es una ventana que puede moverse dentro de la propia aplicacin. Esto permite que ordenemos Matlab para ajustarlo mejor a nuestras necesidades. Las tres nicas zonas que de momento nos interesan estn marcadas con un nmero en la imagen. El icono sealado con el nmero 1 siginfica nuevo archivo y sirve para abrir el editor de Matlab. Ser nuestra herramienta de trabajo y pronto le dedicaremos una seccin. El recuadro sealado con el nmero 2 es el dilogo para seleccionar el directorio de trabajo. A medida que vayamos escribiendo cdigo lo guardaremos en algn lugar del ordenador. Para poder utilizarlos en un futuro es importante que Matlab sepa dnde lo hemos dejado. Matlab ya sabe, porque as viene configurado de fbrica, dnde tiene guardadas las funciones propias de la aplicacin y de los distintos toolkits pero no sabe dnde estn las que hemos escrito. Advertencia

Matlab busca funciones y scripts en los directorios especificados por la funcin path. El primero de ellos es siempre el especificado en el

dilogo Current Directory. path(path, dir)

Pgina 10 de 206

DANIEL PACHECO BORJA


Sin argumentos imprime en la pantalla los directorios donde Matlab busca los archivos. En el caso de darle dos argumentos, normalmente el primero ser simplemente path mientras que el segundo ser el nombre de un directorio que queramos aadir a la lista. Por ejemplo, para aadir un directorio en un sistema operativo UNIX

>> path(path,'/home/yo/funciones_matlab') Para aadir un directorio en un sistema Windows

>> path(path,'c:\yo\funciones_matlab')

Por ltimo, pero no menos importante, el nmero 3 es la consola de Matlab. Como qued claro en la introduccin, en realidad Matlab no es ms que un intrprete para un lenguaje de programacin y nuestra va directa de comunicacin con el mismo es la consola. De hecho, no existe ninguna accin de la interfaz grfica que no pueda ejecutarse tambin mediante la consola. De hecho, cuando ejecutamos un programa no es ni siquiera imprescindible que la interfaz grfica est abierta. Truco

Uno de los atajos de teclado ms tiles del editor de matlab es utilizar la tecla F5 para guardar y ejecutar el cdigo que estamos escribiendo.

Pgina 11 de 206

CAPITULO I
La siguiente pieza es el editor.

MATLAB

Captura del editor de Matlab R2008b

GRAFICO 2 EDITOR

Pgina 12 de 206

DANIEL PACHECO BORJA


La definicin de programar es escribir cdigo y para ser realmente productivos es importante utilizar una buena herramienta y conocerla. No es ni mucho menos necesario utilizar el editor de Matlab para escribir nuestros scripts pero se trata de una buena opcin. El editor cuenta con casi todas las capacidades que se esperan de una herramienta de programacin moderna. Coloreado de cdigo Anlisis sintctico capaz de detectar errores antes de ejecutar el cdigo
y

y y

Depurador integrado

Una de las caractersticas que ha integrado en las ltimas versiones es el modo celda que nos ayudar a dividir grandes archivos en partes ejecutables independientemente slo comentando el cdigo de una manera particular. La interfaz grfica nos sirve tambin para consultar la documentacin del programa. Es completa, extensa y de calidad. Hablaremos con ms calma sobre la ayuda de Matlab en el siguiente captulo.

Pgina 13 de 206

CAPITULO I

MATLAB

V. La arquitectura de Matlab
Por motivos de licencias, Matlab est dividido en paquetes. Cada uno cumple una funcin especfica y puede ser adquirido a parte. Esto impone una limitacin aadida a Matlab porque, aunque una empresa o una universidad se haya gastado grandes cantidades de dinero en licencias de Matlab, es posible que no haya adquirido el toolbox que necesitamos.

V.I. Simulink

Pgina 14 de 206

DANIEL PACHECO BORJA


Simulink es una herramienta de diseo y modelado de sistemas dinmicos. Simulink utiliza Matlab para realizar los clculos, puede extenderse con Matlab y se distribuye junto con Matlab, pero no es Matlab. Simulink se

basa en conectar modelos, expresados por bloques, que se transmiten informacin. Simulink tiene sus limitaciones. No siempre un sistema se puede llegar a modelar de manera eficiente slo con bloques y conexiones debido a que
GRAFICO 3 FUNCTION 1

Pgina 15 de 206

CAPITULO I

MATLAB

no siempre la informacin transmitida es equivalente a la informacin que pasa por un cable. Nunca debe presentarse Simulink como una alternativa a la programacin directa de un modelo sino como una plataforma de modelado de sistemas simples o de integracin para que varios ingenieros trabajen sin colisionar en el mismo sistema.

Pgina 16 de 206

DANIEL PACHECO BORJA


V.II. Octave

E
un

n su propia documentacin se describe Octave como lenguaje de

sido portado a muchos ms sistemas operativos. Tambin en un principio de fue un

programacin de alto nivel orientado al Clculo

lenguaje

programacin

independiente pero ha ido convergiendo a Matlab hasta el punto de buscar con la l.

Numrico. Proporciona una consola problemas para lineales resolver y no

compatibilidad

lineales con el ordenador y para desarrollar experimentos numricos. Octave puede ser copiado, modificado y redistribuido

Tampoco ha sido nunca un objetivo dotarle de interfaz grfica pero podemos

encontrar ya un par de ellas con calidad suficiente. Aunque Octave es capaz de ejecutar la mayora del cdigo escrito en Matlab tanto su historia como su arquitectura interna Octave fue diseado para ser una herramienta dentro de la lnea sistema aunque de comandos operativo del GNU, ha
Pgina 17 de 206

libremente bajo los trminos de la licencia GNU GPL tal como se publica por la Free Software Foundation.

es

completamente de las

distinta.

Una

diferencias ms evidentes es que estn de escritos en

lenguajes

programacin

posteriormente

CAPITULO I
distintos, Matlab en C y Octave en C++. Octave es hoy en da una herramienta inferior a Matlab pero para tratarse de algo totalmente desarrollado comunidad de por gratuito una

MATLAB
pequeos proyectos es una alternativa viable a completamente Matlab adems

cuenta con la ventaja de utilizar el mismo lenguaje de programacin. Otras

plataformas de clculo para Ciencia e Ingeniera como Scilab o IDL cuentan con sus propios lenguajes de

ingenieros,

cientficos y entusiastas se trata de una herramienta de una calidad altsima. Para

programacin.

V.III. QtOctave
Se trata de la interfaz grfica ms completa disponible para Octave en la actualidad. No es parte de Octave sino que se trata de un proyecto independiente y separado. Al igual que Octave se trata de software que puede copiarse, modificarse y distribuirse siempre que se haga respetando la licencia GNU GPL. Al igual que Matlab proporciona acceso a la consola y un editor. Aunque an no dispone de depurador integrado s proporciona un sistema de control de versiones que puede resultarnos til cuando el cdigo que escribimos se acerca a los millares de lneas.

Pgina 18 de 206

DANIEL PACHECO BORJA

VI. Nuestro primer programa en Matlab

A
Nota

ntes de escribir cdigo o implementar algn algoritmo es necesario que nos familiaricemos con el entorno de desarrollo. Este primer programa constar de una funcin y de un script

que llama a la funcin. As construiremos una estructura de programa que se repite en la gran mayora de casos; nuestros programas sern una coleccin de funciones que son llamadas por un script que funcionar como un programa principal.

El lector que haya programado alguna vez en C o cualquier lenguaje basado en C como C++ o Java reconocer esta manera de trabajar. La diferencia es que en Matlab no hacen falta cabeceras de ningn tipo y el programa principal puede llamarse de cualquier manera. La limitacin es que, al no poder crear cabeceras, todas las funciones debern encontrarse ya en los directorios especificados por path. Abriremos el editor y en l escribiremos lo siguiente
Pgina 19 de 206

CAPITULO I
aprsin = @(x) x - x.^3/6; x = linspace(-pi,pi,100); plot(x,aprsin(x),x,sin(x));

MATLAB

Guardaremos el script con el nombre que ms nos apetezca, siempre con la extensin .m. Luego, en la consola, escribiremos el nombre que hemos utilizado para el archivo sin la extensin. Si todo ha salido bien aparecer lo siguiente.

VII. Nuestro primer programa en Octave

diferencia de Matlab, Octave es programa diseado

para ser utilizado en la consola del sistema. Dicho de esta manera parece que volvemos a los aos 80

antes que se popularizara Windows pero si nos fijamos un poco en la interfaz de Matlab veremos que a medida que nos volvamos ms hbiles en el uso del lenguaje de programacin

Pgina 20 de 206

DANIEL PACHECO BORJA


usaremos ms el intrprete de comando y menos los accesorios que lo rodean. En Octave uno de los comandos ms usados es edit., que tambin existe en Matlab. edit() Funcin que controla el editor asociado al intrprete. En el caso de Matlab se trata del intrprete propio mientras que Octave utiliza el intrprete predeterminado del sistema. Por ejemplo, para editar la funcin nueva aprsin.m escribiremos >> edit aprsin.m

Pgina 21 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

CAPTULO II II.I. Escalares, vectores y polinomios


El siguiente paso en cualquier curso de programacin es dar una visin general de las caractersticas del lenguaje. Tratar todas las sentencias, operadores, estructuras... Esto, aparte de ser terriblemente aburrido, no es necesariamente til en estos casos. Nuestro objetivo es dominar las habilidades bsicas para ser capaces de resolver elegantemente problemas simples con Matlab. Ser ms adecuado ir aprendiendo el lenguaje sobre la marcha

II.I.I. Scripts y sesiones interactivas


Debemos acostumbrarnos a ir escribiendo nuestro trabajo en el editor, esto es, crear programas (tambin llamados guiones o scripts) y ejecutarlos a travs del intrprete. Una pregunta recurrente de quien empieza con Matlab y lleva un rato

Pgina 22 de 206

CAPITULO II - MATLAB
utilizando la consola. Cmo puedo guardar todo mi progreso? La respuesta es que nunca deberas haber hecho nada importante con la consola. La consola, con su lnea de comandos, sirve para operaciones simples y para interactuar con nuestros scripts. Cuando escribimos cdigo que de verdad queremos guardar debemos hacerlo en un editor. El primer paso es entender cmo funciona el editor de Matlab, o por lo menos un editor que sea se lleve bien con Matlab. No necesitaremos el editor en este breve tutorial pero estis avisados. Aprenderemos ms sobre editores, scripts y atajos de teclado en un rato.

II.I.II. Operaciones aritmticas bsicas


Podemos utilizar Matlab como una calculadora asombrosamente potente para realizar operaciones sencillas y para aplicar funciones elementales. Una suma es tan sencilla como podra serlo

>> 2 + 2 ans = 4

Recordad que las variables sirven para almacenar resultados en la memoria y volverlos a utilizar

>> a = 4; >> a + 2;
Pgina 23 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


ans = 6

Importante

Por omisin Matlab siempre muestra el resultado del ltimo clculo. Esto sucede tanto en sesiones interactivas como en los programas que escribamos en el editor. Para prevenir la salida de una ristra interminable de resultados intermedios debemos escribir un punto y coma al final de cada lnea. Los operadores matemticos bsicos se expresan en Matlab mediante los siguientes smbolos: Suma: +. Resta: -. El signo menos tambin sirve como prefijo para expresar que un nmero es negativo.
y y y

y y

Multiplicacin: .*. Divisin: ./. Potencia: .^.

Importante

Pgina 24 de 206

CAPITULO II - MATLAB
Probablemente os sorprenda el hecho que los ltimos tres operadores utilicen un punto y no sean simplemente el smbolo. La razn la entenderemos en el momento en el que empecemos a operar con matrices. Hay muchos ms operadores aritmticos, de momento nos hemos ceido a los ms bsicos. Matlab es capaz de operar con nmeros complejos gracias a que el nmero imaginario es una constante expresada por la variable i. Cualquier nmero

multiplicado por i ser en realidad la componente imaginaria de un nmero complejo. Por ejemplo

>> a = 1; >> b = 1.*i; >> a + b ans = 1 + 1i >> a .* b ans = 0 + 1i

Advertencia

Matlab no mostrar ningn aviso en el caso que sobrescribamos i. Para evitar posibles accidentes podemos utilizar smbolos alternativos para expresar la constante imaginaria: j, I y J.

Pgina 25 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Lo que convierte a Matlab en una herramienta til es la enorme biblioteca de funciones que cubre prcticamente cualquier disciplina del clculo numrico, desde el lgebra Lineal al anlisis de seales pasando por la teora de juegos o las redes neuronales. Cualquier funcin tiene argumentos de entrada y argumentos de salida y Matlab los trata de una manera un poco particular. Las funciones ms simples tienen slo un argumento de entrada y otro de salida

>> sin(1.4) ans = 0.98545

>> sqrt(4) ans = 2

Como no hemos asignado el argumento de salida a ninguna variable Matlab ha utilizado la variable especial ans de la que hemos hablado en el captulo anterior. Hay funciones que tienen varios argumentos de entrada y de salida como por ejemplo la funcin quad que calcula la integral numrica de una funcin en un intervalo dado. quad tiene cinco argumentos de entrada y cuatro de salida y es prcticamente imposible que la utilicemos correctamente sin consultar la documentacin. Hacerlo es tan sencillo como escribir lo siguiente en el intrprete

>> help(quad)

Pgina 26 de 206

CAPITULO II - MATLAB
Acabamos de aprender el nombre de la funcin ms importante de Matlab, help. Todas las funciones de la biblioteca de Matlab estn perfectamente documentadas y tenemos acceso a esa informacin a travs de help. Siempre que sea matemticamente consistente cualquier funcin operar indistintamente con nmeros reales y complejos:

>> a = 1.6; >> b = 3.4.*i; >> exp(b) ans = -0.96680 - 0.25554i

Define tres variables con los siguientes valores: a = 1.5, b = 3.4 y c = 5.2. Calcula el valor de d para

Ejercicio 2

En un Congreso Internacional de Matemticas se vot como la frmula ms bella

ECUACION 1 NUMEROS COMPLEJOS . Comprueba que Matlab piensa que esta frmula es correcta. Te conviene utilizar la constante pi.

Ejercicio 3

Pgina 27 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Ejercicio 1

Comprueba que el producto de dos nmeros complejos es igual al producto de sus mdulos y la suma de sus argumentos. Puede ser que necesites las funciones angle y abs.

Ejercicio 4

No existe el infinito en Matlab porque sirve para el Clculo Numrico, no para el Clculo Simblico. Pero hay una constante propia llamada Inf que es un nmero lo suficientemente grande como para ser el infinito en la prctica (es un nmero ms grande que el total de tomos de la masa conocida del Universo). La funcin tangente, tan conecta el valor de ECUACION 2 TANGENTE 1 . Si utilizamos la expresin anterior para calcular el infinito en Matlab no llegamos a un nmero tan grande. Puedes dar una explicacin? con el infinito:

Pgina 28 de 206

CAPITULO II - MATLAB

II.II. Definicin de funciones


Ahora ya sabemos operar con escalares y con funciones simples. El siguiente paso es aprender a definir nuestras propias funciones. Hay dos maneras de definir una funcin en Matlab, de momento nos basta con la ms sencilla y a la vez la menos potente: mediante el operador@ (). La sintaxis queda bien clara mediante el siguiente ejemplo: >> fsin = @(x) x - x.^3/6 fsin = @(x) x - x .^ 3 / 6 >> fsin(pi) ans = 8.3093 Una funcin definida por el usuario puede hacer uso tanto de otras funciones independientemente de su origen. >> comp = @(x) fsin(x) - sin(x) comp = @(x) fsin (x) - sin (x)
Pgina 29 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


>> comp(0.1) ans = 3.3325e-004 Nota

Tcnicamente lo que hemos definido antes no es exactamente una funcin y de hecho no se llama funcin sino funcin annima. Pero de momento no encontraremos ninguna diferencia.

II.II.I Vectores
El vector es el tipo derivado ms simple de Matlab. Se trata de una concatenacin de nmeros ordenados en fila. La caracterstica ms importante de los vectores es que son un conjunto ordenado del que podemos tomar uno o varios de sus elementos a partir de su ndice. La manera ms sencilla de definir un vector es utilizando un literal: >> v = [11, 12, 13, 14, 15, 16, 117, 18,19] v = 11 12 13 14 15 16 17...

Pgina 30 de 206

CAPITULO II - MATLAB
Podemos obtener un elemento del vector llamndolo como si fuera una funcin >> v(2) ans = 12

Obtener porciones del vector es tan fcil como obtener elementos. Basta con separar el primer nidice del ltimo con dos puntos >> v(2:4) ans = 12 13 14

Tambin podemos utilizar otro vector para obtener un vector con elementos individuales >> v([2,4,6,7]) ans = 12 14 16 17

Difcilmente escribiremos nunca un vector largo en Matlab. O lo obtendremos como dato o utilizaremos una funcin especficamente diseada para ello como linspace o logspace. linspace(base, limit, N)

Pgina 31 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Devuelve un vector fila con N elementos separados linealmente entre base y limit Ejemplo: >> linspace(0,10,11) ans = 0 1 2 3 4 5 6 7 8 9 10

logspace (base, limit, N) Similar a linspace excepto que los valores estn espaciados logartmicamente entre y .

Cuando un vector se opere con un escalar se operar con cada uno de los elementos del vector. >> v = [1, 2, 3,4]; >> 3+v ans = 4 5 >> 3.*v ans = 3 6 6 7

12

Pgina 32 de 206

CAPITULO II - MATLAB
Si los dos operandos son vectores el requisito

fundamental es que ambos tengan el mismo tamao. >> w = [8, 7, 6, 5]; >> v+w ans = 9 9 >> v.*w ans = 8 14 9 9

18

20

Importante

No existe una multiplicacin de vectores, la operacin anterior es operar los vectores elemento elemento, lo que corresponde ms a una tabla que a lo que se esperara de un vector. De hecho en Clculo Numrico no hay ninguna diferencia entre un vector y una simple lista de nmeros. Una operacin importante cuando se habla de vectores es el producto escalar, que se define como.

Pgina 33 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


(1) ECUACION 3 PRODUCTO ESCALAR En Maltab puede calcularse con la funcin dot. dot(u, v, dim) Calcula el producto escalar de dos vectores. El tercer argumento, dim es de utilidad en el caso que alguno de los dos argumentos o ambos sean matrices. >> dot(v,w) ans = 60 Aunque sea mucho menos eficiente tambin podemos calcular ese producto escalar utilizando la definicin de la operacin y la funcin sum. sum(x, dim) Suma los elementos de un vector. dim es de utilidad cuando el argumento sea una matriz. >> sum(v.*w) ans = 60 Advertencia

Pgina 34 de 206

CAPITULO II - MATLAB
En muchos programas escritos en Matlab encontraremos el producto escalar escrito como >> u'*v Es una operacin vlida, aunque an no sepamos qu operaciones son el apstrofe y el asterisco sin punto respectivamente. El problema de no utilizar la funcin dot es que estamos utilizando una sintaxis

ambigua, no sabemos si u y v son vectores, adems de ser una opreacin mucho ms propensa a fallar sin dar excesiva

informacin del porqu. Recordad que la belleza es importante. Prod(x, dim) Calcula el producto de los elementos de un vector. dim es de utilidad cuando el argumento sea una matriz. Una tcnica importante en Matlab es la concatenacin de dos vectores que puede pegndolos
Pgina 35 de 206

hacerse

simplemente

HERRAMIENTAS DE COLABORACION DIGITAL


>> a = [1,2,3]; >> b = [4,5,6]; >> [a,b] ans = 1 2 3 4 5 6

o utilizando la funcin cat. Ejercicio 5

Cuando Gauss contaba siete aos el profesor les puso un ejercicio para tenerlos entretenidos un rato.

Cunto es la suma de todos los nmeros enteros entre 1 y 100? Gauss lleg fcilmente al reultado en slo unos pocos segundos porque vio que sumando pares de nmeros 1+99, 2+98, 3+97... La operacin poda reducirse a 50 99+100. Con

Matlab se puede hacer la operacin por fuerza bruta de muchas maneras

Pgina 36 de 206

CAPITULO II - MATLAB
pero... Eres capaz de hacerlo con slo una lnea de cdigo? Ejercicio 6

El

nmero

puede

calcularse

mediante la siguiente serie:

ECUACION 4 SUMATORIA ESCALAR

Cuntos trminos son necesarios para llegar a una precisin de ?

Cunta es la precisin de la suma de 100 trminos?

II.II.II. Polinomios
Se define un polinomio de grado n como (2) ECUACION 5 SUMATORIA SUCESIONAL

Pgina 37 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


No es ms que una funcin en la que el valor de la variable se eleva sucesivamente a una potencia hasta n y se multiplica por una constante. Utilizando el smbolo del sumatorio la expresin anterior puede compactarse a:

ECUACION 6 SUMATORIA Si nos fijamos un momento en la expresin (2) observaremos que un polinomio puede expresarse fcilmente en forma de vector utilizando sus coeficientes. El orden puede deducirse fcilmente con el nmero de coeficientes. Matlab utiliza vectores para expresar los polinomios con la nica salvedad que los almacena del modo inverso al que hemos escrito (2). El polinomio sera en Matlab

>> p = [1, 0, -1, 1];

La operacin ms comn con un polinomio es evaluarlo en un punto dado, para ello utilizaremos la funcin polyval. polyval (p, x) Evala el polinomio p en el punto x Ejemplo >> p = [1, 0, -1, 1]; >> polyval(p,3)

Pgina 38 de 206

CAPITULO II - MATLAB
ans = 25

La importancia de los polinomios es que, siendo una funcin, todas las operaciones elementales (suma, resta, multiplicacin y divisin) pueden reducirse slo a operaciones con sus coeficientes. De esta manera podemos convertir operaciones simblicas en operaciones puramente numricas. Tomemos por ejemplo estas dos funciones: y . Sumar y restar estas dos funciones es trivial, pero no

multiplicarlas. Como se trata de una operacin con coeficientes Matlab la har sin inmutarse

>> p = [4, 0, -1, 0]; >> q = [1, 0, 6]; >> conv(p,q) ans = 4 conv(u, v) Calcula la convolucin de dos vectores de coeficientes. En el caso de vectores, la convolucin es la misma operacin que el producto. Efectivamente . 0 23 0 -6 0

Dividir dos polinomios nos servir para aprender cmo tratar las funciones con dos argumentos de salida. De define la divisin de dos polinomios como
Pgina 39 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

ECUACION 7 OPERACIN CON FUNCIONES Entonces la divisin entre polinomios ms, el cociente y tiene como resultado dos . Si a la salida

y el residuo

de deconvse le asigna slo una variable obtendremos el cociente deconv(u, v) Calcula la deconvolucin de dos vectores de coeficientes. En el caso de polinomios esta operacin es equivalente al cociente del primero por el segundo. Devuelve dos argumentos, el cociente y el residuo.

>> c = deconv(p,q) c = 4 0

Si necesitamos tambin el residuo tendremos que hacer lo siguiente

>> [c,r] = deconv(p,q) c = 4 0

r =

Pgina 40 de 206

CAPITULO II - MATLAB
0 0 -25 0

Hay otras operaciones que son operadores lineales aplicados a los polinomios como por ejemplo la derivada y la integral. polyderiv (p) Calcula los coeficientes de la derivada del polinomio p. Si le

proporcionamos un segundo argumento q calcular la derivada del producto de polinomios. polyinteg (p) Calcula los coeficientes de la primitiva del polinomio p. Sabemos que los polinomios de

orden n tienen el mismo nmero de races. Esto nos permite descomponer cualquier polinomio de la siguiente manera:

ECUACION 8 POLINOMIO roots (p) Calcula las races del polinomio p.

Pgina 41 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Las races no son slo importantes como ecuacin solucin de la

sino que sirven,

por ejemplo, para buscar factores comunes entre dos polinomios. Otra funcin bastante til para los que utilizan Matlab para el anlisis de sistemas dinmicos lineales es la funcin residue que en cociente calcula la

descomposicin parciales polinomios residue (p, q) del

fracciones de dos

Calcula la descomposicin en fracciones parciales del cociente de dos polinomios p y q donde el primero es el numerador y el segundo el denominador. Por ejemplo

>> b = [1, 1, 1]; >> a = [1, -5, 8, -4]; >> help residue >> [r,p,k,e] = residue(b,a) r =
Pgina 42 de 206

CAPITULO II - MATLAB

-2.0000 7.0000 3.0000 p =

2.00000 2.00000 1.00000

k = [](0x0) e = 1 2 1 El vector r es el numerador de cada uno de los trminos, el vector p son los polos del sistema y el vector e es la multiplicidad de cada uno de los polos. Entonces la descomposicin en fracciones parciales ser:

Pgina 43 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

II.II.III. Ejercicio de sntesis


Existe una manera de representar la forma de una funcin cualesquiera en un punto dado mediante un polinomio. Dicho polinomio converge con mayor orden en los alrededores del punto a medida que se van aadiendo trminos. Se trata del desarrollo de Taylor. La nica informacin que necesitamos de la funcin es su valor y el de sus derivadas en el punto dado . La expresin general es

Para entender mejor cmo este polinomio se ajusta a la funcin podemos utilizar el desarrollo de la funcin exponencial en .

ECUACION 9 EXPONENCIAL Este polinomio puede crearse de muchas maneras pero posiblemente la ms sencilla sea utilizar los polinomios en Matlab para tener que generar slo los coeficientes.

>> exp_serie = @(x,n) polyval(1./[factorial(linspace(n,1,n)),1],x) exp_serie =


Pgina 44 de 206

CAPITULO II - MATLAB

@(x, n) polyval (1 ./ [factorial(linspace (n, 1, n)), 1], x) Nota

Esta lnea de cdigo sirve para aprender una regla muy importante sobre cmo debemos escribir un programa. Las lneas demasiado largas son difciles de leer, por lo tanto son un peligro incluso para nosotros mismos. Es recomendable romperlas en algn punto donde romperamos una operacin matemtica: despus de un operador, justo despus de abrir un parntesis. Para hacerlo debemos escribir tres puntos .... Podemos utilizar esta funcin para entender de un modo mucho ms visual el concepto de convergencia de una serie. Sabemos que a medida que aadamos trminos el error que comete el desarrollo de Taylor cerca del punto se reduce. Pero de qu forma? Una confusin habitual es pensar que al aumentar orden del desarrollo aumenta la regin donde se acerca a la funcin pero esto slo es cierto accidentalmente. Slo existe una mayor convergencia cerca del punto. Para verlo mejor calcularemos el error de la aproximacin en los puntos 0.2 y 0.1 para distintos rdenes.

exp_serie = @(x,n) polyval(1./[factorial(linspace(n,1,n)),1],x)

x_01 = [exp_serie(0.1,1),
Pgina 45 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


exp_serie(0.1,2), exp_serie(0.1,3), exp_serie(0.1,4), exp_serie(0.1,5), exp_serie(0.1,6), exp_serie(0.1,7)]; x_02 = [exp_serie(0.2,1), exp_serie(0.2,2), exp_serie(0.2,3), exp_serie(0.2,4), exp_serie(0.2,5), exp_serie(0.2,6), exp_serie(0.2,7)];

disp('error en 0.1') err_01 = abs(exp(0.1)-x_01) disp('error en 0.2') err_02 = abs(exp(0.2)-x_02) disp('logaritmo del error en 0.1') logerr_01 = log(err_01) disp('logaritmo del error en 0.2') logerr_02 = log(err_02)

El programa anterior tiene la siguiente salida:

error en 0.1
Pgina 46 de 206

CAPITULO II - MATLAB
err_01 = 5.1709e-03 1.7092e-04 4.2514e-06 8.4742e-08 1.4090e-09 2.0092e-11 2.5091e-13

error en 0.2 err_02 = 2.1403e-02 1.4028e-03 6.9425e-05 2.7582e-06 9.1494e-08 2.6046e-09 6.4932e-11 logaritmo del error en 0.1 logerr_01 = -5.2647 -8.6743 -12.3683 -16.2837 -20.3804 -24.6307
Pgina 47 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


-29.0137

logaritmo del error en 0.2 logerr_02 = -3.8442 -6.5693 -9.5753 -12.8009 -16.2070 -19.7660 -23.4577

Podemos ver que si tomamos logaritmos la diferencia entre los valores permanece aproximadamente constante.

Pgina 48 de 206

CAPITULO II - MATLAB

II.III. Matrices y lgebra Lineal


Para seguir avanzando hacia el lgebra Lineal es necesario definir el concepto de Matriz en Matlab. Tcnicamente no hay ninguna diferencia entre vectores, matrices o tensores. De hecho todos los tipos numricos en Matlab son arrays sin distincin, cada dimensin que no exista no es ms que un ndice que se mantiene en 1. Para entenderlo mejor podemos hacer este pequeo experimento

>> a = 1; >> a a = 1

>> a(1) ans = 1

>> a(1,1) ans = 1

>> a(1,1,1)

Hemos definido un escalar y lo hemos llamado como un escalar, un vector, una matriz y un array tridimensional. A Matlab le ha dado igual que en su definicin pretendiramos crear un escalar.

Pgina 49 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Desde este punto de vista, todos los vectores son en realidad matrices que tienen slo una fila o una columna. La concatenacin de vectores fila o vectores columna generar una matriz. El inconveniente es que hasta ahora slo conocemos vectores fila. Si en un vector fila los elementos se separan con comas (o con espacios) para generar un vector columna debemos separar los elementos por puntos y comas.

>> v = [1;2;3] v =

1 2 3

Como adems hemos aprendido que para concatenar vectores slo tenemos que pegarlos ya podemos generar matrices pegando vectores fila o vectores columna. Por ejemplo:

>> [v,v,v] ans =

1 2 3

1 2 3

1 2 3

Pgina 50 de 206

CAPITULO II - MATLAB
Acabamos de crear nuestra primera matriz. Matlab dispone de un literal para las matrices que nos ahorra tener que escribir un vector para cada fila o columna. En este literal los elementos de una misma fila se separan con comas y las filas se separan mediante puntos y coma como se ve en el ejemplo siguiente:

>> u = [1,2,3;4,5,6;7,8,9] u = 1 4 7 2 5 8 3 6 9

Advertencia

Uno de los grandes defectos de Matlab es la ambigedad al tratar vectores fila y matrices con una nica columna. Esto es debido a que, por omisin, un vector con un nico ndice es un vector fila mientras que el primer ndice de una matriz cuenta los elementos de una misma columna. Para ejemplificar este problema crearemos el vector u y el vector v de la siguiente manera: >> u(3) = 1 u =

1
Pgina 51 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

>> v(3,1) = 1 v =

0 0 1

Si Matlab fuera consistente estas dos instrucciones deberan generar el mismo vector, sin embargo en la primera generamos un vector fila y en la otra un vector columna. Para agravar los efectos de la inconsistencia ambos vectores pueden utilizar la misma notacin de ndices: >> u(3) ans = 1

>> v(3) ans = 1

La nica manera de no cometer errores graves por culpa del hecho que Matlab est mal pensado es recordar que existe un tipo vector y un tipo matriz o array que no tienen absolutamente nada que ver aunque Matlab s sea capaz de operar entre ellos porque considera que un vector es una matriz con una nica fila: >> u*v %Esto es lo mismo que el producto escalar
Pgina 52 de 206

CAPITULO II - MATLAB
ans = 1

II.IV. Rutinas de creacin de matrices


Al igual que con los vectores, Matlab dispone de una ingente coleccin de funciones que, combinadas adecuadamente, nos servirn para generar prcticamente cualquier matriz. zeros (...) Crea una matriz con las medidas solicitadas llena de ceros. La funcin zeros se puede llamar de muchas maneras. Si slo se utiliza un ndice crea una matriz cuadrada de dimensiones el valor del argumento de entrada. Con dos argumentos crear una matriz del tamao siendo n el primer argumento y m el segundo. Entonces, para crear un vector fila o un vector columna deberemos hacer lo siguiente: Ejemplo >> zeros(3,1) ans =
Pgina 53 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

0 0 0

>> zeros(1,3) ans =

ones (...) Crea una matriz con las medidas solicitadas llena de unos. Su funcionamiento es anlogo al de zeros eye (...) Crea una matriz con unos en la diagonal principal y ceros en el resto de sus elementos. Su funcionamiento es anlogo al de zeros. rand (...) Crea una matriz cuyos elementos son nmeros aleatorios. Su

funcionamiento es anlogo al de zeros. Es importante recordar que, al igual que los vectores, cualquier matriz puede juntarse con otra simplemente pegndolas.

>> [rand(3),zeros(3)]
Pgina 54 de 206

CAPITULO II - MATLAB
ans =

0.80283 0.00000

0.71353

0.73322

0.00000

0.00000 0.73062

0.00527 0.00000

0.07266

0.00000

0.00000 0.77822

0.73262 0.00000

0.93908

0.00000

0.00000

Otra funcin til para generar matrices es la funcin reshape. reshape(A, m, n,...) Devuelve una matriz con dimensiones dadas a partir de los elementos de la matriz A. En el caso que la matriz resultado no tenga el mismo nmero de elementos que el origen la funcin dar un error. Ejemplo >> reshape([1,2,3,4],2,2) ans =

1 2

3 4

Pgina 55 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

II.IV.I. Operaciones con matrices


Los operadores de suma, resta, multiplicacin, divisin y potencia tambin funcionan con matrices siempre que sean del mismo tamao. Tambin podemos aplicar las funciones elementales a matrices, lo que nos dar el mismo resultado que si hubiramos aplicado la funcin a cada uno de los elementos. Por ejemplo

>> exp(eye(4)) ans =

2.7183 1.0000 1.0000 1.0000

1.0000 2.7183 1.0000 1.0000

1.0000 1.0000 2.7183 1.0000

1.0000 1.0000 1.0000 2.7183

Pero en el caso de las matrices existen operaciones propias como la multiplicacin matricial o la inversa. Estas operaciones tambin tienen limitaciones: la multiplicacin matricial exige que los tamaos de los operando sean compatibles y slo las matrices cuadradas no singulares tienen inversa. Caso aparte son las divisiones matriciales puesto que tenemos dos. Advertencia

Pgina 56 de 206

CAPITULO II - MATLAB
La confusin entre operaciones escalares y matriciales es el error ms comn en Matlab. Es tan recurrente que incluso programadores con varios aos de experiencia lo cometen una y otra vez. Para evitarlo en la medida de lo posible es recomendable utilizar, en vez de los operadores que veremos a continuacin, las funciones que realizan la misma operacin.

II.IV.II. Multiplicacin matricial


Existen dos maneras de multiplicar matrices en Matlab; la ms utilizada es el operador multiplicacin matricial *, el mismo operador que para la multiplicacin escalar pero sin el punto. La otra es la funcin mtimes mtimes(x, y) Multiplica las matrices x e y siempre que sus dimensiones sean

compatibles, esto es, la traspuesta de y debe tener exactamente el mismo nmero de filas y columnas que x. Es equivalente a x*y. En cdigo existente en Matlab veremos pocas veces la funcin mtimes. Histricamente siempre se ha tendido a la brevedad, sin embargo evitar errores transparentes es importante. Un error transparente es un error no evidente viendo los resultados del cdigo paso a paso. Un caso de error transparente es confundir

Pgina 57 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


la multiplicacin matricial con la escalar con matrices cuadradas. Por ejemplo

>> x = rand(3); >> y = rand(3); >> x*y ans =

0.50380 0.92682 0.52361

1.42800 1.45590 0.90870

0.79806 1.43060 0.82197

>> x.*y ans =

0.210474 0.055776 0.457864

0.435326 0.279980 0.282493

0.274738 0.101831 0.252486

La diferencia entre las dos matrices no es evidente. Si nuestro resultado dependiera de este clculo sera prcticamente imposible descubrir el error a no ser que sospechemos precisamente de esta operacin.

Pgina 58 de 206

CAPITULO II - MATLAB

II.IV.III. Divisin matricial


Existen dos tipos de divisin matricial aunque las dos operaciones tienen poco que ver. La divisin de un nmero puede definirse a partir de la multiplicacin invirtiendo uno de los factores. Por ejemplo

ECUACION 10 DESPEJE 1 a su vez

ECUACION 11 DESPEJE 2 Si nos fijamos en la parte derecha de las dos ecuaciones esto nos podra servir para introducir otro operador de divisin. En el caso de la primera ecuacin, en la que se invierte el segundo operando, estamos delante de la divisin usual. El nmero que se invierte es el segundo. Pero tambin podramos tratar el segundo caso como una divisin en la que el operando que se invierte es el primero. Matlab tambin tiene un operador para eso. En este caso tenemos una divisin a derechas y una divisin a izquierdas.

>> mrdivide(2,3)
Pgina 59 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


ans = 0.66667

>> mldivide(2,3) ans = 1.5000

mrdivide(x, y) Calcula la divisin a derechas de dos argumentos mldivide(x, y) Calcula la divisin a izquierdas de dos argumentos Estas dos funciones tambin tienen su equivalente en operador. La divisin a derechas se expresa mediante el smbolo /, mientras que la divisin a izquierdas se expresa con el smbolo \. Truco

Hay una regla mnemotcnica sencilla para recordar qu operador corresponde a qu operacin. A derechas o a izquierdas se refiere qu argumento es el que se invierte. En mrdivide se invierte el de la derecha, mientras que en mldivide se invierte el de la izquierda. Si vemos los dos operadores, distinguiremos el concepto

de derecha e izquierda mirando hacia dnde apunta


Pgina 60 de 206

CAPITULO II - MATLAB
el operador en direccin ascendente. / apunta hacia la derecha, mientras que \ apunta a la izquierda. Aunque en escalares estas dos divisiones tienen poco sentido con escalares s lo tienen si los dos operando son matrices.

a su vez

Pero de todas las operaciones la ms importante es la resolucin de sistemas de ecuaciones lineales. En cualquier caso estos sistemas de ecuaciones pueden ponerse en forma matricial como

La solucin de este sistema de ecuaciones implica que hay que realizar una divisin matricial.

Pgina 61 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Llegaremos a la solucin utilizando una divisin a izquierdas. Lo ms interesante de este operador es que hace bastantes ms cosas de las que creemos. Es la inversa de una matriz por un

vector, pero no es estrictamente necesario calcular la inversa, se puede resolver directamente el sistema de ecuaciones. Matlab tiene esto en cuenta y aplicar un algoritmo distinto dependiendo de las caractersticas de la matriz. Incluso funcionar con un sistema mal condicionado o con una matriz no cuadrada, en tal caso dar una solucin

minimizando el error cuadrtico (pseudoinversa) Ejercicio 7

Tres planos en el espacio tridimensional tienen las siguientes ecuaciones.

ECUACION 12 SISTEMA 1

Pgina 62 de 206

CAPITULO II - MATLAB
Demostrar que tienen un nico punto de

interseccin y encontrarlo resolviendo el sistema de ecuaciones.

II.IV.IV. Potencia de matrices


Al igual que con el resto de operaciones aritmticas bsicas disponemos de una funcin y un operador para la potencia de una matriz. Esta operacin slo tiene sentido para matrices cuadradas, para cualquier otra matriz dar un error. mpow(X, y) Eleva la matriz X a la y sima potencia. Es equivalente a utilizar el operador ^.

II.IV.V. Traspuesta y conjugada


Otro de los errores recurrentes si se trabaja con nmeros complejos es confundir el operador traspuesta con el operador traspuesta conjugada. transpose(X) Calcula la traspuesta de la matriz X. Es equivalente a X.'.

Pgina 63 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


ctranspose(X) Calcula la traspuesta conjugada (adjunto) de la matriz X. Es equivalente a X'. Cuando las matrices sean nicamente de nmeros reales ambas operaciones sern equivalentes pero confundirlos en el caso de nmeros complejos puede ser un error difcil de encontrar. Truco

Como hemos visto, existe el riesgo real de confundir operaciones escalares y matriciales, lo que puede generar errores catastrficos difciles de solucionar. Un truco til para depurar estos errores es sustituir las operaciones matriciales por las funciones equivalentes correspondientes: mpow, transpose, mldivide...

Pgina 64 de 206

CAPITULO II - MATLAB

II.V. Control de Flujo de Ejecucin


En la introduccin hemos incidido en el hecho que Matlab es un lenguaje de programacin pero an no hemos visto cmo se implementan algunas de las caractersticas que todos los lenguajes tienen en comn. Todos los lenguajes permiten controlar el flujo de la ejecucin del programa con bucles y condicionales. En esta seccin aprenderemos las particularidades de Matlab al respecto

II.V.I. Iteradores
En los manuales de Matlab escritos con poco cuidado siempre se trata la sentencia for como un mtodo para generar bucles en la ejecucin del programa. Rigurosamente hablando se trata de un iterador. La manera ms habitual de utilizar la sentencia es como sigue:

for i = 1:5 disp(i) end

1
Pgina 65 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


2 3 4 5

Esto parece un bucle as que an no entendemos muy bien en qu se diferencia un bucle de un iterador. La parte ms importante de un bucle es un ndice que se va incrementando a medida que el flujo de ejecucin entra en l. Si el ejemplo anterior fuera un bucle cada vez que la ejecucin pasa por la sentencia for la variable i se incrementara en una unidad seguira corriendo. Pero no es esto lo que sucede

for i = 1:5 disp(i) i=i+5; end

1 2 3 4 5

Hemos incrementado el ndice manualmente pero la sentencia for ha asignado el nuevo nmero al ndice cada vez que el flujo de ejecucin ha pasado por l. *La sentencia for itera el ndice i por la secuencia 1:5 *.
Pgina 66 de 206

CAPITULO II - MATLAB
Lo entenderemos an mejor con el siguiente ejemplo

for i = [1,4,3,2,9] disp(i) end

1 4 3 2 9

Le hemos pasado a la sentencia for un iterable, en este caso un vector, y el ndice ha ido avanzando por el mismo hasta el final. En otros lenguajes de programacin podemos definir iterables para simplificar el control de flujo pero en Matlab slo podemos iterar sobre vectores. Tambin podemos iterar sobre matrices pero sin contradiccin con la afirmacin anterior. Lo nico que har Matlab ser avanzar el ndice por cada una de las columnas.

II.V.II. Condicionales
El otro elemento esencial del control de flujo en cualquier lenguaje de programacin es la ejecucin condicional de bloques de cdigo. En Matlab, como

Pgina 67 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


en cualquier lenguaje de programacin creado por una mente mnimamente sana, la palabra clave correspondiente es if. A continuacin un breve ejemplo

a = zeros(4,4); for i = 1:4 for j = 1:4 if i==j a(i,j) = 2; elseif j == 4 a(i,j) = -1; else a(i,j) = 0; end end end

a = 2 0 0 0 0 2 0 0 0 0 2 0 -1 -1 -1 2

Este fragmento de cdigo es bastante autoexplicativo.

Pgina 68 de 206

CAPITULO II - MATLAB

II.VI. Representacin Grfica


La representacin de cualquier serie de datos es uno de los puntos fuertes de Matlab. Dispone de funciones para representar series de puntos, superficies, curvas de nivel... Prcticamente cualquier cosa puede representarse grficamente en Matlab aunque aqu nos centraremos en los comandos ms simples

II.VI.I. Curvas en el plano


La necesidad ms simple de la representacin grfica es disponer de dos series de datos x e y y representar en el plano la serie de datos siendo x la coordenada del eje de abscisas e y la coordenada del eje de ordenadas. Esta operacin se lleva a cabo mediante la funcin plotindependientemente de la complejidad de los datos. plot (...) Representa series de datos en el plano. Las posibilidades de uso de esta funcin son infinitas y la ayuda, que no se reproducir aqu, es de las ms extensas del lenguaje.

Pgina 69 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Para que nos hagamos una idea aproximada de la potencia del comando plot sirvan estos tres ejemplos.

GRAFICO 4 GRAFICA DEL SENO

>> plot([1,2,3,2,1]);

Pgina 70 de 206

CAPITULO II - MATLAB
Figura generada por el comando anterior

>> x = linspace(-pi,pi,64); >> plot(x,sin(x))

Figura generada por el comando anterior

GRAFICO 5 GRAFICA DEL SENO SEGMENTADO

>> x = linspace(-pi,pi,64); >> plot(x,sin(x),'ro','markersize',5)

Pgina 71 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Figura generada por el comando anterior El comando plot puede recibir una cantidad infinita de argumentos pero debemos agruparlos de una manera caracterstica. Los dos primeros argumentos sern siempre datos, ya sean vectores o matrices. El tercer argumento ser una cadena de dos caracteres con una letra, designando el color, y un smbolo, designando el tipo de lnea o marcador. Seguidamente se pueden modificar los atributos tales como el grosor de la lnea, el tamao del marcador... Una vez terminado un grupo se puede empezar otra vez con dos argumentos con datos y as indefinidamente.

II.VI.II. Figura activa


Lo ms importante de representar grficos en Matlab es el concepto de figura activa. Matlab puede tener abiertas centenares de ventanas al mismo tiempo pero slo podr representar datos en una: la figura activa. Podemos controlar dicha figura mediante el comando figure figure(n) Comando que crea una nueva figura o selecciona como activa la figura dada. Cada figura tiene asignada un nmero entero, si n es una figura no existente crear una nueva y la activar, si n existe activar la figura correspondiente.

Pgina 72 de 206

CAPITULO II - MATLAB
Otra consideracin importante es que cada vez que representemos datos en la figura activa todo lo que est ya en ella se va a borrar. Este comportamiento no es el deseado en muchos casos y puede modificarse mediante el comando hold hold Cambia el comportamiento de la ventana activa. Funciona como un interruptor: hold on hace que cada dato se represente sobre lo anterior y hold of borra la ventana antes de pintar en ella. Por omisin se encuentra en off. Un comando bastante til es clf, que borra la figura activa.

II.VI.III. Etiquetas
El paso siguiente es poner etiquetas: un identificador para cada eje y un ttulo si lo creemos necesario. Las etiquetas se aplicarn, tal como se ha justificado en la seccin anterior, slo en la ventana activa. title(str) Aade un ttulo a la figura activa xlabel(str) Aade una etiqueta al eje x de la ventana activa
Pgina 73 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


ylabel (str) Aade una etiqueta al eje y de la ventana activa Por ejemplo

x = linspace(0,500,10000); plot(x,exp(x/100).*sin(x)); title('Una funcion cualquiera') xlabel('Tiempo') ylabel('Amplitud')

Con el cdigo anterior se obtiene la siguiente figura:

Pgina 74 de 206

CAPITULO II - MATLAB

GRAFICO 6 FIABILIDAD DEL LMITE

Ejemplo de etiquetas

Pgina 75 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


El paso siguiente es dotar a los grficos con ms de una curva de una leyenda que las distinga. Esto se consigue mediante la

funcinlegend. legend(...) Al igual que con plot podemos utilizar esta funcin de mltiples maneras. La ms simple es pasarle como argumento tantas cadenas de caracteres como curvas hayamos representado y automticamente asignar por orden cada curva al identificador. Supongamos que queremos representar el seno hiperblico y el coseno hiperblico y para distinguirlos no nos vale acordarnos que Matlab siempre pinta la primera curva en azul y la segunda en verde. Para ello podemos hacer lo siguiente:

x = linspace(-pi,pi,100); plot(x,sinh(x),x,cosh(x)); legend('seno hiperbolico','coseno hiperbolico');

Pgina 76 de 206

CAPITULO II - MATLAB

GRAFICO 7 HIPERBLICOS

Pgina 77 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Ejemplo de aplicacin de la leyenda

II.VI.IV. Otros comandos


No todas las curvas en el plano pueden representarse a partir del comando plot por los ejes que utiliza. En algunos casos nos vemos obligados a utilizar otros sistemas de coordenadas o a cambiar las referencias de los ejes. Estas funciones nos pueden ser de utilidad. semilogx (...) Su uso y funcionamiento es idntico al de la funcin plot. Representa grficamente una serie de puntos tomando logaritmos en el eje x. semilogy(...) Su uso y funcionamiento es idntico al de la funcin plot. Representa grficamente una serie de puntos tomando logaritmos en el eje y. loglog(...) Su uso y funcionamiento es idntico al de la funcin plot. Representa grficamente una serie de puntos tomando logaritmos en ambos ejes. polar(...) Su uso y funcionamiento es idntico al de la funcin plot. Representa grficamente una serie de datos en coordenadas polares. El primer

Pgina 78 de 206

CAPITULO II - MATLAB
argumento corresponde al ngulo respecto a la direccin principal segundo a la distancia respecto al centro de referencia . 1. Un ejemplo de uso de la y el

funcin polar es el siguiente

>> x = linspace(-pi,pi,100); >> polar(x, cos(2.*x));

Pgina 79 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

GRAFICO 8 POLARIDAD

Ejemplo de grfica en coordenadas polares

II.VI.V. Plot handles


Cada comando cuya salida se expresa en una figura puede tambin devolver un
Pgina 80 de 206

CAPITULO II - MATLAB
argumento llamado plot handle. Utilicemos como ejemplo la figura anterior.

>> x = linspace(-pi,pi,100); >> h = polar(x, cos(2.*x));

Entonces,

parte

de

representar

la

curva, h es una variable que contiene toda la informacin correspondiente a la misma y dentro del lxico de Matlab suele recibir el nombre de handle. Con toda la la la sus

funcin get podemos informacin

obtener

del handle y

mediante cambiar

funcin setpodemos

propiedades segn nuestras necesidades. Lo ms interesante es que no slo las curvas devuelven un handle; todos los objetos grficos, incluso los ejes o la propia figura genera un handle. get(h) Funcin que obtiene las caractersticas de un handle grfico, ya sea una curva, los ejes de la figura o la misma figura set(h, attr, val)

Pgina 81 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Funcin que modifica las caractersticas de un handle grfico, ya sea una curva, los ejes de la figura o la misma figura. Los argumentos siempre son, por este orden: H: Attr : Val : El handle Un atributo vlido del handle como cadena de caracteres El nuevo valor del atributo.

En el caso de las curvas o de la propia figura es la propia funcin

(plot, semilogx o figure ) la que genera tambin utilizar las que

el handle pero podemos funciones

devuelven handles como argumentos de salida. gca() No necesita ningn

argumento. Devuelve el handle de

Pgina 82 de 206

CAPITULO II - MATLAB
los ejes de la figura activa. gcf() No necesita ningn argumento. Devuelve el handle de la figura activa Utilizamos algunos de estos comandos en el ejemplo siguiente:

p=plot([1, 2,3,2,1]); set(p,'lin ewidth',2) ; set(p,'mar ker','o'); set(p,'mar kersize',1 2); set(p,'mar kerfacecol or','y'); set(p,'mar keredgecol or','r');
Pgina 83 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


t=title('P irmide'); set(t,'fon tsize',14) ; set(t,'col or','g');

Pgina 84 de 206

CAPITULO II - MATLAB

GRAFICO 9 DOBLE LINEABILIDAD

Pgina 85 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Ejemplo de uso de set Subplots

Pgina 86 de 206

CAPITULO II - MATLAB

II.VII. Representacin de datos en el plano


II.VII.I. Ejercicio de sntesis
El objetivo de este ejercicio es volver al ejercicio de sntesis en el que estudibamos la convergencia de las series de Taylor. Vimos que, a medida que aadamos trminos a la serie esta se acercaba al valor de la funcin en las cercanas del punto en el que se calculaba. El resultado al que llegamos era una serie de puntos que lo demostraba para la funcin exponencial. Aprovechando que ya disponemos de una funcin que genera las series vamos a representar grficamente la funcin junto con una serie de desarrollos de Taylor con distinto orden. Despus representaremos el error de la aproximacin restando el desarrollo a la funcin y finalmente el error en funcin del orden en dos puntos cercanos al origen.

clf clear all

Pgina 87 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


exp_serie = @(x,n) polyval(1./[factorial(linspace(n,1,n)),1],x);

figure(1) x = linspace(0,3,100); plot(x,exp(x),... x,exp_serie(x,1),... x,exp_serie(x,2),... x,exp_serie(x,3),... x,exp_serie(x,4),... x,exp_serie(x,5)); legend('exacta','n=1','n=2','n=3','n=4','n=5'); title('Desarrollos de Taylor de una funcion exponencial en x=0'); xlabel('x') ylabel('y')

figure(2) semilogy(x,exp(x)-exp_serie(x,1),... x,exp(x)-exp_serie(x,2),... x,exp(x)-exp_serie(x,3),... x,exp(x)-exp_serie(x,4),... x,exp(x)-exp_serie(x,5)); legend('n=1','n=2','n=3','n=4','n=5'); hold on semilogy([0.1,0.1,0.1,0.1,0.1],[... exp(0.1)-exp_serie(0.1,1),...

Pgina 88 de 206

CAPITULO II - MATLAB
exp(0.1)-exp_serie(0.1,2),... exp(0.1)-exp_serie(0.1,3),... exp(0.1)-exp_serie(0.1,4),... exp(0.1)-exp_serie(0.1,5),... ],'ko')

semilogy([0.2,0.2,0.2,0.2,0.2],[... exp(0.2)-exp_serie(0.2,1),... exp(0.2)-exp_serie(0.2,2),... exp(0.2)-exp_serie(0.2,3),... exp(0.2)-exp_serie(0.2,4),... exp(0.2)-exp_serie(0.2,5),... ],'ko')

xlabel('x') ylabel('exp(x)-p_n(x)') title('Error de las aproximaciones') figure(3) semilogy([0,1,2,3,4,5,6,7,8],[exp(0.1),... exp(0.1)-exp_serie(0.1,1),... exp(0.1)-exp_serie(0.1,2),... exp(0.1)-exp_serie(0.1,3),... exp(0.1)-exp_serie(0.1,4),... exp(0.1)-exp_serie(0.1,5),... exp(0.1)-exp_serie(0.1,6),... exp(0.1)-exp_serie(0.1,7),... exp(0.1)-exp_serie(0.1,8)],... 'ko') hold on
Pgina 89 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


semilogy([0,1,2,3,4,5,6,7,8],[exp(0.2),... exp(0.2)-exp_serie(0.2,1),... exp(0.2)-exp_serie(0.2,2),... exp(0.2)-exp_serie(0.2,3),... exp(0.2)-exp_serie(0.2,4),... exp(0.2)-exp_serie(0.2,5),... exp(0.2)-exp_serie(0.2,6),... exp(0.2)-exp_serie(0.2,7),... exp(0.2)-exp_serie(0.2,8)],... 'bo') legend('punto 0.1', 'punto 0.2'); axis([-0.1,8.1,1e-16,1e1]); xlabel('Orden') ylabel('exp(x)-p_n(x)') title('Convergencia de aproximaciones')

Pgina 90 de 206

CAPITULO II - MATLAB

GRAFICO 10 EXPONENCIAL La funcin exponencial y sus desarrollos de Taylor en el origen hasta orden 5.

Pgina 91 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

Pgina 92 de 206

CAPITULO II - MATLAB

GRAFICO 11 LOGARITMICA

Error del desarrollo. Los puntos son los valores en las abscisas x=0.1 y x=0.2 respectivamente

Pgina 93 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Convergencia en funcin del orden.

Pgina 94 de 206

CAPITULO II - MATLAB

II.VIII. Estadstica Descriptiva y anlisis de datos


En este captulo nos centraremos en los clculos ms bsicos de la Estadstica Descriptiva y de los modelos de datos con Matlab. Esta pequea introduccin no cuenta con una descripcin terica de los clculos as que se suponen conocimientos bsicos de Estadstica. En vez de describir de forma sistemtica las funciones como en las secciones anteriores, avanzaremos siguiendo un ejemplo. Advertencia

Algunas de las funcionalidades ms especficas para el tratamiento estadstico de datos con Matlab se encuentran en el Statistics Toolbox y deben adquirirse a parte.

Pgina 95 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

II.VIII.I. Distribuciones de frecuencias


Cuando analizamos datos la primera pregunta que debemos hacernos es si se ajustan a algn patrn. Los datos pueden ser muy numerosos y estar dispersos as que un ordenador nos puede ser de gran utilidad. Detectar el patrn depende en gran medida de la complejidad de los datos; no es lo mismo analizar cmo funciona una ruleta en un casino que hacer lo mismo con un resultado electoral en Estados Unidos. Supongamos que estamos ante una serie de datos como, por ejemplo, la cotizacin de las acciones de Google en la apertura y cierre de NASDAQ durante cuatro aos. Nota

Nota

Antes de entrar en el tema de la persistencia lo nico que debemos saber a estas alturas es que para cargar estos dos archivos basta con utilizar el comando load. op = load('googopen.dat'); cl = load('googclse.dat');

Pgina 96 de 206

CAPITULO II - MATLAB
En vez de analizar los datos de apertura y cierre nos centraremos en la diferencia entre ambos valores, la cotizacin de la sesin, mucho ms fciles de analizar. En breve veremos el porqu. Lo primero que podemos calcular es el histograma de nuestros datos. Podemos hacerlo de dos maneras: representando grficamente el histograma con hist o calculando las frecuencias con histc y utilizando el comando plot

dif = cl-op bins = linspace(min(dif),max(dif),30) freq = histc(dif,bins); plot(bins,freq); xlabel('Diferencial') ylabel('Frecuencia')

Pgina 97 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

GRAFICO 12 ASCENDENCIA El histograma est slo a un paso de la FDP (Funcin Densidad de Probabilidad) obtenida a partir de los datos. Para ello la funcin definida por las frecuencias deber cumplir la siguiente propiedad:

ECUACION 13 INTEGRAL 1

Pgina 98 de 206

CAPITULO II - MATLAB
Para normalizar nuestro histograma basta con dividir las frecuencias por el valor de su integral utilizando la funcin trapz

pdf = freq/trapz(bins,freq);

II.VIII.II. Medidas de concentracin


Las siguientes funciones sirven para calcular las medidas de tendencia central de una muestra. mean(x, dim) Calcula la media aritmtica de una muestra. dim sirve para seleccionar la dimensin a travs de la cual se calcula la media en el caso que los datos tengan forma de matriz. geomean(x, dim) Funcionamiento idntico a mean. Calcula la media geomtrica de una muestra. harmmean(x, dim) Funcionamiento idntico a mean. Calcula la media armnica de una muestra. median(x, dim) Funcionamiento idntico a mean. Calcula la mediana de una muestra.

Pgina 99 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

II.VIII.III. Medidas de dispersin


Hay dos definiciones para la desviacin tpica. En algunos libros se llaman respectivamente

cuasidesviacin tpica y desviacin tpica. En Matlab, por defecto, la desviacin tpica ser calculada con

ECUACION 14 DESVIACIN std(x, flag, dim) Calcula la desviacin estndar de una muestra. Si el argumento flag se omite o flag = 0 se utiliza la definicin anterior de la desviacin tpica. Si se introduce el valor de flag = 1 entonces se utiliza la definicin alternativa de la desviacin tpica. La definicin alternativa es

var(x, flag, dim) Calcula la varianza de una muestra. Es el cuadrado de la desviacin tpica.

Pgina 100 de 206

CAPITULO II - MATLAB

II.IX. Funciones de densidad de probabilidad conocidas


Siendo rigurosos el histograma da toda la informacin que necesitamos sobre nuestros datos pero para tomar hiptesis sobre los mismos el paso siguiente suele ser encontrar alguna funcin de densidad de probabilidad conocida que se ajuste bien. La ms habitual cuando el

Pgina 101 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


histograma parece simtrico es la distribucin Normal o de Gauss.

normpdf(x, mu, sigma) Calcula el valor de la funcin densidad de probabilidad en x dados la media mu, y la desviacin tpica sigma, .

ECUACION 15 DESVIACION TIPICA El paso siguiente en nuestro anlisis de las acciones de Google puede ser comparar los diferenciales de las

sesiones con la distribucin normal. Para que ello ya

aprovecharemos

hemos calculado la FDP de nuestros datos y la

representaremos junto con la normal.

Pgina 102 de 206

CAPITULO II - MATLAB
plot(bins,pdf,bins,no rmpdf(bins,mu,sig)); xlabel('Diferenciales ') ylabel('Probabilidad' ) legend('Histograma',' Normal');

GRAFICO 13 HISTOGRAMA

Pgina 103 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

Comparacin con la FDP Normal dos a de maneras las de

Hay

acceder densidad

funciones

probabilidad,

cada una tiene su propia funcin terminada en pdf, como betapdfo lognpdf p ero podemos utilizarlas todas con la funcin pdf. pdf (nombre, x, a, b, c) Calcula el valor de la FDP de nombre nombre en el punto x. El nmero de parmetros necesarios para realizar el clculo depende de la FDP. Por ejemplo, si nombre es 'norm' tendremos que proporcionar dos

parmetros, si es 't' para la distribucin t de Student bastar con un parmetro.

Pgina 104 de 206

CAPITULO II - MATLAB

II.X. Integracin y Ecuaciones Diferenciales Ordinarias


Este captulo trata sobre dos disciplinas bastante extensas dentro del Clculo Numrico. El motivo es que existen muchos mtodos para integrar una funcin o una ecuacin diferencial y algunos funcionarn mejores que otros segn el caso. Nos centraremos en las integrales definidas

y en los problemas de Cauchy; ecuaciones diferenciales ordinarias en los que conocemos la ecuacin diferencial y las condiciones iniciales del sistema

ECUACION 16 DERIVADAS

Pgina 105 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


El resultado del primer problema es bien un nmero o una funcin que depende de los lmites de integracin. El resultado del segundo problema es una trayectoria en el espacio .

II.X.I. Integracin Numrica


La complejidad de la integracin depende de las dimensiones de nuestro problema. Si queremos integrar una funcin con slo una variable entonces

necesitaremos la funcin (definida como funcin annima) y dos escalares que harn de lmites de integracin. Si la funcin depende de dos variables la

cosa se complica porque el lmite de integracin es una curva en el plano. Para esta introduccin nos frenaremos en el caso ms fcil. quad(fun, a, b) Calcula la integral definida de una funcin entre los intervalos de integracin a y b. fun debe ser una funcin annima. Por ejemplo, supongamos que queremos saber la probabilidad que el siguiente suceso de un fenmeno de media 5.4 y desviacin tpica 0.4 tenga un valor mayor que 7.

>> mu = 5.4; >> sig = 0.4; >> f = @(t) normpdf(t,mu,sig); >> prob = quad(f,7,100)

Pgina 106 de 206

CAPITULO II - MATLAB

prob =

3.2601e-05

Este sencillo ejemplo nos sirve para entender perfectamente cmo funciona la funcin quad. Hay otras variables de entrada y de salida como la tolerancia en la integracin o la estimacin del error de la operacin. Podemos obtener ms informacin del clculo anterior con

>> [prob,err] = quad(f,7,100,1e-10)

prob =

3.1671e-05

err = 65

En este caso hemos exigido al algoritmo un error entre la precisin simple y la doble precisin y hemos pedido tambin que nos muestre el nmero de veces que ha evaluado la funcin para llegar al resultado. Nos ha servido para comprobar que el error de la primera integracin ronda el 3% Otra funcin para realizar exactamente la misma operacin es quadl quadl(fun, a, b)
Pgina 107 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Ver funcin quad. Segn la documentacin de Matlab quadl es ms efectivo cuando se pide mayor precisin con una funcin sin demasiadas oscilaciones. Para comprobar que muchas veces la documentacin no se cumple intentaremos hacer la misma integral con el algoritmo alternativo.

>> [prob,err] = quadl(f,7,100,1e-10)

prob =

3.1671e-05

err = 138

Vemos que necesita ms evaluaciones para llegar al mismo resultado con la misma precisin. Si queremos hacer la integral impropia (aunque es convergente), tanto quad como quadl fallan. S podemos utilizar quadgk para ello

>> [prob,err] = quadgk(f,7,Inf)

prob =
Pgina 108 de 206

CAPITULO II - MATLAB

3.1671e-05

err = 3.1140e-17

Utilizando la FDP normal acumulada podemos obtener el resultado correcto.

>> 1-normcdf(7,5.4,0.4)

ans =

3.1671e-05 Advertencia

El ejemplo anterior demuestra que la integracin numrica, aunque en la mayora de los casos no entraar ninguna dificultad, puede proporcionar resultados imprecisos. En algunos casos puede ser una buena idea comprobar los resultados de forma aproximada. Lo mismo puede decirse de la integracin bidimensional y tridimensional.

Pgina 109 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Nota

La integracin en ms de una dimensin tiene fronteras ms complejas. En la integracin bidimensional es una curva cerrada en el plano y en la tridimensional una superficie tambin cerrada. Las funciones dblquad y triplequad slo lmites constantes. permiten integrar con

II.X.II. Integracin de problemas de Cauchy


Los sistemas de ecuaciones diferenciales no lineales suelen no tener solucin analtica. Es entonces un coto particular del Clculo Numrico y Matlab cuenta con una gran artillera de herramientas para resolver estos problemas. Lo aprendido ser fcilmente aplicable a los problemas de condiciones de contorno. Por lo que respecta a los problemas lineales, Matlab dispone tambin de funciones especficas para resolverlos en el espacio de Laplace. Nos centraremos en los problemas de condiciones iniciales o problemas de Cauchy. Para resolverlos necesitaremos la funcin

Pgina 110 de 206

CAPITULO II - MATLAB
del sistema, las condiciones iniciales y el intervalo de tiempos de la solucin. Desde un punto de vista puramente prctico lo nico que debemos saber para resolver estos problemas satisfactoriamente es si el problema es stiff o no. Para entender el significado de la rigidez de un sistema es muy recomendable seguir un buen curso sobre resolucin numrica de ecuaciones en derivadas parciales. Aqu slo diremos que un sistema es stiff cuando introduce gradientes fuertes y un mtodo de integracin explcito es incapaz de resolverlos. El ejemplo clsico para entender este problema es utilizar la ecuacin del oscilador de Van der Pol.

ECUACION 17 OSCILACION FORMULADA Esta ecuacin de segundo orden es stiff con valores de elevados. Para comprobarlo podemos intentar resolver el

problema con

y la funcin ode45

Nota

Pgina 111 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Este ejemplo es tan popular que Matlab dispone ya de las funciones vdp1 y vdp1000 para y . Esta primera la vez y ecuacin a modo con de ejemplo

escribiremos la funcin vdp1 = @(t,y) [y(1);y(2)*(1-y(1))-y(1)]; [t,y] = ode45(vdp1,[0,20],[0;2]); plot(t,y(:,1)) ode45(fun, tspan, y0) Integra la funcin fun que debe ser una funcin de dos variables de la forma dy = fun (t, y) donde tanto y como dy deben ser vectores columna. tspan es un vector de dos elementos con el intervalo de tiempos e y0 es el vector de condiciones iniciales. Devuelve dos vectores de longitud arbitraria. t son los tiempos en los que se ha hallado la solucin e y es un vector que contiene los vectores solucin del problema en cada instante. Al representar la solucin llegamos al siguiente resultado.

Pgina 112 de 206

CAPITULO II - MATLAB

GRAFICO 14 OSCILACIN

Solucin del oscilador de Van der Pol para Si, por el contrario intentamos resolver el mismo problema con nos encontraremos con la desagradable

sorpresa de que el Matlab no termina nunca de calcular.

Pgina 113 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


El motivo es que en los problemas stiff el paso de tiempo necesario para que un esquema explcito como el de ode45 llegue a una solucin tiende a cero. Esto es debido a que, antes de dar una solucin errnea, el esquema de paso variable va reduciendo el paso temporal sin ninguna limitacin. Obviamente, si el paso temporal tiende a cero, el tiempo necesario para llegar a la solucin tiende a infinito. La solucin es utilizar un esquema implcito como el ode23s. Nota

En Matlab, los esquemas de integracin que terminan con unas son implcitos y pueden integrar sistemas stiff Una vez llegamos a la solucin entendemos por qu no ramos capaces de integrarla.

Solucin del oscilador de Van der Pol para

[t,y] = ode23s(@vdp1000,[0,3000],[0;2]);

Pgina 114 de 206

CAPITULO II - MATLAB
plot(t,y(:,1)) Advertencia

Sobre Octave. Aunque el paquete odeint de Octave Forge proporciona las funciones ode45 y ode23s entre otras, Octave dispone de un driver completamente distinto para resolver problemas de Cauchy llamado lsode. Para utilizarlo debemos tener en cuenta que la funcin a integrar se escribe con los argumentos permutados dy = fun(y,t) y que en la llamada, en vez de proporcionar el intervalo de

Pgina 115 de 206

GRAFICO 15 INDICE DE PARCIALIDAD

HERRAMIENTAS DE COLABORACION DIGITAL


tiempos, debemos proporcionar el vector de tiempos en los que queremos la solucin. Otra diferencia importante entre ambos es que en Matlab las opciones de los esquemas de integracin se modifican utilizando las funciones odeset y odeget, mientras que en Octave debemos utilizar la funcin lsode_options. Por ejemplo, las llamadas anteriores deberamos

efectuarlas en Octave como: %Por omisin Octave utiliza un mtodo implcito. lsode_options('integration metod','nonstiff'); t = linspace(0,20,1000); y = lsode(vdp1,[0;2],t);

Pgina 116 de 206

CAPITULO II - MATLAB

II.X.III. Programacin en Matlab


Antes de entrar en la prctica de la programacin es importante dar una pequea nota sobre paradigmas de programacin. Un paradigma es una metodologa que viene impuesta por el propio lenguaje de programacin. Los hay a decenas: programacin imperativa, estructurada, modular, orientada a objetos, diseo por contrato... Aunque Matlab soporta la programacin modular y la orientada a objetos casi toda su librera est formada por funciones, no por mdulos ni clases ni cualquier otra cosa. Esto significa que, mientras el cdigo que escribamos nosotros puede seguir prcticamente cualquier paradigma, si hacemos un uso extensivo de las funciones propias de Matlab nos veremos forzados utilizar la programacin estructurada.

II.X.IV. Funciones
as funciones que hemos visto hasta ahora no eran funciones de verdad sino funciones annimas. Aunque en muchos casos son ms prcticas que las Lfunciones es el momento de aprender a encapsular tareas apropiadamente. Abriremos el editor y escribiremos en l el siguiente cdigo:

function out = aprsin(x)


Pgina 117 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


out = x - x.^3/6;

y lo guardaremos en el directorio de trabajo con el nombre aprsin.m. Esta pequea funcin nos sirve para entender su sintaxis. Function Identificador de funcin. Las funciones sirven para encapsular tareas que dependen de argumentos de entrada y devuelven argumentos de salida. La sintaxis es la siguiente Funcin con tres argumentos de entrada y un argumento de salida: function argout = nombre(argin1, argin2, argin3) ... argout = ...

y y y

y y

Funcin con dos argumentos de entrada y dos de salida: function argin2) ... argout1 = ... argout2 = ... [argout1, argout2] = nombre(argin1,

y y

Una funcin puede depender de cualquier cantidad de argumentos de entrada y de salida y debe cumplir siempre estos dos requisitos:

Pgina 118 de 206

CAPITULO II - MATLAB
1. Al final de la funcin todos los argumentos de salida deben tener un valor asignado 2. El nombre de la funcin (en los ejemplos nombre) es el nombre por el que se podr llamar la funcin y el nombre con el que deber guardarse en el directorio de trabajo. Cualquier error en uno de los dos puntos anteriores har que la funcin o bien de un error o no podamos llamarla correctamente.

II.XI. Diseo de aplicaciones en Matlab


En ninguno de los muchos libros, cursos, introducciones o tutoriales a Matlab se trata un tema tan esencial como la manera correcta de estructurar un programa en Matlab. Matlab no es, por desgracia, un lenguaje pensado para grandes aplicaciones sino para pequeos prototipos sin demasiada importancia. En las ltimas versiones, gracias a la mejora de su orientacin a objetos, ha ganado algo de entidad al respecto pero an dista de poder ser considerado un lenguaje de propsito

Pgina 119 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


general. Matlab se ha acercado a C++ y Java pero va muy a la zaga de los lenguajes dinmicos ms modernos como Python o Ruby. Se pueden disear correctamente aplicaciones de cierto tamao

independientemente del paradigma utilizado. El sistema bancario mundial se program en COBOL antes que los objetos o los mdulos hicieran acto de presencia por primera vez. Esta seccin propone una manera sistemtica de reducir cualquier problema a estructuras propias de Matlab intentando que ninguna parte del resultado parezca ajena al lenguaje. No es ms que la ensima propuesta de cmo se debe programar en Matlab as que nada la mantiene a salvo de posibles detractores. Puede ser mejor o peor que otros mtodos pero nunca hay que olvidar que un mal mtodo siempre es mejor que ninguno.

II.XI.I. Los dos axiomas


Los paradigmas de programacin son una manera sistemtica de reducir la implementacin de cualquier algoritmo. Existe la programacin procedimental, la modular, la orientacin a objetos... Pero un paradigma es lo suficientemente extenso como para permitirnos implementar un algoritmo de muchas maneras distintas. Este captulo no trata sobre paradigmas, hemos escogido de antemano un acercamiento modular; propone una manera sencilla y sistemtica de reducir la mayora de problemas a un conjunto conectado de bloques.
Pgina 120 de 206

CAPITULO II - MATLAB
La programacin es un ejercicio creativo y como tal es mucho ms fcil valorar si el resultado est bien o mal que proponer de antemano la mejor manera de resolver el problema. Es entonces un problema ms fcil de verificar que de resolver. Es tambin un proceso de diseo en el que de una serie de piezas, en este caso un lenguaje, creamos la solucin a un problema. El resultado del proceso es cdigo. El diseo axiomtico es la disciplina que pretende trasladar lo que se aprende de valorar el resultado para que, antes de empezar a trabajar, nos acerquemos ms fcilmente a una solucin ms ptima de las infinitas posibles. Toda la experiencia en el anlisis de los procesos de diseo se ha reducido a dos axiomas: Mxima independencia. Mnima informacin.

y y

Entonces la mejor manera de implementar un algoritmo ser maximizando la independencia de las unidades de programa y minimizando la informacin necesaria para que funcionen. Mxima independencia significa que cada una de sus piezas estar mejor diseada en la medida que su funcionamiento sea independiente de las dems. En palabras de Albert Einstein hay que simplificar las cosas pero no ser simplista

Pgina 121 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


.Introducir dependencias entre elementos, aunque pueda reducir su nmero, suele producir sistemas menos robustos. En el cdigo de un programa, si declaramos una variable global en el programa principal y la utilizamos en todas las unidades de programa nuestro cdigo ser monoltico por mucho que nos parezca estructurado porque esta variable global lo liga absolutamente todo. Por este mismo motivo se demoniz durante los aos setenta la clusula GOTO puesto que ligaba el algoritmo a la manera en la que se haba escrito. La informacin de un sistema es la cantidad de datos necesarios para construirlo y asegurar su funcionamiento. En un mecanismo la cantidad de informacin se correspondera a todos los datos mostrados en el plano: medidas, tolerancias, relaciones... La informacin es lo que valora la simplicidad del producto. Este axioma es un poco ms complejo en nuestro caso porque es difcil definir la cantidad de informacin que contiene un cdigo. Mi visin personal es que el propio cdigo es informacin as que en la medida que nuestro cdigo sea ms extenso necesitaremos ms informacin para entenderlo y hacerlo funcionar. Quen tenga un poco de experiencia programando sabr que estos dos axiomas entran en conflicto. Los cdigos puramente monolticos suelen ser ms cortos que los modulares. Romper un algoritmo en rutinas y funciones para maximizar la independencia requiere tiempo y esfuerzo y hace que el programa crezca,

Pgina 122 de 206

CAPITULO II - MATLAB
aumentando por lo tanto la informacin que contiene. Una buena metodologa de programacin encontrar el compromiso entre estos dos axiomas. Este captulo propone una metodologa para el diseo de aplicaciones con Matlab utilizando la programacin modular. Para intentar cumplir los dos axiomas buscar: Definir unidades de programa independientes a partir de los datos. Sistematizar el desarrollo para que sea aplicable en cualquier caso.

y y

II.XI.II. Parmetros y variables.


La pieza fundamental de cualquier algoritmo en matemticas son las funciones. Estas funciones dependen de parmetros, que no cambian en el algoritmo, y variables. Por ejemplo, si queremos saber cmo cambia la presin de un gas en funcin de la temperatura a bajas presiones utilizaremos la ecuacin de estado para los gases perfectos

Las variables de esta ecuacin son la densidad y la temperatura mientras que la constante de los gases ideales depende del gas para el que calculemos la

relacin. Ser por lo tanto un parmetro. La diferencia esencial entre variables y parmetros es que nuestra solucin depende de los parmetros mientras que las variables son parte de la solucin. En
Pgina 123 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


este caso la ecuacin de estado debe depender de la densidad y la temperatura. Si nuestro resultado no depende de ninguna variable ser una constante pero desgraciadamente no ser as. Esto nos permite crear dos reglas sencillas para descomponer cualquier algoritmo en unidades de programa abstractas llamadas bloques: Un bloque depende de parmetros y de funciones. Los argumentos de salida de los bloques son funciones.

y y

Para entender el uso de estas dos reglas las aplicaremos a varios casos de dificultad creciente. Para empezar tomaremos la ecuacin del oscilador de Van der Pol. Supongamos que nos piden la solucin de esta ecuacin diferencial no lineal de segundo orden.

ECUACION 18 ECIACION DIFERENCIAL Para ello nos sugieren representar grficamente la solucin para un conjunto de diez valores de . Se nos pide resolver el problema de la integracin de una EDO diez veces con un parmetro, algo que para un principiante puede representar un serio problema.

Pgina 124 de 206

CAPITULO II - MATLAB
El primer paso es diferenciar los parmetros de las variables. En este caso es el nico parmetro mientras que y el tiempo son las variables.

El bloque crear una funcin que depender de x y t a partir del parmetro . Para ello utilizaremos el handle @ de Matlab para hacer que el argumento de salida sea una funcin.

function y = modvdp(mu) %% %% Modulo. %% %% Argumentos de entrada: %% %% %% %% Argumentos de salida: %% %% y: @(t,x) Ecuacion de Van der Pol mu: parametro del amortiguamiento no lineal Generador de la ecuacion de Van der Pol

y = @(t,x) [x(2); mu*(1-x(1).^2)*x(2)-x(1)]; Truco

Cuando un mdulo slo proporciona una funcin puede reducirse a una nica funcin annima. Por ejemplo en el caso del mdulo anterior >> modvdp = @(mu) @(t,x) [x(2); mu*(1-x(1).^2)*x(2)-x(1)];

Pgina 125 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Ahora podemos utilizar el argumento de salida del mdulo modvdp como argumento de entrada de la funcin de integracin ya sea lsode en Octave o ode45 en Matlab. Si analizamos esta manera de implementar la fsica del problema con los dos axiomas vemos que el bloque es completamente independiente del resto de funciones y que lo nico que necesita para funcionar es el parmetro . A continuacin aplicaremos estas dos reglas a ejemplos de dificultad creciente. Ejemplo. La atmsfera estndar (ISA) Ejemplo. El saque de Andy Roddick

y y

II.XII. Persistencia
En programacin, la persistencia se refiere a la capacidad de guardar el contenido de una variable en un archivo.

II.XII.I. Archivos binarios


Podemos guardar los datos de dos maneras: utilizando un formato leble para los humanos (normalmente ASCII) o utilizando un formato binario comprensible por el ordenador. Es necesario enfatizar que esto se trata nicamente de la manera
Pgina 126 de 206

CAPITULO II - MATLAB
de escribir, un archivo binario y otro en ASCII pueden contener exactamente los mismos datos. La diferencia es que mientras que podemos leer un archivo ASCII slo viendo cmo est escrito es imposible realizar ingeniera inversa con un archivo binario. Lo anterior significa que para leer un archivo binario tenemos que saber de antemano cmo leerlo. La solucin ms habitual a este problema es utilizar un formato conocido y explicitndolo en la extensin. Por ejemplo, si utilizamos el formato propio de Matlab podemos utilizar la extensin .mat, mientras que si utilizamos el formato HDF5 la extensin ms habitual es la .h5.

Importante

Un archivo binario suele ocupar unas ocho veces menos espacio en memoria que uno en ASCII con los mismos datos. Advertencia

Que el formato de archivo cambie cada versin implica que se rompe la compatibilidad hacia atrs. Si guardamos un archivo en Matlab 7.7 no podr leerse con un Matlab 7.0 y obviamente tampoco con un Matlab 6.5. Si necesitamos

Pgina 127 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


soportar versiones anteriores de Matlab lo tendremos que indicar al utilizar el comando de escritura en disco correspondiente. Obviamente s existe compatibilidad hacia adelante, esto es, un archivo escrito por Matlab 6.5 podr leerse sin problemas en Matlab 7.7.

Pgina 128 de 206

CAPITULO II - MATLAB

II.XIII. Estudio del pndulo invertido


Un pndulo es uno de los juguetes ms bsicos para experimentar los conceptos de periodo y gravedad. Qu sucede si la masa se une a una barra rgida y se pone al revs? Entonces se obtiene un pndulo invertido, un sistema aparentemente inestable que es un ejemplo clsico para el control automtico.

Pgina 129 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

GRAFICO 16 PENDULO Esquema de un pndulo invertido con movimiento horizontal. Una de las claves del pndulo invertido es intentar controlar el movimiento de la masa moviendo el otro extremo de la barra. En el ejemplo del carrito se demuestra

Pgina 130 de 206

CAPITULO II - MATLAB
que la barra se puede mantener en posicin vertical para una perturbacin dada lo suficientemente pequea [INV]. Existe otra posibilidad, la de mantener la barra en posicin vertical moviendo la base del pndulo tambin con una trayectoria vertical como se muestra en la figura siguiente:

GRAFICO 17 PENDULO 2 Esquema de un pndulo invertido con movimiento vertical. En este caso, la masa tiene la siguiente posicin:

Pgina 131 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


y la siguiente velocidad:

La lagrangiana del sistema es entonces:

Y la ecuacin del movimiento:

El paso siguiente es suponer que el ngulo instante.

se mantiene pequeo en cualquier

Supuesto un movimiento armnico de la base del pndulo valor del parmetro para el que el pndulo deja de ser estable.

, obtener el

Representar grficamente el movimiento de la partcula respecto al tiempo a dimensional con k = 0.1 y k = 10. En todos los casos la longitud

del pndulo ser de 0.1 metro y la gravedad de 9.8 metros por segundo. Solucin El concepto subyacente en este ejercicio es la importancia de adimensionalizar las ecuaciones. No es momento de nombrar las ventajas de utilizar el teorema pero

Pgina 132 de 206

CAPITULO II - MATLAB
s podemos demostrar que tras un poco de manipulacin es sencillo llegar a conclusiones simplemente echndole un vistazo a la expresin resultante. Pero antes hay que adimensionalizar, para ello escogemos una longitud caracterstica , la amplitud del forzado y un tiempo caracterstico aceleracin caracterstica ser entonces Con todo lo anterior se define un tiempo a dimensional y una longitud a . La

dimensional . Adimensionalizando la ecuacin anterior e introduciendo la expresin del forzado se obtienen la siguiente expresin

Donde el operador significa la derivada respecto al tiempo adimensional . Linealizando la ecuacin para ngulos pequeos

Dividiendo ambos lados por

...

En la que finalmente aparece el parmetro propuesto

que es el parmetro

que relaciona la aceleracin debida a la gravedad con las aceleraciones debidas al forzado.

Pgina 133 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Con el simple hecho de adimensionalizar podemos comparar la importancia del trmino derivada segunda respecto al trmino con mediante el siguiente nmero a dimensional

Con este primer nmero adimensional podemos comprobar que la ecuacin diferencial se comportar de un modo u otro segn su valor. Si pequea la ecuacin resultante ser es muy

Que tiene como solucin

, un crecimiento lineal con el tiempo se haga

adimensional. Esto suceder justamente cuando el numerador de cero, esto es:

. En cualquier otro instante la solucin ser puramente

armnica. Entonces parece razonable pensar que si el numerador nunca se anula entonces el sistema ser estable. Para ello bastar que k sea mayor que 1 aunque como se ver a continuacin no es un lmite estricto. Para plantear la ecuacin se hace el cambio de variable y para

poder expresar la ecuacin de segundo orden en forma de sistema de ecuaciones Nota

Pgina 134 de 206

CAPITULO II - MATLAB
Las condiciones iniciales del problema son importantes. Este sistema se encuentra en una posicin de equilibrio inestable en , esto significa que si el

sistema no se perturba en absoluto seguir indefinidamente en dicha posicin. En este caso cualquier perturbacin, tanto en velocidad como en desplazamiento, ser suficiente para sacar el sistema de su equilibrio pero podra suceder que fuera tan pequea que no lo notara. El sistema puede atenuar, mantener o amplificar la perturbacin dependiendo de su propia naturaleza pero debemos tener muy en cuenta que la solucin final depender de las condiciones iniciales y de la perturbacin elegida.

Una solucin al estudio del problema se presenta a continuacin.

clear clc %% Solucion estable tau = linspace(0,4*pi,100); % Tiempo adimensional %%% Generador de la ecuacion: %%% Parametros: k,l %%% Variables: x,t genpend = @(k,l) @(x,t) [x(2),x(1)*(sin(t)-k)/l];

Pgina 135 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


%%% % k = 10 % l = 0.1 theta = lsode(genpend(10,0.1),[0.01 0],tau); %Integracion figure(1); clf; subplot(2,1,1); plot(tau,theta(:,1)); xlabel('\tau') ylabel('\theta') title('k=10') subplot(2,1,2); plot(tau,sin(tau)) xlabel('\tau') ylabel('y/a')

print -dpng 'k10.png' print -deps 'k10.eps' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Caso inestable % k = 0.1 % l = 0.1 theta = lsode(genpend(0.1,0.1),[0.01 0],tau); %Integracion

Pgina 136 de 206

CAPITULO II - MATLAB

figure(2); clf; subplot(2,1,1); plot(tau,theta(:,1)); xlabel('\tau') ylabel('\theta') title('k=0.1') subplot(2,1,2); plot(tau,sin(tau)) xlabel('\tau') ylabel('y/a')

print -dpng 'k01.png' print -deps 'k01.eps' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Comprobacion del limite de estabilidad de k=1 figure(3); clf; tau = linspace(0,10*pi,100); % Mas tiempo adimensional para comprobar la % convergencia de la solucion idx = 1; klist = [0.9,1.1,1.2];
Pgina 137 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

for k = klist theta = lsode(genpend(k,0.1),[0.01 0],tau); %Integracion subplot(3,1,idx); plot(theta(:,1),theta(:,2)); xlabel('\tau'); ylabel('\theta'); title(['k=',+num2str(k)]); idx++; end

print -dpng 'convergencia.png' print -deps 'convergencia.eps'

Pgina 138 de 206

CAPITULO II - MATLAB

te script genera las tres figuras siguientes:


GRAFICO 18 ALAGARMINETOS Y COMPRENSIONES

Pgina 139 de 206

HERRAMIENTAS DE COLABORACION DIGITAL

Ejemplo de solucin en la que la perturbacin no es amplificada por el forzado. La oscilacin se mantiene prcticamente invariable en el tiempo.

Pgina 140 de 206

CAPITULO II - MATLAB

GRAFICO 19 OSCILACION 2

Pgina 141 de 206

HERRAMIENTAS DE COLABORACION DIGITAL


Solucin con un valor de k que amplifica la perturbacin inicial. La amplificacin en el ltimo periodo del forzado es tan grande que las primeras oscilaciones quedan fuera de escala.

Pgina 142 de 206

CAPITULO II - MATLAB

Solucin de varios problemas con k distintas. Como se puede apreciar, con

Pgina 143 de 206


GRAFICO 20 GUSANOS DE PARADOJA

HERRAMIENTAS DE COLABORACION DIGITAL


una k de 1.1 la perturbacin crece haciendo que el sistema sea inestable. Esto significa que el lmite estimado de no es estricto.

Pgina 144 de 206

CAPITULO III - MATLAB

CAPTULO III III.I Mandar un cohete al espacio


Autor de la seccin: David Marchante Lpez La ecuacin fundamental del movimiento vertical de un vehculo con motor cohete es la tercera ley de Newton

Esto es, el empuje menos la fuerza de rozamiento y la gravedad es igual a la variacin de la cantidad de movimiento. Reescribiendo ligeramente esta ecuacin llegamos a que

Pgina 145 de 206

ICM- ESPOL
Es la ecuacin que relaciona las fuerzas externas con la velocidad la aceleracin y el gasto msico de combustible que abandona el cohete. Esta frmula es vlida para cualquier motor cohete ha sea de propulsarte slido o lquido. La resistencia aerodinmica se define mediante el coeficiente de resistencia

donde se conoce que el coeficiente de resistencia en vuelo puramente vertical es igual a la resistencia parsita que puede ser aproximada por esta funcin:

Luego el empuje se define mediante la expresin siguiente

La relacin de presiones en la tobera para flujo no desprendido depende nicamente de la relacin de reas entre el rea de la garganta y el rea de salida

A su vez, el gasto msico del cohete se obtiene de la expresin de la velocidad de recesin de un combustible slido dada por la siguiente frmula

Pgina 146 de 206

CAPITULO III - MATLAB


Sabiendo adems que la velocidad de recesin a una presin de 50 atmsferas es de 0.2 centmetros por segundo. Suponiendo adems que el combustible se quema frontalmente y que la superficie quemada es

aproximadamente la superficie frontal del cohete se llega a la siguiente expresin para el gasto msico:

Se realizarn las siguientes hiptesis adicionales: El cohete asciende de modo completamente vertical por una atmsfera estndar.
y

La presin en la cmara de combustin se mantiene constante e igual a 20 MPa.

El rea de la garganta ser de 0.01 frontal del cohete.

y el rea de salida ser igual al rea

En un instante inicial el cohete se encuentra posado en el suelo a nivel del mar y con el motor encendido a rgimen estacionario con la presin de cmara de combustin igual a la de diseo.

La masa inicial del cohete es de 55 kg de los cuales 50 corresponden al combustible.

La densidad del combustible slido es de 1800

Pgina 147 de 206

ICM- ESPOL
Representar en funcin del tiempo la altura, la velocidad y la aceleracin del cohete en su ascensin hasta que se termina el combustible para reas frontales de 0.4, 0.6 y 0.8

III.I.I. Frmulas adicionales


Se define la atmsfera ISA con las siguientes frmulas Gradiente trmico Temperatura a nivel del mar Presin a nivel del mar Densidad a nivel del mar La constante de los gases perfectos para el aire es
y y y y y

La constante necesaria para calcular las relaciones de presin alrededor de toberas bloqueadas en rgimen isentrpico es

Con

siempre igual a 1.4

Pgina 148 de 206

CAPITULO III - MATLAB


Solucin En esta solucin aprenderemos el que es quizs el mtodo sistemtico para modelar aplicaciones en Matlab. Se basa en dos normas esenciales En las funciones todo son argumentos. Los parmetros definien un mdulo.

y y

Cuando una variable se pone en la cabecera de la definicin de una funcin pasa a ser un argumento de entrada. En principio la funcin depender slo de estos argumentos pero esta imposicin puede plantear serias dificultades. Supongamos que tenemos que integrar una ecuacin diferencial que depende del tiempo, de una variable espacial y de un parmetro. La rutina que integra la ecuacin diferencial impone que los nicos argumentos que puede tener la funcin a integrar son precisamente el tiempo y la variable espacial. Esto obliga a definir de algn modo alternativo el parmetro dentro de la funcin. Para evaluar este parmetro dentro de la funcin existen dos posibilidades: 1. Evaluar una variable del espacio base con la funcin evalin. 2. Definir los parmetros como variables globales. Ambos planteamientos tienen muchos inconvenientes y prcticamente ninguna ventaja. Si se utiliza la funcin evalin la funcin depende de cmo se escriba el programa principal y ya no puede ser reutilizada de ninguna manera. Definir

Pgina 149 de 206

ICM- ESPOL
variables globales dentro del cdigo es un riesgo innecesario puesto que adems del inconveniente anterior puede generar serios conflictos de nombres. Parece que no hay ninguna manera de conseguir que una funcin dependa de un parmetro sin tener que adaptar cada una de ellas al problema en particular. Para encontrar la solucin hay que utilizar un poco el pensamiento lateral: para cada funcin se define un interfaz. De este modo, una funcin que slo espera argumentos puede adaptarse para que distinga entre argumentos y parmetros. Este mtodo utiliza una caracterstica muy interesante de los function handle, si en ellos se define una variable que no se encuentra en la cabecera automticamente la busca en el espacio de variables de la base. Slo lanza un error si no la encuentra. Por ejemplo

>> f = @(x) a*x; >> f(3) error: `a' undefined near line 1 column 10 error: called from: error: >> a = 3; >> f = @(x) a*x; >> f(3) ans = 9 at line -1, column -1

Como se puede comprobar, si la variable a no existe aparece un error pero en el momento que se define a la funcin es capaz de encontrar la variable y la utiliza como parmetro. Este planteamiento es til cuando, para resolver un problema
Pgina 150 de 206

CAPITULO III - MATLAB


dado, hay que utilizar una rutina que requiere una funcin con una forma determinada; por ejemplo la integracin de una ecuacin diferencial. La ecuacin de Van der Pol

depende del parmetro experimentar esquemas

. Como es una ecuacin de uso comn para de integracin temporal Matlab incluye las

funciones vdp1 y vdp1000 donde

es 1 y 1000 respectivamente.

Definir dos funciones cuando slo las diferencia un parmetro es poco esttico. Este problema se puede solucionar fcilmente si se define una nica funcin y se cambia el parmetro en el espacio base.

% Octave clear all clc mu = 1; vdp = @(x,t) [x(2),mu*(1-x(1).^2)*x(2)-x(1)]; x = linspace(0,20,1000);

y = lsode(vdp,[0 2],x); p = plot(x,y(:,1));

mu = 1000; x = linspace(0,3000,100000); vdp = @(x,t) [x(2),mu*(1-x(1).^2)*x(2)-x(1)]; y = lsode(vdp,[0 2],x);


Pgina 151 de 206

ICM- ESPOL
figure(2) p = plot(x,y(:,1)); %Matlab clear all clc mu=1; vdp=@(t,x) [x(2); mu*(1-x(1).^2)*x(2)-x(1)]; [t,y]=ode45(vdp,[0 20],[0 2]); p=plot(t,y(:,1));

mu=1000; vdp=@(t,x) [x(2); mu*(1-x(1).^2)*x(2)-x(1)]; [t,y]=ode23s(vdp,[0 3000],[0 2]); figure(2) p=plot(t,y(:,1));

El planteamiento utilizado con los ejemplos anteriores tiene un punto dbil. Los interfaces se evalan en el momento de su definicin, no en el momento de su ejecucin. Si tras asignar mu como 1000 no se hubiera redefinido el interfaz este no hubiera cambiado de valor. Por ejemplo

>> a = 1; >> y = @(x) a*x; >> y(2) ans = 2

>> a = 2; >> y(2) ans = 2


Pgina 152 de 206

CAPITULO III - MATLAB


Esto obliga a redefinir cada interfaz despus de cambiar cada parmetro, una estrategia que no parece demasiado adecuada porque fuerza a seguir una disciplina. En la programacin si el programador est obligado a seguir una disciplina es porque est haciendo el trabajo del ordenador. El paso siguiente es eliminar esa necesidad y utilizar un concepto bastante conocido: los mdulos. Aqu llega la segunda norma de la programacin en Matlab, los parmetros definen el mdulo. Si se toma un mdulo como un generador de funciones, los argumentos de entrada de un mdulo sern los parmetros y los de salida las funciones. De este modo hemos unido la definicin de los parmetros con la creacin de los interfaces. Por ejemplo, este sera un mdulo destinado a crear la funcin de Van der Pol

function [vdp] = modvdp(mu) vdp=@(t,x) [x(2); mu*(1-x(1).^2)*x(2)-x(1)];

El parmetro

es el argumento de entrada del mdulo y la funcin, que en este

caso es la misma que el interfaz, es el argumento de salida. Si un mdulo devuelve slo una funcin este puede degenerar en una funcin annima que devuelve otra funcin annima

>> modvdp = @(mu) @(t,x) [x(2); mu*(1-x(1).^2)*x(2)-x(1)];

Otro ejemplo. La atmsfera ISA o atmsfera estndar se basa en suponer que el gradiente de temperaturas hasta los 11000 metros es lineal.
Pgina 153 de 206

ICM- ESPOL

Los parmetros asociados a la atmsfera son el gradiente de temperatura, la gravedad, la constante de gas perfecto del aire y la temperatura, la presin y la densidad a nivel del mar. Este caso es especialmente sencillo porque todas las funciones dependen del mismo argumento: la altitud. Una posible manera de implementar este mdulo sera

function [T,p,rho] = ISA(T0,p0) % % Modulo que implementa la atmosfera estandar o ISA. % % Parametros: % % % % % Argumentos de salida: % % % % % %%% Constantes:
Pgina 154 de 206

T0: Temperatura a nivel del mar (altitud cero). p0: Presion a nivel del mar.

T: @(h) Temperatura en funcion de la altitud p: @(h) Presion en funcion de la altitud rho: @(h) Densidad a nivel del mar

CAPITULO III - MATLAB

g = 9.81; % Aceleracion de la gravedad a nivel del mar [M s^2] Ra = 287; % Constante de gas perfecto para el aire [J kg^-1 K^-1] lambda = -6.5e-3; % Gradiente termico [K m^-1] rho0 = p0/Ra/T0; % Densidad a nivel del mar T = p = @(h) T0 + lambda .* h; @(h) p0 .* ( T(h)./T0 ) .^ (-g/Ra/lambda); % %

Temperatura(h) presion(h) rho = @(h) rho0 .* ( T(h)./T0 ) .^ (-g/Ra/lambda - 1); % densidad(h)

En el script se han considerado que la gravedad, el gradiente trmico y la constante de gas perfecto del aire no son parmetros sino constantes as que no es necesario ni siquiera ponerlos en la cabecera del mdulo. Sin embargo las condiciones meteorolgicas a altitud cero son variables. Este mtodo puede utilizarse como punto de apoyo para articular cualquier programa en Matlab por grande que sea. Los parmetros podrn agruparse segn el significado fsico que tengan. En el caso del motor cohete, algunos parmetros se referirn a la geometra de la tobera, otros a las condiciones ambientales, otros a las caractersticas del combustible... Cada familia de parmetros crear un mdulo con las funciones o los interfaces necesarios para resolver el problema.
Pgina 155 de 206

ICM- ESPOL
Vamos a aplicar estos conceptos al problema del motor cohete.

%%% Programa de simulacion vehiculo con motor cohete a p_c constante %%% Version para Matlab clear; %% ISA g = 9.81; gair = 1.4; Ra = 287; % gravedad terrestre [m/s^2] % gamma aire % constante MGP aire [J/kg/K]

[T,p,rho] = ISA(288,101325); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Especificaciones Cohete p_c = 20e6; [Pa] Sf = 0.4; [m^2] Ag = 0.01; [m^2] As = Sf; [m^2] mcohe = 25; [kg] mcomb = 30; [kg]
Pgina 156 de 206

% presion camara de combustion % area frontal % area garganta % area salida % masa cohete % masa inicial combustible

CAPITULO III - MATLAB


m0 [kg] rho_c = 1800; [kg/m^3] %%% Hallo el consumo k = 0.2e-2/(50*101325)^0.7 ; % constante para hallar % consumo [kg/s] consumo mp = rho_c * Sf * k * p_c^0.7 ; %%% Hallo la presion de salida Gam = sqrt(gair) * (2 / (gair+1))^((gair+1) / 2 / (gair-1)); % constante Gamma(gamma) ecuacion = @(p_s) As/Ag - Gam /... sqrt( 2*gair * ... (1 - (p_s/p_c) ^ ((gair-1)/gair) ) /... (gair-1)... ) /... (p_s/p_c) ^ (1/gair); p_s = fsolve(ecuacion, 5e5); % ecuacion que relaciona areas % presion de salida % densidad combustible solido = mcohe + mcomb; % masa inicial total

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%

%% Resistencia aerodinamica: D(v,h) Mach = @(v,h) v ./ sqrt( gair .* Ra .* T(h) ); Cd = % Mach @(v,h) 2.6 .* Mach(v,h) .^(1.1) .* exp(-Mach(v,h))...
Pgina 157 de 206

ICM- ESPOL
+ 0.6 .* sqrt(Mach(v,h)); resist. D = @(v,h) rho(h) .* v.^2 .* Sf .* Cd(v,h) ./ 2; resistencia aero. %% Empuje Motor: E(h) E = @(h) p_c .* Ag .* Gam .*... sqrt( 2*gair * ... (1 - (p_s/p_c) ^ ((gair-1)/gair) ) /... (gair-1)... ) + ... As .* ( p_s./p_c - p(h)./p_c ) ./ Ag; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% % % coef.

%% Datos de entrada a ode45 %%% Sistema de ecuaciones acel = @(v,h,t) (E(h) - D(v,h) - mp.*v) ./... (m0 - mp.*t) - g; acel2 = @(v,h,t) -D(v,h)./mcohe - g; %%% NOTA: h = x(1), v = x(2); %%% Sistema: 1. dh/dt = v %%% F 2. dv/dt = f(h,hp) = @(t,x) [ x(2,1); acel(x(2,1) ,x(1,1),t)]; % con combustible % sin combustible

F2 = @(t,x) [ x(2,1); acel2(x(2,1),x(1,1),t)];


Pgina 158 de 206

CAPITULO III - MATLAB

%%% tiempo en el que se termina el combustible tfin1 = mcomb/mp; %[s] %%% condiciones iniciales x0(1,1) = 0; x0(2,1) = 0; % A nivel del mar [m] % En reposo [m/s]

%% Integrando... [tcomb,x] = ode45(F,[0 tfin1],x0); x0_2 = [x(length(x),1); x(length(x),2)]; sistema tfin2 = 20; integracion [s] [tfin,x2] = ode45(F2,[tfin1 tfin2],x0_2); % sin combustible, % tiempo fin % con combustible, % entrada a 2

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%

%% Graficos % h(m) hold on plot(tcomb, x(:,1), '-b',... tfin, x2(:,1),'-r', 'LineWidth',1) plot(tcomb(end),x(end,1),'ko','MarkerSize',10)
Pgina 159 de 206

frente a t(s)

figure(1);

ICM- ESPOL
hold off xlabel('t [s]', 'FontSize',11); ylabel('h [m]', 'FontSize',11);

% v(km/s) frente a t(s) figure(2); hold on plot(tcomb,x(:,2)*1e-3, '-b',... tfin,x2(:,2)*1e-3,'-r', 'LineWidth',1) plot(tcomb(end),x(end,2)*1e-3,'ko','MarkerSize',10) hold off xlabel('t [s]', 'FontSize',11); ylabel('v [ km / s ]', 'FontSize',11); % Mach frente a t(s) figure(3); hold on plot(tcomb,Mach(x(:,2),x(:,1)), '-b',... tfin,Mach(x2(:,2),x2(:,1)),'-r', 'LineWidth',1) hold off xlabel('t [s]', 'FontSize',11); ylabel('M', 'FontSize',11);

% a(km/s^2) frente a t(s) figure(4); plot(tcomb, acel(x(:,2),x(:,1),tcomb).*1e-3, '-b',... tfin,acel2(x2(:,2),x2(:,1).*1e-3,tfin),'-r', 'LineWidth',1) xlabel('t [s]', 'FontSize',11);
Pgina 160 de 206

CAPITULO III - MATLAB


ylabel('a [ km / s^2 ]', 'FontSize',11); axis([0,tfin(end),-2*g,2*g]); na de las diferencias histricas entre Matlab de y Octave ODEs. la es la A parte de la llamada, si ode45 se encuentra un valor complejo, como puede ser la raz cuadrada de un nmero negativo, integrar el valor absoluto de la funcin despus de imprimir una advertencia por pantalla. En cambio Octave dar un error y cortar la ejecucin.

Uintegracin Matlab

Mientras de

dispone

coleccin

funciones ode*, siendo ode45 la ms comnmente utilizada, Octave utiliza la funcin lsode con una convencin mucho ms parecida a la rutina en fortran a la que llama.

A continuacin de lista la versin del mismo programa compatible con Octave en el que se pueden apreciar las diferencias.

%%% Programa de simulacion vehiculo con motor cohete a p_c constante %%% Version para Octave clear; %% ISA g = 9.81; gair = 1.4; Ra = 287; % gravedad terrestre [m/s^2] % gamma aire % constante MGP aire [J/kg/K]

[T,p,rho] = ISA(288,101325);
Pgina 161 de 206

ICM- ESPOL

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Especificaciones Cohete p_c = 20e6; [Pa] Sf = 0.4; [m^2] Ag = 0.01; [m^2] As = Sf; [m^2] mcohe = 25; [kg] mcomb = 30; [kg] m0 [kg] rho_c = 1800; [kg/m^3] %%% Hallo el consumo k = 0.2e-2/(50*101325)^0.7 ; % constante para hallar % consumo [kg/s] consumo mp = rho_c * Sf * k * p_c^0.7 ; %%% Hallo la presion de salida Gam = sqrt(gair) * (2 / (gair+1))^((gair+1) / 2 / (gair-1)); % constante Gamma(gamma) % densidad combustible solido = mcohe + mcomb; % masa inicial total % masa inicial combustible % masa cohete % area salida % area garganta % area frontal % presion camara de combustion

Pgina 162 de 206

CAPITULO III - MATLAB


ecuacion = @(p_s) As/Ag - Gam /... sqrt( 2*gair * ... (1 - (p_s/p_c) ^ ((gair-1)/gair) ) /... (gair-1)... ) /... (p_s/p_c) ^ (1/gair); p_s = fsolve(ecuacion, 5e5); % ecuacion que relaciona areas % presion de salida

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%

%% Resistencia aerodinamica: D(v,h) Mach = @(v,h) v ./ sqrt( gair .* Ra .* T(h) ); Cd = resist. D = @(v,h) rho(h) .* v.^2 .* Sf .* Cd(v,h) ./ 2; resistencia aero. %% Empuje Motor: E(h) E = @(h) p_c .* Ag .* Gam .*... sqrt( 2*gair * ... (1 - (p_s/p_c) ^ ((gair-1)/gair) ) /... (gair-1)... ) + ... As .* ( p_s./p_c - p(h)./p_c ) ./ Ag; % + 0.6 .* sqrt(Mach(v,h)); % Mach % coef. @(v,h) 2.6 .* Mach(v,h) .^(1.1) .* exp(-Mach(v,h))...

Pgina 163 de 206

ICM- ESPOL
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%

%% Datos de entrada a lsode %%% Sistema de ecuaciones acel = @(v,h,t) (E(h) - D(v,h) - mp.*v) ./... (m0 - mp.*t) - g; acel2 = @(v,h,t) -D(v,h)./mcohe - g; %%% NOTA: h = x(1), v = x(2); %%% Sistema: 1. dh/dt = v %%% F 2. dv/dt = f(h,hp) = @(x,t) [ x(2); abs(acel( x(2),x(1),t))]; % con combustible % sin combustible

F2 = @(x,t) [ x(2); -abs(acel2(x(2),x(1),t))]; %%% tiempo en el que se termina el combustible tcomb = linspace(0,mcomb/mp,1000); %[s] %%% condiciones iniciales x0(1,1) = 0; x0(2,1) = 0; % A nivel del mar [m] % En reposo [m/s]

%% Integrando... x = lsode(F,x0,tcomb); % con combustible % entrada a 2

x0_2 = [x(length(x),1); x(length(x),2)]; sistema

Pgina 164 de 206

CAPITULO III - MATLAB


tfin = linspace(tcomb(end),20,1000); integracion [s] x2 = lsode(F2,x0_2,tfin); combustible %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% % sin % tiempo fin

%% Graficos % h(m) clf; hold on plot(tcomb,x(:,1), '-b','LineWidth',2,... tfin, x2(:,1),'-r','LineWidth',2) plot(tcomb(end),x(end,1),'ko','MarkerSize',10) hold off xlabel('t [s]', 'FontSize',11); ylabel('h [m]', 'FontSize',11); print -dsvg 'h.svg' % v(km/s) frente a t(s) figure(2); clf; hold on plot(tcomb,x(:,2)*1e-3,'-b','LineWidth',2,... tfin,x2(:,2)*1e-3,'-r','LineWidth',2) plot(tcomb(end),x(end,2)*1e-3,'ko','MarkerSize',10)
Pgina 165 de 206

frente a t(s)

figure(1);

ICM- ESPOL
hold off xlabel('t [s]', 'FontSize',11); ylabel('v [ km / s ]', 'FontSize',11); print -dsvg 'v.svg' % Mach frente a t(s) figure(3); clf; hold on plot(tcomb,Mach(x(:,2), x(:,1)), '-b','LineWidth',2,... tfin ,Mach(x2(:,2),x2(:,1)),'-r','LineWidth',2) hold off xlabel('t [s]', 'FontSize',11); ylabel('M', 'FontSize',11); print -dsvg 'M.svg' % a(km/s^2) frente a t(s) figure(4); clf; plot(tcomb, acel(x(:,2),x(:,1),tcomb')/g,'b','LineWidth',2,... tfin,acel2(x2(:,2),x2(:,1)/g,tfin'),'-r','LineWidth',2) xlabel('t [s]', 'FontSize',11); ylabel('a/g', 'FontSize',11); axis([0,tfin(end),-20,100]); print -dsvg 'a.svg'

En este ejercicio se aplica directamente la filosofa de las dos normas. Todas las funciones, en este caso function handles, estn definidas segn su expresin terica sin evaluar ninguna de sus variables.
Pgina 166 de 206

CAPITULO III - MATLAB


Esta aproximacin a la resolucin de problemas es ms clara y ms potente, de hecho se ha conseguido resolver el problema entero sin definir ninguna funcin. Si fuera necesario cambiar algn parmetro, como por ejemplo la seccin frontal del cohete, bastara con cambiar su definicin y volver a correr el script. Estos son los resultados:

GRAFICO 21 PUNTOS DE ENCUENTRO

Pgina 167 de 206

ICM- ESPOL

GRAFICO 22 PUNTOS DE ENCUENTRO 2

Altura en funcin del tiempo

Velocidad en funcin del tiempo

Pgina 168 de 206

CAPITULO III - MATLAB

GRAFICO 23 TRAMOS CONTINUOS

Nmero de Mach en funcin del tiempo

Pgina 169 de 206

ICM- ESPOL

GRAFICO 24 DESORGANIZACION DE TRAMOS

Aceleracin en funcin del tiempo

Pgina 170 de 206

CAPITULO III - MATLAB

III.II. Algunas inconsistencias


Una vez nombrados todos los elementos propios del lenguaje Matlab, a falta de tratar la prctica de la programacin, es el momento de aplicar el sentido crtico al lenguaje y sacarle los defectos. Desde un punto de vista puramente formal Matlab es un lenguaje que arrastra ciertos malos vicios debido a la compatibilidad hacia atrs. Es curioso comprobar cmo, aunque Mathworks ha mostrado todo el inters posible por aadir al lenguaje las caractersticas necesarias para hacerlo ms comercial, se han esmerado poco en corregir los errores del pasado.

III.II.I. Matlab en la enseanza


Soy un firme detractor del uso de Matlab en cursos de programacin en los primeros cursos de una carrera de Ingeniera. Esta es una opinin puramente personal pero est slidamente fundamentada. El objetivo primordial de un curso de programacin no es ser productivo ni aprender Clculo Numrico, es aprender a programar. Desgraciadamente existe el

Pgina 171 de 206

ICM- ESPOL
empeo generalizado de intentar completar los tres objetivos a la vez. Cuando se cae en ese error se empieza a ver Matlab como una eleccin adecuada. El arte o la prctica de programar es el de manipular datos con mediante algoritmos para completar una tarea con un ordenador. Debemos fijarnos que en esta definicin no aparecen lenguajes, clculo numrico, matemticas... Es algo que uno de los mayores expertos en el tema, Donald Knuth, sabe perfectamente. En su obra enciclopdica The Art of Computer Programming utiliza un lenguaje inventado de semntica adecuada para la descripcin de algoritmos. Si un lenguaje no se le parece es porque el lenguaje est mal. Pero ensear a programar sin un lenguaje de programacin es terriblemente lento porque obliga a aprender dos veces lo mismo: cmo describir algoritmos y cmo utilizar un lenguaje de programacin. Por brevedad la mayora de cursos de programacin se basan en aprender a programar con un lenguaje pero... Qu lenguaje? Si tuviramos que escoger uno tomaramos el que tuviera una semntica lo ms consistente posible, sin excepciones, para acercarnos a un lenguaje algortmico. Esta no es, de lejos, la mayor virtud de Matlab. De hecho es su mayor defecto. Las lenguas ms difciles de aprender son las que, con pequeos cambios en las palabras o la sintaxis, generan resultados completamente distintos. En el chino, por ejemplo, la palabra que para un occidental suena como ma puede tener hasta cuatro significados dependiendo de la pronunciacin de la vocal. No es muy

Pgina 172 de 206

CAPITULO III - MATLAB


distinto del hecho de cambiar el comportamiento de un operador como la multiplicacin (*) con otro (.*). A continuacin se listan algunas de las caractersticas del lenguaje que deberan ser eliminadas o modificadas para conseguir una mayor consistencia. Es eso posible? Es muy difcil que un lenguaje de programacin salga bien a la primera. Fortran ha visto nueve revisiones desde su aparicin en los cincuenta. Los desarrolladores de Python se atrevieron a introducir cambios que rompan todo el cdigo existente justo durante la revolucin de las aplicaciones web con el nico objetivo de llevar su filosofa hasta su ltima consecuencia. Cambiar los lenguajes es posible y en muchos casos es beneficioso. Este captulo no pretende influir en Mathworks sino en el lector. Mitificar cualquier herramienta por fabulosa que pueda parecer es un grave error. Mucho ms cuando la popularidad de Matab hace que vea usos totalmente inadecuados como la enseanza de los fundamentos de la programacin.

III.II.II. El estndar Matlab


Matlab es como Mathworks le conviene que sea. No existe ninguna referencia completa del lenguaje y no hay ningn comit que evale las revisiones. Esta caracterstica no es en s un defecto, la documentacin que podemos encontrar en la ayuda est fabulosamente bien escrita y un manual de referencia no se hace imprescindible.

Pgina 173 de 206

ICM- ESPOL
Pero hay efectos secundarios. Si existiera una referencia, con su correspondiente versin, su historial de cambios y las caractersticas obsoletas, el programador de Matlab sabra cmo y cundo un script quedara obsoleto y actuara en consecuencia. Es difcil en la actualidad saber si el cdigo que he escrito en Matlab 2008b ejecutar sin problemas en un Matlab 6.5. Lo nico que podemos hacer ahora es probarlo y cruzar los dedos. Para evitar que una nueva versin rompa todo el cdigo escrito hasta la fecha nunca se declaran caractersticas obsoletas mientras siguen aadindose nuevas funcionalidades. Matlab est condenado a crecer indefinidamente.

III.II.III. La verdad sobre la indexacin recursiva


Matlab hered parte de su sintaxis de Fortran, el que fue, es y ser el lenguaje del clculo cientfico de altas prestaciones por excelencia. Una de las particularidades de Fortran respecto al resto de lenguajes de programacin es el tratamiento estricto de las dimensiones de una matriz. Este tratamiento se ha reforzado en las ltimas revisiones del lenguaje hacindolo an ms estricto. Pero hubo una cosa que los creadores de Matlab no entendieron del todo bien: el hecho que en Fortran no existan la indexacin mltiple no significa que defina matrices en vez de arrays. El concepto de matriz es una abstraccin matemtica mientras que el de array es un concepto computacional. El segundo parte de la base de que en realidad la
Pgina 174 de 206

CAPITULO III - MATLAB


memoria es plana, esto es, no tiene filas y columnas. De hecho, cuando se habla de las diferencias entre C y Fortran siempre se nombra la manera de ordenar las matrices, algo que profundiza en la confusin. Importante

Como la memoria es plana un array no es ms que un vector de vectores de la misma longitud. Un array de rango tres es un vector de vectores de vectores. A la vez un vector es un array de escalares. Si Matlab, como el resto de lenguajes de programacin, basara sus clculos en arrays en vez de en matrices el indexado podra hacer uso de la recursividad. En C las matrices se declaran precisamente haciendo uso de ese concepto

double array[3][4]

Esta declaracin es totalmente equivalente a

double array[12]

Python dispone de un mdulo extra llamado numpy y de manera anloga a las listas tambin utiliza la recursin para indexar sus elementos

>>> from numpy import array >>> a = array([[1,2,3],[4,5,6],[7,8,9]])


Pgina 175 de 206

ICM- ESPOL
>>> a[0] array([1, 2, 3]) >>> a[0][0] 1 >>> a[0,0] 1

A riesgo de parecer reiterativo, definiendo un array como una recursin de vectores se consigue tanto un sistema para definir arrays independientemente de las dimensiones como dos maneras alternativas para indexarlos. Aqu llega una diferencia idiomtica entre Matlab y Octave, precisamente una de la que Mathworks debera tomar nota. Octave tiene soporte limitado para el indexado recursivo. Supongamos que tenemos una funcin que devuelve una matriz

function y = foo(x)

y = [x,2*x,3*x];

Sabiendo lo anterior podemos indexar el resultado junto con la llamada

octave>> z = foo(2)(2) z = 4

Esto sucede con cualquier llamada que devuelva una matriz como resultado

octave>> y = {[1,2,3],[4,5,6]}; octave>> y{1}(2)


Pgina 176 de 206

CAPITULO III - MATLAB


ans = 2

Desgraciadamente no se lleva este concepto hasta la ltima consecuencia para no romper de manera exagerada con la compatibilidad.

octave>> a = [1,2,3;4,5,6;7,8,9]; octave>> a(1) ans = 1 octave>> a(3) ans = 7

Operacin que, por cierto, no tiene ninguna lgica y es otra de las raras excepciones del lenguaje. Qu es una matriz? Acabamos de ver que la indexacin en Matlab es algo confusa y poco verstil. El problema de las inconsistencias es que afloran por doquier en los sitios ms insospechados. El ltimo ejemplo del resultado anterior es muy significativo. Como la indexacin mltiple no existe en Matlab al indexar una matriz con menos subndices de lo previsto provoca un resultado imprevisto: no ha aparecido ningn error. Siguiendo con el ltimo ejemplo, a es un array de rango dos, al darle slo un subndice obtengo un resultado de rango cero. Ahora forcemos ms la sintaxis

octave>> a(1)
Pgina 177 de 206

ICM- ESPOL
ans = 1

octave>> a(1,1) ans = 1 octave>> a(1,1,1) ans = 1

No existe ninguna relacin entre el nmero de subndices y el rango del resultado! He intentado indexar incorrectamente una matriz y no ha dado ningn error! Si ahora sumamos a que, como lenguaje dinmico, Matlab no comprueba los tipos en cada asignacin el peligro de cometer un error se multiplica. Otra vez somos vctimas del concepto difuso y poco estricto de matriz en Matlab. Ahora veamos como un lenguaje dinmico y consistente lidia con el problema del rango y el indexado.

>>> from numpy import array >>> a = array([[1,2,3],[4,5,6],[7,8,9]]) >>> a[0] array([1, 2, 3]) >>> a[0,0] 1 >>> a[0,0,0] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: invalid index

Pgina 178 de 206

CAPITULO III - MATLAB

III.II.IV. La innecesaria distincin entre filas y columnas


A diferencia de los arrays, las matrices tienen filas y columnas, distincin importante para las operaciones matriciales. Por ejemplo, un producto escalar ser la multiplicacin matricial entre un vector fila y otro columna. Con arrays simplemente es el la suma del producto de cada elemento. No es necesario hacer ninguna distincin. Siendo estrictos no es necesario distinguir filas de columnas desde un punto de vista algebraico, slo hay que fijarse si la operacin aumenta, mantiene constante o disminuye el rango. Podemos definir un producto escalar o un producto externo sin el concepto de matriz, lo necesitamos si queremos unir ambos en una multiplicacin matricial. Entonces el problema de los vectores fila y columna viene de la propia naturaleza de la multiplicacin matricial. El empeo de reducir una coleccin bastante extensa de operaciones con matrices y vectores a la multiplicacin para reducir la cantidad de operadores o funciones termina siendo una complicacin aadida e intil. No es lo mismo una multiplicacin matricial que un producto escalar, la multiplicacin conserva el rango y el producto escalar lo reduce. El hecho que el algoritmo de la multiplicacin sea hacer productos escalares no justifica que ambas operaciones

Pgina 179 de 206

ICM- ESPOL
tengan el mismo operador. Tambin la multiplicacin es una sucesin de sumas y a nadie se le ocurrira denotarlas con el mismo smbolo. Como la multiplicacin, el producto externo y el producto escalar tienen el mismo operador es necesario distinguir entre filas y columnas obligando a distinguir tambin entre dos tipos de vectores; algo que va en contra de cualquier sentido esttico y genera multitud de errores. En mis clases de Matlab digo a mis alumnos que ignoren los vectores, que no existen, que en realidad slo hay matrices que tienen una columna o una fila. Entonces las secuencias, que en realidad son vectores fila, rompen toda la dialctica. La multiplicacin en Matlab es un caso claro de decisin poco meditada en el diseo de un lenguaje de programacin. Un intento de reducir la informacin al unir tres operaciones provoca un aumento de la complejidad al tener que aprender multitud de casos particulares.

Nota

Matlab dispone de las funciones necesarias para no caer en la confusin anterior, dot es el producto escalar y kron sirve para calcular el producto exterior. Aunque estas funciones pueden ahorrarnos multitud de errores su uso es completamente marginal puesto que en todas las guas de programacin en Matlab se hace incidencia sobre la fabulosa brevedad del operador *.
Pgina 180 de 206

CAPITULO III - MATLAB


dot(a, b) Calcula el producto escalar de los dos vectores a y b a Vector fila o columna b Vector fila o columna Return type: Escalar kron(a, b) Producto tensorial de Kronecker de dos tensores. Cuando a y b son vectores esta operacin se llama producto exterior. a Escalar, vector o matriz de cualquier dimensin b Escalar, vector o matriz de cualquier dimensin

Parmetros:

Parmetros:

y y

Return type:

La dimensin del resultado siempre ser la suma de las dimensiones de los argumentos

Qu es una celda? Fijmonos en la cabecera de la definicin de una funcin

function [x,y,z] = foo(p,q,r)

Si analizamos sintcticamente la frase tenemos una sentencia como function que anuncia la declaracin de una funcin,
Pgina 181 de 206

ICM- ESPOL
posteriormente viene una matriz que contiene tres variables, el operador asignacin y finalmente el enunciado de cabecera de funcin. Fijmonos ahora en el elemento [x, y, z], rigurosamente hablando es una matriz que contiene tres variables pero en realidad es una asignacin triple. Esto suele llamarse un triple o un tuple de tres elementos y es un tipo presente en muchos lenguajes de programacin dinmicos. Entonces en caso de la asignacin mltiple los corchetes designan matrices o tuples? Vamos a comprobarlo

>> [x,y,z] = [1,2,3] ??? Too many output arguments.

Pues ahora que lo de la izquierda es un tuple y lo de la derecha es una matriz. Parece que llegamos a una conclusin, cuando algo delimitado por corchetes est al lado izquierdo de una asignacin es un tuple y si est en el lado derecho es una matriz. Hasta que definimos la funcin foo

function [x,y,z] = foo(p,q,r) x = p; y = q; z = r;

Pgina 182 de 206

CAPITULO III - MATLAB


Y probamos lo siguiente

>> x = foo(1,2,3) x = 1

Entonces qu retorna una funcin? La cabecera establece claramente una asignacin triple pero al encontrar slo un argumento de salida lo convierte en una asignacin simple e ignora los otros argumentos. Entonces la cabecera no sirve para nada y establece una jerarqua de argumentos segn su orden sin ningn control estricto sobre la cantidad. El defecto subyacente es que Matlab no tiene un operador asignacin completamente consistente que establece la excepcin de las llamadas a funciones. Este defecto podra solucionarse si los cell arrays se comportaran como tuples y soportaran la asignacin mltiple. Uniendo lo anterior a que las funciones tuvieran a celdas como argumentos de salida podramos arreglar ese defecto en el operador asignacin. Este sera un ejemplo del declaracin.

function {x,y,z} = foo(p,q,r) x = p; y = q;

Pgina 183 de 206

ICM- ESPOL
z = r;

Y este su funcionamiento

>> foo(1,2,3) ans = [1] [2] [3]

>> {x,y,z} = foo(1,2,3) x = 1

y = 2

z = 3 >> x = foo(1,2,3) ??? Not enough output arguments. >> x = foo(1,2,3){1} x = 1

Qu son entonces los cell arrays? Parecen una manera un poco ms sofisticada de ordenar valores pero es difcil encontrar el por qu de su existencia. Permitiendo la asignacin mltiple con cell

Pgina 184 de 206

CAPITULO III - MATLAB


arrays y la indexacin mltiple se podra dotar al operador asignacin de un significado verdadero.

III.II.V. Funciones y archivos


as limitaciones de una nica funcin por archivo y de no poder definir funciones dentro de la sesin del intrprete es sumamente Lridcula. No consigo entender cmo ha llegado Matlab a esas cotas de popularidad con semejante inconveniente. Sin su posicin dominante en el mercado sera imposible que se introdujera en l puesto que la calidad del intrprete y del ecosistema de clculo es infinitamente inferior al de la competencia. Es, adems, una limitacin tecnolgicamente inaceptable puesto que incluso el Octave lo soporta como extensin al lenguaje. En muchos casos hay que hacer encaje de bolillos para no terminar con el programa partido en decenas de archivos.

III.II.VI. Cul es el paradigma de Matlab?


Los lenguajes de programacin soportan uno o varios paradigmas. Lisp sigue la programacin funcional, C es un lenguaje

Pgina 185 de 206

ICM- ESPOL
procedimental y modular, Java es un lenguaje esttico orientado a objetos, Python soporta mejor o peor todos los paradigmas conocidos. El paradigma de Matlab es Matlab. Es difcil hacer programacin procedimental en Matlab porque cada funcin debe estar en un archivo, esto impide juntar todo lo que es esencial en el script principal si una funcin tiene que estar en l. Hacer programacin modular en Matlab tiene ms que ver con el talento en el uso del lenguaje que con las facilidades de las que disponemos. Uno puede, gracias a una funcin y unos function handles, acercarse al paradigma modular, pero no ser ms que un sucedneo. Los mdulos, por definicin, son estructuras de funciones y parmetros de las que uno puede tomar lo que le apetezca mediante un mecanismo de import. C dispone de las cabeceras que no son ms que archivos donde se lista el contenido de una librera; es ms fcil llegar al paradigma modular mediante este planteamiento que con Matlab. Matlab fuerza a programar de una determinada manera, con un estilo muy concreto, a base del uso indiscriminado de los function handle que es lo nico que lo convierte en un lenguaje verdaderamente dinmico. Sin esta estructura Matlab puede compilarse simplemente anotando las cabeceras de las funciones. Si bien esta caracterstica habla bien del compilador de Matlab
Pgina 186 de 206

CAPITULO III - MATLAB


(bastante caro, por cierto) habla terriblemente mal de sus bondades como lenguaje de programacin. Nota

Existe toda una rama de desarrollo en los lenguajes de programacin dinmicos y su compilacin a estructuras estticas para aumentar su rendimiento. Una de ellas es la identificacin de estructuras para anotarlas, asignar tipos a todas las variables y pasarlas a ensamblador. Este es el esquema de funcionamiento de un compilador JIT (Just In Time). Otro aspecto es el de descubrir en tiempo de compilacin los tipos de cada variable en vez de dejar que el intrprete lo descubra en tiempo de ejecucin. A este proceso se le llama dynamic typing y es terriblemente complejo en algunos lenguajes de programacin porque es imposible generar estructuras estticas a partir de cualquier estructura dinmica.

III.II.VII. La orientacin a objetos


La orientacin a objetos en Matlab es una de estas estrategias de marketing sin demasiado sentido. Con la popularidad de Java y de C++ lleg un momento en el que tu lenguaje era orientado a
Pgina 187 de 206

ICM- ESPOL
objetos o los programadores lo despreciaban sin complejos. Como Matlab es un producto comercial y su objetivo es vender terminaron aadiendo OO al lenguaje. Pero fue un absoluto desastre. Tanto que terminaron cambindola completamente porque su primer intento era simplemente imposible de utilizar. De este modo Mathworks introdujo el primer gran cambio que rompa la compatibilidad con versiones anteriores. Pero este no es el nico problema. Tiene sentido un lenguaje orientado a objetos con una biblioteca en la que no hay ni una sola clase? Ah no terminan los inconvenientes. Siempre se critic a PHP salvajemente por no soportar namespaces, Matlab no tiene y parece que a nadie le molesta. En los lenguajes modernos todo es un objeto. Cualquier tipo tiene mtodos asociados y puede derivarse para generar descendencia. No se termina la historia permitiendo definir clases, con la herencia y el polimorfismo. Esto significa que Matlab tampoco es una buena opcin para introducir a nadie en la OO. Por lo menos alguien entr en razn y se esforzaron en una implementacin del paradigma razonable, infinitamente mejor que la primera iteracin.

Pgina 188 de 206

CAPITULO III - MATLAB

III.II.VIII. El punto de la muerte

a hemos hablado del poco apropiado concepto de la multiplicacin matricial. Hemos olvidado de forma premeditada otra posibilidad para la multiplicacin, la

operacin de producto elemento a elemento cuando los dos operando tienen el mismo tamao. Incomprensiblemente y haciendo gala de una tremenda falta de ingenio estos dos operadores crticos se diferencian nicamente por un punto. Lo mismo sucede con la divisin y la potencia. Esto es la fuente del 90% de los errores de programacin en Matlab y es algo tan obvio que no entiendo cmo no se les pas por la cabeza. Desgraciadamente es algo tan arraigado a Matlab que dudo que cambie nunca. La alternativa es utilizar otro lenguaje.

III.II.IV. El punto y coma absurdo


Que el comportamiento por omisin de un comando sea mostrar el resultado en la salida estndar es otra de estas convenciones tan
Pgina 189 de 206

ICM- ESPOL
arraigadas como intiles. Es el nico lenguaje de programacin cuya salida no viene condicionada por una funcin o un comando, simplemente sucede. Es mucho ms comn olvidarse de poner el punto y coma que ponerlo sin querer. Lo peor del asunto es que la solucin no requiere demasiados cambios ni demasiadas discusiones. Bastara con sacar una nota antes de Matlab 8.0 diciendo que a partir de esta versin el comportamiento por omisin es no imprimir el resultado. Por qu existe entonces la funcin disp?

III.II.V. Funciones y sentencias o cmo ahorrarse parntesis


ay una distincin fundamental entre funciones y sentencias. Una sentencia, como lo es for o if son partes del lenguaje y se Hencargan del control de flujo de ejecucin. Una funcin encapsula una tarea, no es ms que un bloque de ejecucin. En algunos casos, cuando una funcin es muy habitual y penalizando la consistencia, se convierte en una sentencia pero sigue siendo una funcin porque se llama con argumentos.

Pgina 190 de 206

CAPITULO III - MATLAB


En Matlab existen dos casos paradigmticos que rompen totalmente con la sintaxis con la nica finalidad de ahorrarse un par de parntesis y un par de comillas como hold y print. Fijmonos en el uso de la sentencia hold. Si quiere activarse el redibujo se escribe

hold on

Para alguien que no hubiera visto nunca Matlab esto es una sentencia que recibe una variable como argumento. Ni hold es una sentencia nion es una variable. print es de patologa ms severa. Aunque puede llamarse como una funcin est diseado para ser llamado como un comando de consola al estilo UNIX. Las opciones se pasan con el prefijo -, algo que parecer habitual a los usuarios de los sistemas operativos serios. Lo ms grave es que, cuando print se llama como funcin los argumentos tambin deben utilizar el mismo prefijo. Importante

Uno de los muchos motivos de la transicin entre Python 2 y Python 3 fue precisamente la sentencia print. Imprimir en la consola es una funcin tan utilizada que en algunos lenguajes tiene
Pgina 191 de 206

ICM- ESPOL
el estatus especial de sentencia, pero es una excepcin. Si uno de tus objetivos es buscar la mxima consistencia debes cumplirlo eliminando las excepciones de tu lenguaje. En Python 3 print es una funcin y debe llamarse con argumentos. Este cambio aparentemente nimio significa romper prcticamente todo el cdigo escrito hasta la poca, aunque en este caso portarlo sea trivial. Aunque sean menos evidentes los otros cambios causaron peores dolores de cabeza. El motivo de la conversin de funciones en sentencias es obtener mayor brevedad al escribir una frase muy habitual. Una llamada consistente sera

hold(true)

Pgina 192 de 206

S-ar putea să vă placă și