Documente Academic
Documente Profesional
Documente Cultură
14 de ago.
MATLAB
Matrix Laboratory
Daniel Pacheco Borja
2011
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
VI. VII.
Nuestro primer programa en Matlab __________________________________ 19 Nuestro primer programa en Octave ___________________________________ 20
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.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
II.XIII. Estudio del pndulo invertido _______________________________________ 129 CAPTULO III ___________________________________________________________ 145 III.I Mandar un cohete al espacio __________________________________________ 145
III.I.I. Frmulas adicionales ____________________________________________________148
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
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.
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
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 >>.
Fundamentos de programacin
Nuestro punto de partida es as de simple: >> a = 1; Hay tres elementos en esta lnea de cdigo:
y y y
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
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
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
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]
Pgina 4 de 206
Pgina 5 de 206
CAPITULO I
MATLAB
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
Pgina 7 de 206
CAPITULO I
MATLAB
Pgina 8 de 206
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
Pgina 10 de 206
>> 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
GRAFICO 2 EDITOR
Pgina 12 de 206
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
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
E
un
lenguaje
programacin
compatibilidad
lineales con el ordenador y para desarrollar experimentos numricos. Octave puede ser copiado, modificado y redistribuido
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
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
plataformas de clculo para Ciencia e Ingeniera como Scilab o IDL cuentan con sus propios lenguajes de
ingenieros,
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
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.
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
Pgina 21 de 206
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.
>> 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
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
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
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
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:
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
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
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
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
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
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
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
Pgina 36 de 206
CAPITULO II - MATLAB
pero... Eres capaz de hacerlo con slo una lnea de cdigo? Ejercicio 6
El
nmero
puede
calcularse
II.II.II. Polinomios
Se define un polinomio de grado n como (2) ECUACION 5 SUMATORIA SUCESIONAL
Pgina 37 de 206
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
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
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
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:
Pgina 41 de 206
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
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
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
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.
CAPITULO II - MATLAB
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.
x_01 = [exp_serie(0.1,1),
Pgina 45 de 206
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)
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
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
>> a = 1; >> a a = 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
>> 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:
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
>> 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
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
0 0 0
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
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.
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
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
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
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
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
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
ECUACION 12 SISTEMA 1
Pgina 62 de 206
CAPITULO II - MATLAB
Demostrar que tienen un nico punto de
Pgina 63 de 206
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.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:
1
Pgina 65 de 206
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
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
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
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
Pgina 68 de 206
CAPITULO II - MATLAB
Pgina 69 de 206
>> plot([1,2,3,2,1]);
Pgina 70 de 206
CAPITULO II - MATLAB
Figura generada por el comando anterior
Pgina 71 de 206
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
Pgina 74 de 206
CAPITULO II - MATLAB
Ejemplo de etiquetas
Pgina 75 de 206
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:
Pgina 76 de 206
CAPITULO II - MATLAB
GRAFICO 7 HIPERBLICOS
Pgina 77 de 206
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
Pgina 79 de 206
GRAFICO 8 POLARIDAD
CAPITULO II - MATLAB
argumento llamado plot handle. Utilicemos como ejemplo la figura anterior.
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
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
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
Pgina 84 de 206
CAPITULO II - MATLAB
Pgina 85 de 206
Pgina 86 de 206
CAPITULO II - MATLAB
Pgina 87 de 206
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')
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
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
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
Pgina 94 de 206
CAPITULO II - MATLAB
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
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
Pgina 97 de 206
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);
Pgina 99 de 206
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.
CAPITULO II - MATLAB
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
aprovecharemos
CAPITULO II - MATLAB
plot(bins,pdf,bins,no rmpdf(bins,mu,sig)); xlabel('Diferenciales ') ylabel('Probabilidad' ) legend('Histograma',' Normal');
GRAFICO 13 HISTOGRAMA
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
CAPITULO II - MATLAB
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
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)
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 =
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
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 =
Pgina 108 de 206
CAPITULO II - MATLAB
3.1671e-05
err = 3.1140e-17
>> 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.
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
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
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.
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
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.
[t,y] = ode23s(@vdp1000,[0,3000],[0;2]);
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
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);
CAPITULO II - MATLAB
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:
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:
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.
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.
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
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
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
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.
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
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)];
y y
II.XII. Persistencia
En programacin, la persistencia se refiere a la capacidad de guardar el contenido de una variable en un archivo.
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
CAPITULO II - MATLAB
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
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:
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
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
...
que es el parmetro
que relaciona la aceleracin debida a la gravedad con las aceleraciones debidas al forzado.
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
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
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.
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];
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
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
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
CAPITULO II - MATLAB
Ejemplo de solucin en la que la perturbacin no es amplificada por el forzado. La oscilacin se mantiene prcticamente invariable en el tiempo.
CAPITULO II - MATLAB
GRAFICO 19 OSCILACION 2
CAPITULO II - MATLAB
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
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:
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
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
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.
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
La constante necesaria para calcular las relaciones de presin alrededor de toberas bloqueadas en rgimen isentrpico es
Con
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
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
. Como es una ecuacin de uso comn para de integracin temporal Matlab incluye las
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.
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));
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
El parmetro
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
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
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); % %
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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%
%% 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
%%% 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
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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%
%% 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))...
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]
%% 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
ICM- ESPOL
ICM- ESPOL
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
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.
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]
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
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];
octave>> z = foo(2)(2) z = 4
Esto sucede con cualquier llamada que devuelva una matriz como resultado
Desgraciadamente no se lleva este concepto hasta la ltima consecuencia para no romper de manera exagerada con la compatibilidad.
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
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
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
Parmetros:
Parmetros:
y y
Return type:
La dimensin del resultado siempre ser la suma de las dimensiones de los argumentos
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
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
>> 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.
ICM- ESPOL
z = r;
Y este su funcionamiento
y = 2
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
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
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.
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.
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.
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?
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)