MATLAB con aplicaciones a la Ingeniería, Física y Finanzas David Báez López MATLAB con aplicaciones a la Ingeniería, Física y Finanzas © David Báez López Primera edición: México, septiembre 2006 Sexta reimpresión: México, octubre 2009 Diseño y diagramación electrónica: Ana Edith Hernández Velázquez Revisión técnica y cuidado de la edición: Francisco Javier Rodríguez Cruz © 2006 ALFAOMEGA GRUPO EDITOR, S.A. de C.V. Pitágoras 1139, Col. Del Valle, 03100 México, D.F. Miembro de la Cámara Nacional de la Industria Editorial Mexicana Registro No. 2317 Internet: http://www.alfaomega.com.mx Correo electrónico: ventas1@alfaomega.com.mx ISBN 970-15-1137-9 Derechos reservados. Esta obra es propiedad intelectual de su autor y los derechos de publicación en lengua española han sido legalmente transferidos al editor. Prohibida su reproducción parcial o total por cualquier medio sin permiso por escrito del propietario de los derechos del copyright. Impreso en México-Printed in Mexico Para Luz del Carmen, David Alfredo y Laura Michele: Este libro lleva en sí el fruto de mi esfuerzo, pero animado por el recuerdo de una mirada, una sonrisa, un gesto tierno, de ahora o antaño, que me alimentaba espiritualmente para escribirlo, pacientemente, a lo largo de los días y largas noches. Gracias por ayudarme a ser quien soy, a redescubrir mi humanidad, y a orientar mis acciones por la intención del amor que les profeso. Somos lo que queremos. ARTHUR SCHOPENHAUER Con el amor que me das yo respiro, no sé tú... R.M. y A.M. No basta saber, se debe también aplicar. No es suficiente querer, se debe también hacer. GOETHE Contenido Prefacio .......................................................................................................................................... 9 Capítulo 1 Introducción a MATLAB ...................................................................................... 13 1.1 1.2 1.3 1.4 1.5 1.6 1.7 Instalación de MATLAB ................................................................................... 15 Cálculos simples en MATLAB .......................................................................... 16 Variables ......................................................................................................... 19 Gráficas .......................................................................................................... 21 Cadenas ......................................................................................................... 23 Guardado de una sesión y sus variables .......................................................... 27 Instrucciones de entrada y salida .................................................................... 32 1.7.1 Salida formateada ................................................................................ 33 1.7.2 Entrada de datos en MATLAB ............................................................... 35 1.8 Ayudas en MATLAB ........................................................................................ 36 1.8.1 El comando lookfor .............................................................................. 41 1.8.2 El comando which ............................................................................... 42 Capítulo 2 Variables y Funciones .......................................................................................... 43 2.1 2.2 Variables ......................................................................................................... 45 Funciones ....................................................................................................... 46 2.2.1 Variables simbólicas ............................................................................ 47 2.2.2 Operaciones con funciones .................................................................. 50 2.2.3 Gráficas de funciones .......................................................................... 53 2.2.4 Funciones internas de MATLAB ............................................................ 55 5 6 C ONTENIDO 2.3 2.4 2.5 2.6 2.7 Polinomios ..................................................................................................... 61 Ajuste de curvas ............................................................................................. 68 Ajuste con splines cúbicos .............................................................................. 71 2.5.1 Interfase para ajuste de curvas ............................................................ 72 Solución de ecuaciones .................................................................................. 74 Otras funciones disponibles en MATLAB ......................................................... 77 2.7.1 Evaluación de funciones con eval y feval .............................................. 77 2.7.2 El comando pause ............................................................................... 78 2.7.3 Los comandos wavread y sound .......................................................... 78 2.7.4 Hora, fecha y tiempo de ejecución ....................................................... 79 Capítulo 3 Matrices y Álgebra Lineal ................................................................................. 83 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 Matrices ......................................................................................................... 85 Operaciones básicas con Matrices .................................................................. 86 Vectores ......................................................................................................... 91 Productos escalar y vectorial .......................................................................... 96 Funciones de matrices y vectores ................................................................... 97 Sistemas de ecuaciones simultáneas .............................................................. 99 3.6.1 Factorización LU ................................................................................ 101 Vectores propios y formas de Jordan ............................................................ 102 Estructuras ................................................................................................... 104 Arreglos de celdas ........................................................................................ 106 Capítulo 4 Cálculo ....................................................................................................................... 109 4.1 4.2 4.3 4.4 4.5 4.6 4.7 Límites ......................................................................................................... 111 Límites de sucesiones .................................................................................. 112 Continuidad .................................................................................................. 113 Derivadas ..................................................................................................... 116 Integración ................................................................................................... 119 Series ........................................................................................................... 122 Solución de ecuaciones diferenciales ............................................................ 123 Capítulo 5 Gráficas ..................................................................................................................... 129 5.1 5.2 5.3 Gráficas en dos dimensiones ........................................................................ 131 Opciones de gráficas .................................................................................... 137 Gráficas polares ............................................................................................ 141 C ONTENIDO 5.4 5.5 5.6 5.7 5.8 5.9 7 Otros tipos de gráficas .................................................................................. 142 5.4.1 Gráfica de barras ............................................................................... 142 5.4.2 Gráfica de escalera ............................................................................ 143 5.4.3 Gráfica de histograma ........................................................................ 144 5.4.4 Gráfica de puntos (stem) ................................................................... 144 5.4.5 Gráfica de brújula (Compass) ............................................................ 145 5.4.6 Gráfica de pie .................................................................................... 146 Subgráficas (SUBPLOTS) .............................................................................. 147 Gráficas en 3 dimensiones ............................................................................ 148 5.6.1 El comando plot3 ............................................................................... 149 5.6.2 Gráficas de malla (mesh) ................................................................... 151 5.6.3 Gráfica de superficie (surf) ................................................................ 153 5.6.4 Gráfica de contorno (Contour) ........................................................... 155 Punto de observación ................................................................................... 158 Estructura de los gráficos de MATLAB ........................................................... 159 5.8.1 Identificadores de otros objetos ......................................................... 161 5.8.2 Identificador de ejes (gca) .................................................................. 162 5.8.3 Propiedades de un objeto ................................................................... 162 Jerarquía de los objetos de MATLAB ............................................................. 163 Capítulo 6 Programación con MATLAB ............................................................................ 165 6.1 6.2 6.3 6.4 6.5 Instrucciones básicas de programación en MATLAB ...................................... 169 6.1.1 La instrucción if-end .......................................................................... 169 6.1.2 La instrucción if-else-end .................................................................. 172 6.1.3 La instrucción elseif ........................................................................... 173 6.1.4 La instrucción switch–case ............................................................... 174 6.1.5 La instrucción for .............................................................................. 176 6.1.6 La instrucción while ........................................................................... 178 Funciones ..................................................................................................... 179 Variables de funciones .................................................................................. 182 6.3.1 Variables globales .............................................................................. 185 6.3.2 La instrucción return .......................................................................... 186 6.3.3 Nargin y nargout ................................................................................ 188 6.3.4 Funciones recursivas ......................................................................... 188 Manejo de archivos ....................................................................................... 189 6.4.1 Abrir y cerrar archivos ....................................................................... 189 Escritura de información en un archivo .......................................................... 192 6.5.1 Escritura y lectura de datos con formato ............................................ 193 6.5.2 Escritura y lectura de archivos binarios .............................................. 197 8 C ONTENIDO 6.6 Intercambio de datos entre MATLAB y EXCEL ................................................ 201 6.6.1 Lectura en MATLAB de datos creados en EXCEL ................................ 205 Capítulo 7 Interfases Gráficas .............................................................................................. 207 7.1 7.2 7.3 7.4 7.5 Creando una GUI en MATLAB ........................................................................ 209 Iniciando GUIDE ............................................................................................ 210 Partes de GUIDE ........................................................................................... 211 Propiedades de los controles ........................................................................ 212 Ejemplos ...................................................................................................... 213 Capítulo 8 Simulink .................................................................................................................... 239 8.1 Inicio de SIMULINK ....................................................................................... 241 8.2 El elemento Scope ........................................................................................ 247 8.3 Ejemplos ...................................................................................................... 248 8.4 Subsistemas ................................................................................................. 253 Conclusiones ......................................................................................................... 258 Capítulo 9 Aplicaciones en la Ingeniería ....................................................................... 259 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 Aplicaciones en la Ingeniería Química ............................................................ 261 Aplicaciones en Señales y Sistemas .............................................................. 271 9.2.1 Sistemas de segundo orden ............................................................... 271 Aplicaciones en Procesado Digital de Señales ............................................... 290 Aplicaciones en Control ................................................................................ 297 Aplicaciones en Electrónica ........................................................................... 310 Aplicaciones en Ingeniería de Alimentos ........................................................ 319 Aplicaciones en la Ingeniería Industrial .......................................................... 331 Aplicaciones en Ingeniería Civil ..................................................................... 340 Aplicaciones en Ingeniería Mecánica ............................................................. 356 Capítulo 10 Aplicaciones en Física ........................................................................................ 371 Capítulo 11 Aplicaciones en Contaduría y Finanzas .................................................... 399 Apéndice .................................................................................................................. 429 Índice ......................................................................................................................... 439 Prefacio El uso de las matemáticas se ha realizado desde el nacimiento de la civilización como lo podemos apreciar en las ciencias y artes de culturas tan antiguas como la egipcia, griega, romana, china, maya, etc. Hoy en día también sirven para entender fenómenos naturales y prevenir sus consecuencias, para resolver complicados problemas de ingeniería y finanzas, para desarrollar investigación de punta en ciencias, etc. Estos son sólo algunos ejemplos representativos de las aplicaciones de las matemáticas. El uso de ayudas computacionales basadas en PCs es una práctica común en nuestros días. Existen diversas compañías que diseñan programas de cálculo matemático. Entre los más importantes se encuentran Mathematica de la compañía Wolfram Research Inc., Maple de Maplesoft, MathCad de la compañía Mathsoft Engineering & Education, Inc., y el más usado en el mundo: MATLAB de la compañía The MathWorks, Inc. Todos estos paquetes manejan las matemáticas de una manera muy simple, además están habilitados con utilerías que permiten a los usuarios realizar complicados procedimientos matemáticos con una gran facilidad. Algunos ejemplos representativos los proporcionan los métodos de optimización que requieren una gran cantidad de cómputo matemático. Tradicionalmente se usaban lenguajes como Fortran o C y requerían de expertos programadores para llevarlos a cabo. Hoy en día con paquetes como MATLAB se pueden realizar procesos de optimización aun por programadores inexpertos con tiempos de desarrollo muy cortos. Esto es debido a la existencia de una gran cantidad de programas agrupados en paquetes especializados llamados toolboxes desarrollados por renombrados especialistas de todo el mundo y que simplifican la labor de desarrollo de técnicas de resolución de problemas. 9 10 P REFACIO MATLAB es una herramienta de cómputo orientada para realizar cálculos sobre matrices. Cuenta con una gran cantidad de toolboxes para análisis y procesamiento de datos. Además cuenta con una gran cantidad de herramientas para graficar funciones en dos y tres dimensiones las cuales están integradas dentro de MATLAB. También proporciona un ambiente de programación, el cual puede ser ampliado por el usuario desarrollando sus propios archivos-m e integrándolos dentro del acervo de programas de MATLAB. La manera de desarrollar programas en MATLAB es muy intuitiva y permite generar código de una manera muy rápida. MATLAB trabaja con una memoria dinámica que no requiere que se le declaren las variables que se van a usar durante el programa, sino que estas se definen al usarlas por primera vez. Esta es una gran ventaja ya que el usuario está en libertad de definir sus variables según lo requiere al escribir el código. Este libro proporciona una introducción a MATLAB para aquellos lectores sin ningún conocimiento previo de MATLAB. Para aquellos lectores que ya han experimentado con MATLAB, el libro proporciona material para aprender acerca de técnicas más avanzadas tales como resolución de ecuaciones de varias variables, ecuaciones diferenciales, límites de funciones, sucesiones y series, programación, intercambio de datos entre MATLAB y EXCEL, desarrollo de interfases gráficas, resolución de problemas con SIMULINK, entre otras técnicas avanzadas. Para aquellos usuarios orientados a ingeniería se incluye un capítulo con aplicaciones a las distintas áreas de la ingeniería. Para los usuarios con bases de física se presenta un capítulo con aplicaciones a la física. Finalmente, la versatilidad de MATLAB permite a los especialistas en contaduría y finanzas apreciar su poder en un capítulo especial sobre aplicaciones en estas áreas. El libro está organizado de la siguiente manera: El capítulo 1 describe la ventana principal de trabajo e introduce al lector a la manera general de realizar cálculos matemáticos en MATLAB así como a algunos comandos básicos. El capítulo 2 presenta la manera de manejar variables y funciones. Algunas funciones sencillas ilustran el procedimiento de generar archivos-m. El capítulo 3 introduce al lector a la especialidad de MATLAB, las matrices y vectores. Diferentes operaciones y funciones de matrices se describen ahí. El capítulo 4 da una introducción a las operaciones más comunes en cálculo matemático que se pueden realizar. El tópico de solución de ecuaciones diferenciales se cubre en este capítulo. El capítulo 5 describe una de las más poderosas herramientas de MATLAB que sirve para visualizar información y que consiste en describir la manera en que MATLAB grafica funciones y datos en dos y tres dimensiones. El capítulo 6 introduce el concepto de programación en el ambiente de MATLAB. El concepto de función y script se define de manera exhaustiva usando ejemplos. La manera de desarrollar interfases gráficas de usuario, llamadas GUIs, se describe en el capítulo 7. Una herramienta para simular sistemas, llamada SIMULINK se describe en el capítulo 8. SIMULINK sirve para P REFACIO 11 modelar de manera sencilla sistemas simples y complejos usando bloques que representan partes del sistema. Los capítulos 9, 10 y 11 presentan ejemplos de aplicaciones de MATLAB en la ingeniería, física y finanzas, respectivamente. Para un usuario que empieza el estudio de MATLAB, los primeros seis capítulos le permiten aprender MATLAB para poder aplicarlo en la resolución de problemas. Para el usuario intermedio con un conocimiento leve de MATLAB, los capítulos del 4 al 8 le permiten reforzar sus conocimientos aprendiendo nuevas técnicas para la solución de problemas con MATLAB. Finalmente, cualquier usuario se puede beneficiar al resolver los problemas de los capítulos de aplicaciones ya que la forma de resolverlos puede aplicarse a otros problemas. Finalmente, el autor espera que el lector pueda desarrollar nuevas técnicas de solución de los propios problemas usando MATLAB. Todos los ejemplos del libro fueron ejecutados en MATLAB versión 7, service pack 2 de marzo de 2005. Toda la información proporcionada en el libro es correcta, sin embargo, agradeceremos a nuestros lectores que cualquier error que aparezca en la versión final, así como cualquier sugerencia para mejorar la presentación del material se nos comunique al correo electrónico del autor: david.baez@udlap.mx. Este libro no hubiera sido posible sin el apoyo de muchas personas. Del Dr. Rubén Alejos jefe del Departamento de Ingeniería Electrónica de la Universidad de las Américas-Puebla y que me dio las facilidades de tiempo y equipo para poder desarrollar este proyecto. A Gonzalo Ferreyra, Guillermo González y Francisco Javier Rodríguez Cruz de Alfaomega Grupo Editor por la cooperación para culminar este libro. Al apoyo de Naomi Fernándes y Courtney Esposito de The Mathworks, Inc. que siempre estuvieron pendientes de que tuviera la última versión de MATLAB. José Miguel Alcocer y Juan Antonio Arizaga realizaron las capturas de pantallas, dibujos en Corel Draw y verificaron todos los ejemplos del libro. Finalmente, agradezco por la comprensión a mi esposa Luz del Carmen y mis hijos David Alfredo y Laura Michele por las muchas horas que dejé de estar con ellos por estar trabajando en este libro. Introducción a MATLAB MATLAB es un lenguaje de muy alto nivel diseñado para cómputo técnico. Integra en un mismo ambiente muy fácil de usar cálculos, visualización y programación. En este ambiente los problemas y sus soluciones se pueden expresar en notación matemática fácil de entender. Algunos de los usos más comunes de MATLAB son ● ● ● ● ● ● Cálculos matemáticos Desarrollo de algoritmos Modelado y simulación Análisis de datos y Obtención de gráficas Desarrollo de interfaces gráficas MATLAB es el acrónimo de MATrix LABoratory (Laboratorio de matrices) y originalmente fue desarrollado para realizar operaciones con matrices. El MATLAB actual es un poderoso sistema de cálculo de operaciones matemáticas y programación interactivo que integra un sistema de graficación. El lenguaje de programación de MATLAB es más poderoso que lenguajes tales como FORTRAN, C, Basic, VisualBasic o Pascal, por mencionar algunos. A lo largo del libro el lector podrá apreciar esto. Junto a MATLAB se ha desarrollado una colección de herramientas que programadas en lenguaje de MATLAB pueden realizar un conjunto de actividades en ciertas áreas de la ingeniería, las ciencias, las finanzas y la economía, por mencionar algunas. Algunas de estas herramientas son con enfoque a sistemas de control, procesado de señales, procesado de imágenes, lógica difusa, redes neuronales, simulación, optimización, finanzas y economía, entre otras. Estas herramientas se conocen como toolboxes y constituyen una parte importante de MATLAB que permiten resolver una clase particular de problemas. Describiremos algunas de estas herramientas en los capítulos de aplicaciones. 1.1 Instalación de MATLAB Para instalar MATLAB es necesario insertar el CD que contiene el paquete y seguir los pasos que se indican por el programa de instalación. Al terminar la instalación, en el escritorio (Desktop) aparecerá el icono de MATLAB como acceso directo. Al presionar este icono para empezar a utilizar MATLAB, aparecerá la ventana de MATLAB como se muestra en la figura 1.1. La región que estaremos usando es la ventana de la derecha que se denomina Ventana de Comandos o Espacio de Trabajo (Command Window). Las otras dos ventanas son la Ventana del Directorio de trabajo (Current Directory) que está arriba a la izquierda, y la ventana con la Historia de los Comandos (Command History) dados en la sesión actual y en sesiones previas y que se encuentra abajo a la 15 16 1. I NTRODUCCIÓN A MATLAB izquierda. El Directorio Actual (Current Directory) contiene todos los archivos que se encuentran en el directorio en el cual estamos trabajando (el directorio por defecto de MATLAB es C:\Matlab\work). Otra ventana que se puede desplegar es la ventana de ayuda (Help) la cual se puede abrir con el icono de Help. En el menú de Desktop también se pueden seleccionar las ventanas que deseamos desplegar. La indicación de que podemos dar comandos a MATLAB es EDU>>, y esto aparece en la edición estudiantil solamente ya que en la versión profesional solamente aparecerá >>. Figura 1.1 Ventana de MATLAB. 1.2 Cálculos simples en MATLAB MATLAB puede realizar cálculos simples como si se tratara de una calculadora. Por ejemplo si deseamos realizar 37, simplemente escribimos después de EDU>> esta operación requerida. Esto es EDU>> 3 + 7 y presionamos la tecla ENTER. (Usaremos negritas para lo que escribimos nosotros y normal para lo que escribe MATLAB.) MATLAB nos da el resultado como ans= 10 La indicación para oprimir la tecla ENTER es obvia y no siempre la escribiremos. 1.2 C ÁLCULOS SIMPLES EN MATLAB 17 Las operaciones básicas con su precedencia se muestran en la tabla 1-1. Tabla 1-1 Operación Operaciones básicas y su precedencia Símbolo Ejemplo Precedencia Suma 4 2 6 3 Resta 4 2 2 3 Multiplicación * 4 * 2 8 2 División / 4 / 2 2 2 Potenciación ^ 4 ^ 2 16 1 La precedencia significa el nivel de prioridad que aplica MATLAB para realizar las operaciones. La potenciación tiene asignada la mayor prioridad, la multiplicación y la división la siguiente y finalmente la suma y la resta tienen la menor prioridad. Por ejemplo en EDU>> 4 + 6/2 <ENTER> ans= 7 primero se realiza la división 6/2 y su resultado que es 3 se suma al 4 para dar el resultado de 7. La precedencia se puede alterar usando paréntesis. Por ejemplo EDU>> (4 + 6)/2 ans= 5 <ENTER> ya que primero se efectúa el paréntesis y luego la división. También se pueden evaluar otras funciones como las funciones trigonométricas. Por ejemplo EDU>> sin(3) ans= 0.1411 Aquí el argumento está en radianes. Algunas funciones simples se dan en la tabla 1-2. Para un listado de todas las funciones elementales existentes en MATLAB simplemente escribimos help elfun. El significado de elfun es elementary functions. 18 1. I NTRODUCCIÓN A MATLAB Tabla 1-2 Algunas funciones en MATLAB Función sen x cos x tan x log (x) ln (x) |x| ex Notación en MATLAB sin (x) cos (x) tan (x) sqrt (x) log10 (x) log (x) abs (x) exp (x) A continuación presentamos algunos ejemplos. Si aproximamos el número irracional por 3.1416 obtenemos para sen (3.1416): EDU>> sin (3.1416) ans= -7.3464e-006 que es una buena aproximación al resultado exacto que es cero. MATLAB tiene predefinido el valor de y lo almacena en la constante pi. De esta manera, EDU>> sin (pi) ans= 1.2246e-016 que es una mejor aproximación al resultado esperado. EDU>> sqrt (2) ans= 1.4142 EDU>> log10 (1000) ans= 3.0000 Algunas constantes definidas en MATLAB son pi 3.14159265…… i j eps Inf NaN unidad imaginaria = igual que i precisión de las operaciones de punto flotante, 2-52 infinito no un número (Not a Number) 1.3 V ARIABLES 19 En particular eps es una cantidad que se usa por lo general para evitar división por cero y NaN es un resultado que MATLAB presenta cuando el resultado de la operación indicada no es numérico. 1.3 Variables En MATLAB se pueden definir variables que a diferencia de lenguajes de programación como FORTRAN y C, no necesitan declararse previamente en otra instrucción. Es decir, la variable se crea al momento de escribirse. Por ejemplo, la variable a1 se crea en MATLAB cuando se escribe por primera vez con EDU>> a1=37 a1= 37 <ENTER> Esta variable tendrá este valor hasta que el usuario lo cambie por otro. Los nombres de las variables pueden tener un tamaño de hasta 63 caracteres de largo. Si un nombre de variable tiene más de 63 caracteres, sólo se conservan los primeros 63. El número de dígitos con los que MATLAB escribe una cantidad numérica puede variarse. Esto se puede hacer usando alguno de los formatos mostrados en la tabla 1-3 donde se usa . Por ejemplo: EDU>> format rat EDU>> x=[pi] x= 355/113 Tabla 1-3 Formatos para escribir valores numéricos FORMATO de MATLAB Valor desplegado Comentarios format short 3.1416 5 dígitos format 3.1416 Igual que format short format long 3.14159265358979 16 dígitos format short e 3.1416 e+000 5 dígitos más exponente format long e 3.141592653589793e+000 16 dígitos más exponente format hex 400921fb54442d18 hexadecimal format bank 3.14 2 decimales (monetario) format + + positivo o negativo format rat 355/113 racional aproximado 20 1. I NTRODUCCIÓN A MATLAB Para obtener más información, mediante la función Index del CD de documentación búsquese format [2]. Cada vez que MATLAB ejecuta alguna acción, el resultado se escribe en la pantalla. Para suprimir la escritura del resultado, es necesario escribir punto y coma después de escribir la operación que deseamos realizar, por ejemplo EDU>> 3+7 <ENTER> ans= 10 EDU>> 3+7; <ENTER> La primera vez que ejecutamos 3+7, MATLAB nos da el resultado inmediatamente mientras que la segunda vez al escribir el punto y coma el resultado no se escribe y sólo se guarda para usarlo posteriormente. Los nombres de las variables no son iguales si se escriben con letras mayúsculas o minúsculas. De esta manera, la variable A es distinta de la variable a. Las variables definidas se pueden ver con la instrucción who. Si tenemos EDU>> a=3; <ENTER> EDU>> b=7; <ENTER> EDU>> c=17; <ENTER> EDU>> A=4; <ENTER> EDU>> who; <ENTER> Your variables are a b c A Para borrar variables se usa la instrucción clear. EDU>> clear a borra solamente la variable a, mientras que EDU>>clear borra todas las variables que se hayan definido desde que se empezó la sesión actual de MATLAB. 1.4 G RÁFICAS 21 1.4 Gráficas Graficar una función en MATLAB es muy simple. Por ejemplo, para graficar sen(x) en el rango de 0 a 2, se usa la instrucción: EDU>> x=0: pi/100:2*pi; EDU>> y= sin (x); EDU>> plot (x,y) El primer renglón tiene el formato x = punto inicial : incremento : valor final El segundo renglón define la función que queremos graficar y el tercer renglón es la instrucción para graficar. La gráfica que se obtiene se muestra en la figura 1.2. Figura 1.2 Gráfica de sin (x). A esta figura le podemos añadir un título y texto en los ejes. (El símbolo \ enfrente de pi sirve para escribir ) 22 1. I NTRODUCCIÓN A MATLAB EDU>> xlabel (‘De 0 a 2\pi’) EDU>> ylabel (‘seno de x’) EDU>> title (‘Gráfica de la función seno’,‘FontSize’,12) Si se desea graficar más de una curva, simplemente se define antes de la instrucción plot. Por ejemplo, para obtener la figura 1.3 usamos x =0: pi/100:2*pi; Y1= sin(x); Y2= cos(x); plot (x,Y1,x,Y2) legend (‘sen(x)’, ‘cos(x)’) (En estas instrucciones hemos suprimido EDU>>). El comando legend sirve para identificar cada curva. Figura 1.3 Gráficas múltiples. Es posible graficar en dos dimensiones. En este caso hablamos de superficies. Por ejemplo, 1.5 C ADENAS 23 [x,y] = meshgrid (-8:0.5:8); R=sqrt (x.^2+y.^2) + eps; z=sin(R)./R; mesh (x,y,z) Se usa eps para evitar que R valga cero en el punto (0,0). El resultado se muestra en la figura 1.4. Figura 1.4 Gráfica de una superficie. 1.5 Cadenas Una cadena de caracteres es una serie de letras, números u otros símbolos. Las cadenas de caracteres se encierran dentro de comillas. Algunos ejemplos de cadenas de caracteres son ‘universidad’, ‘circuitos’, ‘Año Nuevo’, etc. Una variable de MATLAB puede ser una cadena de caracteres. Por ejemplo, 24 1. I NTRODUCCIÓN A MATLAB >> a= ‘México’ a= México >> b=‘abcd1234?¡&%$#’ b= abcd1234?¡&%$# De esta manera, las variables a y b son todo lo que está contenido dentro de las comillas. En caso de que la cadena contenga una comilla, entonces repetimos dicha comilla. De esta manera al encontrarse la primera comilla MATLAB no verá el fin de la cadena, sino que la verá como parte de la cadena. Por ejemplo, si deseamos dar a MATLAB la cadena don’t, lo hacemos como >> ‘dont’‘t’ ans = dont’t Los elementos de una cadena tienen una posición dentro de la cadena. Cada elemento se puede obtener con el nombre de la cadena seguido entre paréntesis de la posición que tiene. Por ejemplo, para la cadena a =‘Pedro Salas’ el primer elemento a(1) es P, mientras que el penúltimo elemento a(10) es, >> a=‘Pedro Salas’ a= Pedro Salas >> a(1) ans = P >> a(10) ans = a Si deseamos especificar un rango de caracteres usamos cadena(i:j) que nos dará los caracteres del i-ésimo al j-ésimo. Por ejemplo >> a(3:7) ans = dro S Se pueden concatenar varias cadenas especificándolas, como nueva_cadena = [ cadena 1, cadena 2, cadena 3] 1.5 C ADENAS 25 Por ejemplo, si tenemos cuatro cadenas a, b, c, d dadas por a = ‘México’, b = ‘Argentina’, c = ‘Brasil’, d = ‘Venezuela’, creamos nuevas cadenas con >> x1 = [ a,b ] x1 = MéxicoArgentina >>x2 = [ a,c ] x2 = MéxicoBrasil >>x3 = [ b,d ] x3 = ArgentinaVenezuela >>x4 = [ b,c ] x4 = ArgentinaBrasil También podemos crear nuevas cadenas con elementos de cadenas como >> y1 = [a(1:3), d(1:2), c(1), b(3)] y1 = MéxVeBg Existen funciones para las cadenas. Estas funciones son length calcula el número de caracteres en la cadena strcmp compara las cadenas str2num convierte una cadena a un valor numérico num2str convierte un número a una cadena strrep reemplaza los caracteres en una cadena con caracteres diferentes upper convierte los caracteres de una cadena a mayúsculas lower convierte los caracteres de una cadena a minúsculas Para la función length >> length(a) ans = 6 La función strcmp(a, b) compara las cadenas a y b. Si éstas son iguales el resultado es la unidad y si son diferentes el resultado es cero. Por ejemplo, para la cadena mex=‘México’ 26 1. I NTRODUCCIÓN A MATLAB >> strcmp(a,c) ans = 0 > strcmp(a,mex) ans = 1 La función str2num convierte una cadena a número, sólo si la cadena está formada por números. Por ejemplo, si d = ‘2002’ , entonces >> e=str2num(d) e= 2002 Si escribimos e(1) MATLAB nos da >> e(1) ans = 2002 que es el número completo. En cambio, d(1) es >> d(1) ans = 2 que nos da sólo el primer carácter de la cadena d. La función num2str convierte un número a cadena, para e >> num2str(e) ans = 2002 La función strrep (c1 , c2 , c3) reemplaza los caracteres c2 por los caracteres c3 en la cadena c1. Por ejemplo, en la cadena ‘MATLAB realiza cálculos matemáticos’. podemos cambiar realiza por lleva a cabo con: >> c1 = ‘MATLAB realiza cálculos matemáticos.’; c2 = ‘realiza’; c3 = ‘lleva a cabo’; strrep( c1, c2, c3); ans = MATLAB lleva a cabo cálculos matemáticos. 1.6 G UARDADO DE UNA SESIÓN Y SUS VARIABLES 27 Las funciones upper y lower convierten los caracteres alfabéticos en una cadena a letras mayúsculas y minúsculas, respectivamente. Y los demás caracteres no cambian. Por ejemplo para las cadenas a y b. >> h = upper(a) h= MÉXICO k = upper(b) k= ARGENTINA lower(h) ans = méxico lower(k) ans = argentina 1.6 Guardado de una sesión y sus variables Hasta este momento sólo hemos mencionado que una variable se define cuando se usa por primera vez. Las variables de la sesión están disponibles mientras no se cierre MATLAB o mientras no se ejecute la instrucción clear. En ocasiones deseamos seguir utilizando nuestras variables en otra sesión de MATLAB y por lo tanto es conveniente tener alguna manera de guardarlas. Esto es posible con la instrucción diary que guarda una copia de la sesión de MATLAB en un archivo. En este archivo se incluyen todas las instrucciones que el usuario haya escrito, así como las respuestas que haya obtenido de MATLAB. Para ilustrar el uso de diary consideremos la siguiente sesión de trabajo: >> a=1 a= 1 >> b=2 b= 2 >> c=[0.5:0.5:2]; >> x=a+b./c 28 1. I NTRODUCCIÓN A MATLAB x= 5.0000 3.0000 2.3333 2.0000 Si ahora deseamos guardar nuestra sesión de trabajo en un archivo que llamaremos sesion.txt usamos: >>diary (‘sesion.txt’) y continuamos trabajando en MATLAB con lo siguiente >> s=2 s= 2 >> t=3; >> r=4; >> y = t +r - 5 y= 2 ahora escribimos >> diary (‘off’) >> z=3+5 z= 8 >> z2=s+t+r z2 = 9 Ahora observamos los archivos del directorio y vemos que hay un nuevo archivo llamado sesion.txt. Al abrirlo vemos que se grabaron en él todas las instrucciones, junto con las respuestas que dio MATLAB, que se escribieron a partir de diary(‘sesion.txt’) hasta que se escribió diary(‘off’), como se muestra en la figura 1.5. Si repetimos esta acción, se volverán a grabar todas las instrucciones junto con 1.6 G UARDADO DE UNA SESIÓN Y SUS VARIABLES 29 las respuestas en el mismo archivo que usamos antes y que recibió el nombre de sesion.txt. Si solamente usamos diary, se genera un archivo con el nombre diary en el subdirectorio donde estamos trabajando. Figura 1.5 Contenido del archivo sesion.txt donde se grabó la sesión usando diary. Otra manera de guardar información de la sesión es usando el comando Save Workspace As… al cual podemos tener acceso con FileSave Workspace As…o con Control+S. En este caso sólo se guarda información de las variables de la sesión. Por ejemplo, para guardar la sesión anterior más nuevas variables que declaramos escribimos en la ventana de trabajo de MATLAB dos nuevas variables, >> rr=10 rr = 10 >> xx=39 xx = 39 30 1. I NTRODUCCIÓN A MATLAB Hemos definido dos nuevas variables, rr y xx, adicionales a las que teníamos anteriormente. Ahora lo salvamos con FileSave Workspace As… con lo que se abre la ventana de diálogo de la figura 1.6 donde se nos pregunta el nombre del archivo donde guardaremos estas variables. MATLAB le da la extensión .mat de manera automática. Si lo salvamos con el nombre de variables entonces se creará un archivo con el nombre variables.mat conteniendo las variables de la sesión con sus valores. Cerremos MATLAB y lo volvemos a abrir. Veamos qué variables existen en MATLAB con la instrucción who. Vemos que al escribir who en la ventana de trabajo no existe ninguna variable. Ahora abrimos nuestro archivo con el icono de abrir archivos, o en FileOpen... con lo que se abre la ventana de diálogo de la figura 1.7 donde seleccionamos nuestro archivo variables.mat. Al abrirlo se cargan todas las variables de la sesión anterior con sus valores como se muestra en la figura 1.8 después de usar la instrucción who y whos. Esta última nos da una lista de las variables y el tamaño y clase de cada una de ellas. Alternativamente, podemos salvar nuestras variables con el comando save como save(‘variables’) que es equivalente a save(‘variables.mat’) y MATLAB ejecutará la accion equivalente a Save Workspace As... escribiendo las variables al archivo variables.mat. Podemos cargar las variables que están en variables.mat con load(‘variables.mat’) o simplemente load(‘variables’) Figura 1.6 Ventana de diálogo para dar nombre al archivo donde se guardan las variables de la sesión. 1.6 G UARDADO DE UNA SESIÓN Y SUS VARIABLES 31 Figura 1.7 Ventana de diálogo para dar nombre al archivo donde se guardan las variables de la sesión. Figura 1.8 Variables guardadas del archivo variables.mat. Si solamente se desea guardar unas cuantas variables se puede hacer si seleccionamos en la ventana de Command History las variables que queremos guardar y con el botón derecho del ratón seleccionamos la opción Create M-File como se muestra en la figura 1.9. Al hacer esto se abre una ventana de diálogo para darle un nombre al archivo donde se guardará la información de las variables de interés. El archivo es del tipo archivo-m y le damos el nombre sesion.m como se muestra en la figura 1.10. Ahora las variables y funciones realizadas en esa parte de la sesión quedan guardadas en un archivo para su uso posterior. 32 1. I NTRODUCCIÓN A MATLAB Figura 1.9 Selección de variables con el botón derecho del ratón. Figura 1.10 Creación del archivo sesion.m. 1.7 Instrucciones de entrada y salida Hasta ahora hemos usado MATLAB como una calculadora sencilla, donde el resultado se obtiene inmediatamente. En ocasiones, esto no es muy conveniente, especialmente si los resultados intermedios de un cálculo que requiere muchos pasos no nos interesan. Afortunadamente podemos evitar el desplegado de los resultados intermedios si usamos punto y coma al final de una instrucción de MATLAB. Por ejemplo: 2+3 vemos que se despliega el resultado en la ventana de trabajo de MATLAB. Pero con 2+3; vemos que no se despliega el resultado. 1.7 I NSTRUCCIONES DE ENTRADA Y SALIDA 33 Entonces si no queremos desplegar un resultado usamos punto y coma, y si queremos ver el resultado no lo usamos. Otro uso del punto y coma es para escribir varias instrucciones en un mismo renglón separándolas con un punto y coma. Por ejemplo a=2+3;b=3+a;c=4–2; es equivalente a a=2+3; b=3+a; c=4–2; En ambos casos el punto y coma evita que se desplieguen los valores de a, b, y c. 1.7.1 Salida formateada Aparte de la salida que se obtiene en la ventana de trabajo (workspace), es posible escribir el resultado de un cálculo junto con algún texto, o simplemente escribir un texto. Para esto usamos la instrucción fprintf. Si deseamos escribir el texto: MATLAB realiza cálculos matemáticos Usamos entonces >> fprintf (‘MATLAB realiza cálculos matemáticos.\ n’); MATLAB realiza cálculos matemáticos. Nótese que en esta instrucción, el punto y coma no suprime la escritura. También nótese el \n al final de la línea. Esto quiere decir que después de escribir se empiece una línea nueva. Si no lo usamos entonces el siguiente fprintf continuará escribiendo en la misma línea. Por ejemplo, si escribimos >> fprintf(‘MATLAB’);fprintf(‘realiza cálculos’);fprintf(‘matemáticos.’); MATLAB realiza cálculosmatemáticos. El fprintf no empieza por sí solo un nuevo renglón, por lo que se hace necesario usar \n. 34 1. I NTRODUCCIÓN A MATLAB Por ejemplo: >> fprintf(‘Empiezo’);x1 = 2 + 3 ;x2 = 3 + 4 ;fprintf (‘Termino’); EmpiezoTermino Pero si incluimos un \n entonces se escribirá el siguiente fprintf en un nuevo renglón, como >> fprintf(‘Empiezo\n’);x1 = 2 + 3 ;x2 = 3 + 4 ;fprintf (‘Termino\n’); Empiezo Termino que nos da la salida con un renglón entre un texto y el otro. Alternativamente podemos declarar una cadena y escribir dentro del fprintf el nombre de la cadena. Por ejemplo: >> a = ‘Escribir México’ ; fprintf ( a ); Escribir México Para escribir un texto con una variable tenemos que dar el formato con el cual queremos escribir la variable. Los formatos son f – punto flotante g – punto fijo o punto flotante i – entero c – carácter s – cadena d – doble precisión e – notación exponencial Por ejemplo, si a=372898765.4321876509, para escribirla podemos usar >> a=372898765.4321876509 a= 3.728987654321877e+008 >> fprintf (‘La variable es %8.4f’, a) La variable es 372898765.4322 >> fprintf (‘La variable es %8.4g’, a) La variable es 3.729e+008 >> fprintf (‘La variable es %8.4e’, a) La variable es 3.7290e+008 >> fprintf (‘La variable es %8.4d’, a) La variable es 3.7290e+008 1.7 I NSTRUCCIONES DE ENTRADA Y SALIDA 35 >> fprintf (‘La variable es %8.4i’, a) La variable es 3.7290e+008 >> fprintf (‘La variable es %8.4s’, a) La variable es 3.7290e+008 1.7.2 Entrada de datos en MATLAB La forma más sencilla de dar datos a MATLAB es con la instrucción input que tiene el formato x = input (‘Dame el valor de x‘) Con este formato MATLAB despliega un mensaje para que inmediatamente nosotros escribamos el valor de x. De esta manera podemos escribir >> x = input (‘Dame el valor de x ’) ; Dame el valor de x 56 >> fprintf ( ‘\n El número que diste es %g.\n ‘, x) El número que diste es 56. Nótese que el input no genera salto de línea. Esto sólo se genera con \n el cual puede ir en cualquier lado. Si en lugar de darle un valor numérico le damos un nombre con letras o un carácter como &, ¿ o algún otro, obtenemos >> x = input ( ‘Dame el valor de x ’) ; Dame el valor de x Perico ??? Undefined function or variable ‘Perico’. Dame el valor de x ¿ ??? ¿ | Error: Missing variable or function. Vemos que en el caso del nombre nos dice que ese nombre está indefinido y nos vuelve a preguntar el valor de x. En el caso de un carácter no alfanumérico nos manda un mensaje de error. Si en lugar de datos numéricos se desea leer una cadena, lo indicamos añadiendo ‘s’ dentro del input como en a = input(‘Dame el valor de x’ , ‘s’) Como todos los datos son cadenas, nunca se marcará un error. 36 1. I NTRODUCCIÓN A MATLAB 1.8 Ayudas en MATLAB Las ayudas en MATLAB se pueden accesar con el comando help con lo que obtenemos la lista todos los tópicos para los que podemos obtener ayudas. >> help HELP topics: c:\sandino MATLABR12\work matlab\general matlab\ops matlab\lang matlab\elmat matlab\elfun matlab\specfun matlab\matfun matlab\datafun matlab\audio matlab\polyfun matlab\funfun matlab\sparfun matlab\graph2d matlab\graph3d simulink\simulink simulink\blocks - (No table of contents file) (No table of contents file) General purpose commands. Operators and special characters. Programming language constructs. Elementary matrices and matrix manipulation. Elementary math functions. Specialized math functions. Matrix functions - numerical linear algebra. Data analysis and Fourier transforms. Audio support. Interpolation and polynomials. Function functions and ODE solvers. Sparse matrices. Two dimensional graphs. Three dimensional graphs. Simulink Simulink block library. For more help on directory/topic, type «help topic». Para obtener ayuda de un tópico específico podemos escribir también el nombre del tópico. Por ejemplo, para obtener ayuda de los demos usamos help demos que nos lista todos los demos de MATLAB. >> help demos Examples and demonstrations. Type ‘demo’ at the command line to browse more demos of MATLAB, the Toolboxes, and SIMULINK. 1.8 A YUDAS EN MATLAB MATLAB/Introduction. demo - Browse demos for MATLAB, Toolboxes, and SIMULINK MATLAB/Matrices. intro - Introduction to basic matrix operations in MATLAB. inverter - Demonstrate the inversion of a matrix. buckydem - Connectivity graph of the Buckminster Fuller geodesic dome. sparsity - Demonstrate effect of sparsity orderings. MATLAB/Numerics. funfuns - Demonstrate functions that operate on other functions. fitdemo - Nonlinear curve fit with simplex algorithm. MATLAB/Visualization. graf2d - 2D Plots: Demonstrate XY plots in MATLAB. graf2d2 - 3D Plots: Demonstrate XYZ plots in MATLAB. MATLAB/Language. xplang - Introduction to the MATLAB language. graf3d - Demonstrate Handle Graphics for surface plots. MATLAB/Differential equations. odedemo - Demo for the MATLAB Differential Equation solvers. odeexamples - Browse the MATLAB ODE/DAE/BVP/PDE examples. See also SIMDEMOS Si escribimos help fifteen obtendremos la explicación de este programa. >> help fifteen FIFTEEN A sliding puzzle of fifteen squares and sixteen slots. Win by sequentially lining all fifteen squares up, leaving the last square empty. Moves are made by clicking on a tile which lies in either the same row or column as the open slot. This M-file, which implements this game, demonstrates good use of «switch-yarding.» Switch-yard programming requires the GUI to drive the program. Based on the action of the GUI, it will call the same function using different inputs to «switch» among tasks. 37 38 1. I NTRODUCCIÓN A MATLAB Del help general podemos pedir ahora información de las funciones elementales que nos lista las funciones matemáticas más usadas con el comando help elfun >> help elfun Elementary math functions. Trigonometric. sin - Sine. sinh - Hyperbolic sine. asin - Inverse sine. asinh - Inverse hyperbolic sine. cos - Cosine. cosh - Hyperbolic cosine. acos - Inverse cosine. acosh - Inverse hyperbolic cosine. tan - Tangent. tanh - Hyperbolic tangent. atan - Inverse tangent. atan2 - Four quadrant inverse tangent. atanh - Inverse hyperbolic tangent. sec - Secant. sech - Hyperbolic secant. asec - Inverse secant. asech - Inverse hyperbolic secant. csc - Cosecant. csch - Hyperbolic cosecant. acsc - Inverse cosecant. acsch - Inverse hyperbolic cosecant. cot - Cotangent. coth - Hyperbolic cotangent. acot - Inverse cotangent. acoth - Inverse hyperbolic cotangent. Exponential. exp - Exponential. log - Natural logarithm. log10 - Common (base 10) logarithm. log2 - Base 2 logarithm and dissect floating point number. pow2 - Base 2 power and scale floating point number. sqrt - Square root. nextpow2 - Next higher power of 2. 1.8 A YUDAS EN MATLAB 39 Complex. abs - Absolute value. angle - Phase angle. complex - Construct complex data from real and imaginary parts. conj - Complex conjugate. imag - Complex imaginary part. real - Complex real part. unwrap - Unwrap phase angle. isreal - True for real array. cplxpair - Sort numbers into complex conjugate pairs. Rounding and remainder. fix - Round towards zero. floor - Round towards minus infinity. ceil - Round towards plus infinity. round - Round towards nearest integer. mod - Modulus (signed remainder after division). rem - Remainder after division. sign - Signum. Por ejemplo, podemos pedir información de la función floor. >> help floor FLOOR Round towards minus infinity. FLOOR(X) rounds the elements of X to the nearest integers towards minus infinity. See also ROUND, CEIL, FIX. También podemos obtener ayuda presionando el ícono de Help en la barra de herramientas con lo que obtendremos la ventana de la figura 1.11. En esta ventana tenemos del lado izquierdo el navegador de ayuda (Help Navigator) con cuatro pestañas: Contents, Index, Search y Favorites. (Contenido, Indice, Búsqueda y Favoritas). Para buscar información de un tópico seleccionamos la pestaña de Búsqueda (Search) donde vemos un campo para datos donde escribimos alguna palabra relacionada con el tópico de interés o el nombre de alguna instrucción de la cual deseamos ver más información. Por ejemplo, si escribimos floor y presionamos el botón de Go, obtendremos a la derecha la explicación de la función floor como se muestra en la figura 1.12. 40 1. I NTRODUCCIÓN A MATLAB Figura 1.11 Ventana de la ayuda de MATLAB. Figura 1.12 Búsqueda de un tópico con Search. 1.8 A YUDAS EN MATLAB 41 1.8.1 El comando lookfor Este comando seguido de una palabra nos sirve para encontrar todas las funciones que en su descripción de la ayuda contengan esa palabra. El formato es lookfor palabra Por ejemplo, si deseamos encontrar las funciones que en su descripción contengan la palabra hyperbolic lo hacemos con lookfor hyperbolic. >> lookfor hyperbolic ACOSH Inverse hyperbolic cosine. ACOTH Inverse hyperbolic cotangent. ACSCH Inverse hyperbolic cosecant. ASECH Inverse hyperbolic secant. ASINH Inverse hyperbolic sine. ATANH Inverse hyperbolic tangent. COSH Hyperbolic cosine. COTH Hyperbolic cotangent. CSCH Hyperbolic cosecant. SECH Hyperbolic secant. SINH Hyperbolic sine. TANH Hyperbolic tangent. ACOSH Symbolic inverse hyperbolic cosine. ACOTH Symbolic inverse hyperbolic cotangent. ACSCH Symbolic inverse hyperbolic cosecant. ASECH Symbolic inverse hyperbolic secant. ASINH Symbolic inverse hyperbolic sine. ATANH Symbolic inverse hyperbolic tangent. COSH Symbolic hyperbolic cosine. COTH Symbolic hyperbolic cotangent. CSCH Symbolic hyperbolic cosecant. SECH Symbolic hyperbolic sechant. SINH Symbolic hyperbolic sine. TANH Symbolic hyperbolic tangent. De esta manera, con el comando help podemos obtener información de la función que nos interesa. 42 1. I NTRODUCCIÓN A MATLAB 1.8.2 El comando which Este comando sirve para localizar el directorio donde se encuentran archivos –m. El formato es which nombre_del_archivo_o_función Por ejemplo, para localizar la función poly escribimos >> which poly C:\MATLABR7\toolbox\matlab\polyfun\poly.m Un uso adicional del comando which es para saber si un nombre de función ya existe. De esta manera se evita darle a alguna de nuestras funciones el mismo nombre de una que ya existe, lo que elimina problemas de ejecución. Variables y Funciones Uno de los atributos más poderosos de MATLAB es la manera en que puede manejar variables y funciones. Mientras que en otros lenguajes se deben definir desde un principio las variables a usarse, en MATLAB éstas se definen conforme se plantean por primera vez, no importa si se trata de variables de una dimensión o multidimensionales, matrices o cualquier otro elemento numérico o simbólico. 2.1 Variables Como se mencionó anteriormente, las variables se definen al momento que se usan por primera vez. Por ejemplo, si en un problema es necesario especificar el valor inicial de una variable Y0, esta variable se crea al escribir su valor >>Y0=1 Y0= 1 Esta variable tendrá este valor hasta que el usuario lo cambie por otro. Los nombres de las variables pueden tener un tamaño de hasta 63 caracteres de largo y el primer carácter no debe ser un número. Si un nombre de variable tiene más de 63 caracteres, sólo se conservan los primeros 63. Por ejemplo, si escribimos >> El_nombre_de_esta_variable_tiene_mas_de_sesenta_y_tres_caracteres_=13 El_nombre_de_esta_variable_tiene_mas_de_sesenta_y_tres_caracter=13 vemos que MATLAB solamente conserva los primeros 63 caracteres en el nombre. Los números y variables como Y0 se conocen también como reales. Se pueden definir números complejos usando el número imaginario i = j = 1 . Así tenemos >> Z=3+2*j Z= 3.0000 + 2.0000i 45 46 2. V ARIABLES Y F UNCIONES que es lo mismo que z=2+3*j. En el caso de números complejos tales como c= a+b*i, a y b se denominan la parte real y la parte imaginaria, respectivamente, las cuales se pueden obtener con real(z), e imag(z), >> real(z) ans = 2 >> imag(z) ans = 3 2.2 Funciones Existen dos tipos de funciones en MATLAB. Las predefinidas por MATLAB y las definidas por el usuario. A las funciones predefinidas en MATLAB se les llama funciones elementales. Algunas de ellas se muestran en la tabla 1.2. Es posible definir expresiones dentro de MATLAB. Por ejemplo, la ecuación para calcular el área de un círculo de radio r es A = r2 Si r=4, el área se calcula con >>A=pi*4^2 A= 50.2655 El área de un pentágono está dada por A= Perímetro × Apotema 2 2.2 F UNCIONES 47 Si el lado es 8.6 y el apotema es 7.9, entonces el perímetro y el área del pentágono se encuentran con >> Perimetro= 5*8.6; >> Area= (Perimetro * 7.9)/2 Area = 169.8500 2.2.1 Variables simbólicas Una variable simbólica es una variable a la que no se le ha asignado un valor numérico. MATLAB incluye un bloque de matemáticas simbólicas (Symbolic Math Toolbox) que sirve para que el usuario pueda definir funciones. Una variable simbólica se define con a=sym(‘a’) x=sym(‘x’) Por ejemplo, si se quiere trabajar con una función f = 3x3 + ax + b ésta se puede crear definiendo primero las variables a, b y x como simbólicas para poder definir luego la función f. Así, >> a=sym(‘a’); >> b=sym(‘b’); >> x=sym(‘x’); >> f=sym(‘3*x^3+a*x+b’) f= 3*x^3+a*x+b Los primeros tres renglones se pueden escribir también como syms a b x 48 2. V ARIABLES Y F UNCIONES También se pueden definir variables complejas. Por ejemplo, si queremos definir z=x i y donde x, y son variables reales, entonces primero declaramos x, y como variables simbólicas reales con >> x=sym(‘x’, ‘real’); >> y=sym(‘y’, ‘real’); ` y luego definimos el número complejo z= x+i*y, o bien >>syms x y real >>z=x+i*y z= x+i*y Con x, y, z definidas así podemos realizar funciones con números complejos. Por ejemplo, para obtener el complejo conjugado usamos conj(z) >>conj(z) %regresa el complejo conjugado ans = x-i*y >>conj(x) ans = x Como x es real, la operación conj(x) regresa el mismo valor. El producto de z por su complejo conjugado nos da su magnitud al cuadrado dada por x 2 + y2 >>z*conj(z) ans = (x+i*y)*(x-i*y) 2.2 F UNCIONES 49 Usando la instrucción expand que desarrolla el producto indicado, obtenemos >> expand(ans) ans = x^2+y^2 Para quitar la restricción de que x, y son reales usamos >>syms x y unreal De esta manera, x, y pueden ser ahora definidas como variables complejas. Otras funciones simples son round, floor y ceil (ceiling). Estas funciones redondean un número con parte decimal. round redondea al entero más cercano. ceil redondea al próximo entero mayor que x. Por ejemplo, 5.4 lo redondea a 6, mientras que –7.8 lo redondea a –7. Por otro lado floor redondea hacia el próximo entero menor que x. Por ejemplo, >> ceil(4.5) ans = 5 >> ceil(-3.7) ans = -3 >> floor(5.6) ans = 5 >> floor(-8.9) ans = -9 >> round(7.45) ans = 7 >> round(-7.1) ans = -7 50 2. V ARIABLES Y F UNCIONES 2.2.2 Operaciones con funciones Las funciones definidas de manera simbólica se pueden derivar o integrar, o se les puede aplicar cualquier otra operación. Por ejemplo, el operador para derivar una función es diff(f), entonces para derivar f = x 3 + 2x usamos >>syms x >>f =sym(‘x^3+2*x’) f= x^3+2*x >>derivada_f=diff(f) derivada_f = 3*x^2+2 >>pretty(derivada_f) 2 3x +2 Nótese que el comando pretty hace que la ecuación se escriba como lo hace un editor de ecuaciones. Para integrar usamos el comando int(f). Entonces >>integral_f=int(f) integral_f = 1/4*x^4+x^2 >>pretty(integral_f) 4 1/4 x 2 +x 2.2 F UNCIONES 51 MATLAB tiene una herramienta para observar el comportamiento de una función. Esta herramienta tiene el nombre de funtool (herramienta de funciones) y se ejecuta escribiendo en la ventana de trabajo >>funtool Al ejecutar este comando aparecen tres ventanas como se muestra en la figura 2.1. Estas ventanas están numeradas como figura 1, 2 y 3. La figura 3 contiene 4 espacios para dar datos de las funciones f(x), g(x), rango de valores de x, y el valor de una constante a. Además contiene teclas para efectuar operaciones con estas funciones. Las operaciones van desde calcular la derivada de f hasta calcular la funcion composición de f[g(x)]. Los datos sirven para graficar las funciones f y g en las figuras 1 y 2, respectivamente. Al abrirse funtool da como valores de las funciones f(x)=x y g(x)=1, pero estos valores pueden ser modificados por el usuario. Por ejemplo, para las funciones f(x)=sen(x) y g(x)=1/(x+1) y el valor de a=2 y al presionar el botón de f*g obtenemos las figuras 2.2. El botón de Cycle nos permite usar distintas funciones que MATLAB tiene programadas para f y g. a) b) c) Figura 2.1 Ventanas de funtool. a) Gráfica de la función f, b) Gráfica de la función g, c) Ventana principal de funtool. 52 2. V ARIABLES Y F UNCIONES a) b) Figura 2.2 Ventanas de funtool para a) Gráfica de la función f*g, b) Gráfica de la función g, c) Ventana principal de funtool donde aparecen f*g, g y la tecla oprimida de f*g. c) 2.2 F UNCIONES 53 En el capítulo 4 se expone más información acerca de operaciones de cálculo con MATLAB. 2.2.3 Gráficas de funciones Para graficar una función podemos usar el comando ezplot. Por ejemplo, para graficar la función f(x) = x 3 + 2x , obtenemos que >>ezplot(f) produce la gráfica de f(x) definida antes y que se muestra en la figura 2.3. Figura 2.3 Gráfica de la función f(x) =x3+2x. También podemos usar el comando fplot. El intervalo de la gráfica lo damos ahí mismo como en >>fplot(‘sin(x)^2*cos(x)’,[0,4*pi]) que produce la gráfica de la figura 2.4. 54 2. V ARIABLES Y F UNCIONES Figura 2.4 Gráfica de la función f(x) =sen2(x) cos (x). Para graficar también podemos usar el comando plot. Para graficar la función sen x desde 0 hasta 2 usando este comando primero tenemos que definir un vector de valores de la variable x lo cual se puede hacer con x=( 0:0.1:2*pi); lo que indica que los valores de x empiezan en 0 y se incrementan en pasos de 0.1 hasta llegar a 2. El vector x también se puede definir con x=linspace( 0, 2*pi,70); que indica que el intervalo de los valores de x va de 0 hasta 2 y está dividido en 70 puntos. Para graficar el sen x entonces hacemos >>plot( x, sin(x)) que implícitamente evalúa la función que deseamos graficar, en este caso la función senx, para cada valor del vector x y luego procede a realizar la gráfica que se muestra en la figura 2.5. La diferencia entre el comando plot y los comandos fplot y ezplot es que en plot la función se da en forma vectorial y en los dos últimos se da en forma simbólica. 2.2 F UNCIONES 55 Es decir, en plot tenemos que generar el vector de valores de x, y de la función que deseamos graficar, mientras que esto no lo hacemos en las otras dos. Nótese que en fplot la función que deseamos graficar se escribe entre comillas. Figura 2.5 Gráfica de la función f(x) =sen(x). 2.2.4 Funciones internas de MATLAB MATLAB contiene un gran número de funciones que están disponibles al usuario cuando las requiera. Estas funciones se encuentran listadas en la ayuda de MATLAB. Al abrir la ayuda, lo que se hace con presionar el icono de ayuda en la barra de herramientas obtenemos una ventana de ayuda que a la izquierda presenta el Navegador de Ayuda (Help Navigator), en el cual en la pestaña de Búsqueda (Search) escribimos functions para obtener dos ligas de interés: Una lista de funciones por categoría (Categorical List) y una lista alfabética de funciones (Alphabetical list) la que se muestra en la figura 2.6. En cada uno de esas ligas se muestran ligas para las distintas funciones que están definidas en MATLAB. La liga de lista por categoría nos lleva a una lista de las funciones agrupadas en MATLAB agrupadas por categorías. En particular nos interesa la liga de Mathematics, como se muestra en la figura 2.7a que nos lleva a una ventana donde se agrupan las funciones según el área de las matemáticas donde se definen y usan. Por ejemplo, para la categoría de matemáticas vemos las funciones agrupadas bajo esta área en la figura 2.7b. Por otro lado, la liga de funciones por lista alfabética describe las funciones según la primera letra de su nombre y un ejemplo es la ventana de la figura 2.6. 56 2. V ARIABLES Y F UNCIONES Figura 2.6 Ventana de la ayuda para ver las funciones por categoría y por lista alfabética. Figura 2.7a Lista de funciones por categoría. Figura 2.7b Lista de funciones bajo la categoría de Mathematics. 2.2 F UNCIONES 57 De la misma manera, en la figura 2.6 de la ayuda podemos buscar hacia abajo la liga de la lista alfabética de funciones disponibles en el paquete de Matemáticas Simbólicas (Symbolic Math toolbox) como se muestra en la figura 2.8. Figura 2.8 Lista alfabética de funciones para el paquete de Matemáticas simbólicas. Están disponibles otros dos tipos de ayuda desde la ventana de trabajo de MATLAB. Estas ayudas son con los comandos help y mhelp. Cualquiera de estas ayudas se usan escribiendo el comando seguido de un nombre de función como en >>help función donde función es el nombre de la función de la que se desea información. Por ejemplo, help gradient nos da la información acerca de la función gradiente: >> help gradient GRADIENT Approximate gradient. [FX,FY] = GRADIENT(F) returns the numerical gradient of the matrix F. FX corresponds to dF/dx, the differences in the x (column) direction. FY corresponds to dF/dy, the differences in the y (row) direction. The spacing between points in each direction is assumed to be one. When F is a vector, DF = GRADIENT(F) is the 1-D gradient. 58 2. V ARIABLES Y F UNCIONES [FX,FY] = GRADIENT(F,H), where H is a scalar, uses H as the spacing between points in each direction. [FX,FY] = GRADIENT(F,HX,HY), when F is 2-D, uses the spacing specified by HX and HY. HX and HY can either be scalars to specify the spacing between coordinates or vectors to specify the coordinates of the points. If HX and HY are vectors, their length must match the corresponding dimension of F. [FX,FY,FZ] = GRADIENT(F), when F is a 3-D array, returns the numerical gradient of F. FZ corresponds to dF/dz, the differences in the z direction. GRADIENT(F,H), where H is a scalar, uses H as the spacing between points in each direction. [FX,FY,FZ] = GRADIENT(F,HX,HY,HZ) uses the spacing given by HX, HY, HZ. [FX,FY,FZ,...] = GRADIENT(F,...) extends similarly when F is N-D and must be invoked with N outputs and either 2 or N+1 inputs. Examples: [x,y] = meshgrid(-2:.2:2, -2:.2:2); z = x .* exp(-x.^2 - y.^2); [px,py] = gradient(z,.2,.2); contour(z),hold on, quiver(px,py), hold off Class support for input F: float: double, single See also diff, del2. Reference page in Help browser doc gradient MATLAB hace uso de algunas funciones de MAPLE. La ayuda de esas funciones se obtiene con mhelp. Por ejemplo, para el gradiente tenemos >> mhelp grad linalg[grad] - vector gradient of an expression Calling Sequence grad(expr, v) 2.2 F UNCIONES 59 grad(expr, v, co) Parameters expr - scalar expression v - vector or list of variables co - (optional), is either of type ‘=‘ or a list of three elements. This option is used to compute the gradient in orthogonally curvilinear coordinate systems. Description - The function grad computes the gradient of expr with respect to v. - It computes the following vector of partial derivatives: vector( [diff(expr, v[1]), diff(expr, v[2]), ...] ). - In the case of three dimensions, where expr is a scalar expression of three variables and v is a list or a vector of three variables: If the optional third argument co is of the form coords = coords_name or coords = coords_name([const]), grad will operate on commonly used orthogonally curvilinear coordinate systems. See ?coords for the list of the different coordinate systems known to Maple. For orthogonally curvilinear coordinates v[1], v[2], v[3] with unit vectors a[1], a[2], a[3], and scale factors h[1], h[2], h[3]: Let the rectangular coordinates x, y, z be defined in terms of the specified orthogonally curvilinear coordinates. We have: h[n]^2 = [diff(x,v[n])^2 + diff(y,v[n])^2 + diff(z,v[n])^2], n=1,2,3. The formula for the gradient vector is: grad(expr) = sum(a[n]/h[n]*diff(expr,v[n]),n=1..3); If the optional third argument co is a list of three elements which specify the scale factors, grad will operate on orthogonally curvilinear coordinate systems. - To compute the gradient in other orthogonally curvilinear coordinate systems, use the addcoords routine. 60 2. V ARIABLES Y F UNCIONES - The two dimensional case is similar to the three dimensional one. - The command with(linalg,grad) allows the use of the abbreviated form of this command. Examples > with(linalg): Warning, the protected names norm and trace have been redefined and unprotected > grad(3*x^2 + 2*y*z, vector([x,y,z])); [6 x, 2 z, 2 y] > f := r*sin(theta)*z^2: v := [r, theta, z]: > grad(f, v, coords=cylindrical); [ 2 2 ] [sin(theta) z , cos(theta) z , 2 r sin(theta) z] > g := r^2*sin(theta)*cos(phi): v := [r, theta, phi]: > grad(g, v, coords=spherical); [2 r sin(theta) cos(phi), r cos(theta) cos(phi), -r sin(phi)] # define the scale factors in spherical coordinates > h := [1, r, r*sin(theta)]: > grad(g, v, h); [2 r sin(theta) cos(phi), r cos(theta) cos(phi), -r sin(phi)] > l := cosh(xi)*cos(eta)*cos(phi): v := [xi, eta, phi]: > grad(l, v, coords=prolatespheroidal(1)); [sinh(xi) cos(eta) cos(phi) cosh(xi) sin(eta) cos(phi) [—————————————, - —————————————, [ 2 2 1/2 2 2 1/2 [(sinh(xi) + sin(eta) ) (sinh(xi) + sin(eta) ) 2.3 P OLINOMIOS 61 cosh(xi) cos(eta) sin(phi)] - —————————————] sinh(xi) sin(eta) ] ] See Also coords, linalg[diverge], linalg[curl], linalg[laplacian], addcoords, diff Como se aprecia, estas descripciones son distintas ya que se trata de dos paquetes distintos. Una forma alternativa de usar la ayuda mhelp es >> mhelp( ‘grad’ ) 2.3 Polinomios Una clase muy especial de funciones son los polinomios. Un polinomio es de la forma p(x) = a n x n + a n1 x n1 + ... + a 1 x +a 0 Los coeficientes de los polinomios están definidos en MATLAB como vectores renglón donde los coeficientes se escriben en orden descendente. Así x +1 x -1 4 x2 + 2 x –3 -2 x2 + 7 x +5 es es es es [1 1] [1 -1] [4 2 -3] [-2 7 5] Para el último ejemplo, en MATLAB se obtiene el polinomio como >>poli=[-2 sqrt(7) 5] poli = -2.0000 2.6458 5.0000 Para evaluar un polinomio en un valor dado de x, usamos el comando polyval (poli,x). Para nuestro ejemplo 62 2. V ARIABLES Y F UNCIONES >>polyval(poli,9) ans = -133.1882 Para evaluar varios puntos podemos simplemente escribir la lista de valores donde deseamos evaluar el polinomio, que para nuestro ejemplo será >>x=[1 -1 2 5 6 9]; >>polyval(poli,x) ans = 5.6458 0.3542 2.2915 -31.7712 -51.1255 -133.1882 Para graficar un polinomio sólo definimos los vectores x, y como >>x=linspace(0,2,100); >>poli=[6 3 -7 0.4]; >>y=polyval( poli,x); >>plot(x,y); >>grid que nos da la figura 2.9. Figura 2.9 Gráfica del polinomio p(x) =6x3+3x2-7x+0.4. Para calcular las raíces de un polinomio usamos el comando roots. Por ejemplo 2.3 P OLINOMIOS 63 >>raices=roots(poli) raices = -1.3803 0.8215 0.0588 Como el polinomio es de tercer grado roots nos entrega tres raíces. En MATLAB los coeficientes de un polinomio forman un vector renglón, mientras que las raíces son un vector columna. Las raíces las podemos graficar con >>stem (raices) >>title (‘Gráfica de las raíces del polinomio’) con lo que obtenemos la figura 2.10, a la cual le hemos cambiado los límites del eje x usando el menú EditAxis Properties y cambiando los límites del eje x de 0.0 a 4.0. Figura 2.10 Gráfica de las raíces del polinomio p(x) =6x3+3x2-7x+0.4. Dadas las raíces de un polinomio se puede obtener el polinomio original con >>a=poly(raices) a= 1.0000 0.5000 -1.1667 0.0667 64 2. V ARIABLES Y F UNCIONES Nótese que el polinomio resultante tiene el coeficiente de la mayor potencia igual a la unidad. Si multiplicamos este polinomio por 6 obtendremos los coeficientes del polinomio original, >> a=6*a a= 6.0000 3.0000 -7.0000 0.4000 Nótese que los dos polinomios tienen las mismas raíces. Puede ser posible la aparición de una parte imaginaria, lo que se debe a los errores de redondeo presentes en todo cálculo matemático realizado por una computadora y a que MATLAB trabaja con números complejos a menos que se indique que el resultado es real. Al usar el comando real eliminamos cualquier parte imaginaria espúrea o no. El producto de dos polinomios es otro polinomio. Para multiplicar dos polinomios usamos el comando conv(polinomio1, polinomio2). Por ejemplo: >> poli2=[3 -4 7]; >> poli1=[4 -2 0 1]; >> conv(poli1,poli2) ans = 12 -22 36 -11 -4 7 que corresponde al polinomio p(x) = 12x 5 22x 4 + 36x 3 11x 2 4x + 7 Con conv podemos multiplicar sólo 2 polinomios a la vez. Si deseamos multiplicar (x-1) (x-2) (x-3) tendremos que repetir conv, como >> p1=[1 -1]; >> p2=[1 -2]; >> p3=[1 -3]; >> p12=conv(p1,p2); >> pM=conv(p12,p3) pM = 1 -6 11 -6 2.3 P OLINOMIOS 65 Que se puede también realizar con >> pM=conv(p3,conv(p1,p2)) pM = 1 -6 11 -6 Ambos resultados nos dicen que pM(x) = x 3 6x 2 + 11x 6 Para dividir polinomios usamos el comando deconv que tiene la sintaxis [q, r] = deconv (a,b) que indica que al dividir a entre b (a/b) obtenemos el polinomio cociente q y el polinomio residuo r. Por ejemplo >> a=[1 6 24 50 77 84 64]; >> b=[1 4 9 16]; >> [q, r]=deconv(a,b) q= 1 2 7 -12 0 0 r= 0 0 30 80 256 Esto es, los polinomios del cociente y del residuo son q(x) = x 3 + 2x 2 + 7x 12 y r(x) 30x 2 + 80x + 256 Para sumar polinomios, éstos deben ser del mismo grado y si no lo son es necesario añadir ceros para tener el mismo número de coeficientes. Entonces para que los polinomios a y b dados anteriormente tengan el mismo número de elementos añadimos tres ceros al polinomio b. Para no afectar el grado del polinomio, los ceros se añaden en las posiciones correspondientes a las potencias más altas, es decir, los primeros elementos del vector de coeficientes. Como b es el polinomio de menor 66 2. V ARIABLES Y F UNCIONES orden, entonces tenemos que b se modifica sólo añadiendo tres ceros como se muestra a continuación: >> a=[1 6 24 50 77 84 64]; >> b=[0 0 0 1 4 9 16]; >>c= a+b c= 1 6 24 51 81 93 80 O bien c(x) = x 6 + 6x 5 + 24x 4 + 51x 3 + 81x 2 + 93x + 80 Para derivar un polinomio se usa el comando polyder (polinomio). Para el polinomio a obtenemos >> polyder(a) ans = 6 30 96 150 154 84 Una función racional es una función formada por el cociente de dos polinomios. Es decir, es de la forma polinomio a polinomio b Esta función se puede desarrollar en fracciones parciales. Por ejemplo para los polinomios a y b dados por a(s) = 10s + 20 b(s)= s 3 + 8s 2 + 19s + 12 Se tiene que el desarrollo en fracciones parciales está dado por 10(s + 2) 10(s + 2) 6.667 5 1.667 = = + + +0 2 s + 8s + 19s + 12 (s + 4)(s + 3)(s + 1) (s + 4) (s + 3) (s + 1) 3 2.3 P OLINOMIOS 67 A las raíces del denominador dadas por s = -1, -3, -4 se les llama los polos, a los valores r= -6.667, 5 y 1.667 se les llama los residuos y 0 es un término constante, denotado por k y que en este caso tiene el valor de cero. En MATLAB los polos, residuos y término constante se obtienen con el comando residue (poli_numerador, poli_denominador). Los datos son los polinomios del numerador y denominador, respectivamente. Por ejemplo, >> num=[10 20]; >> den=[1 8 19 12]; >> [residuo, polos, k]=residue(num, den) residuo = -6.6667 5.0000 1.6667 polos = -4.0000 -3.0000 -1.0000 k= [] La operación inversa se puede obtener con el mismo comando. En este caso los datos de residue son los residuos, los polos y la constante k. Lo que se obtiene son los coeficientes de los polinomios del numerador y denominador. >> [n, d]=residue(residuo, polos, k) n= -0.0000 10.0000 20.0000 d= 1.0000 8.0000 19.0000 12.0000 68 2. V ARIABLES Y F UNCIONES Para una lista de todas las funciones que incluyen el uso de polinomios se puede consultar la ayuda seleccionando la pestaña de Search (Búsqueda) y escribiendo Polynomial, como se muestra en la figura 2.11. Figura 2.11 Búsqueda de ayuda para operaciones con polinomios. 2.4 Ajuste de curvas En muchas aplicaciones científicas y de ingeniería es necesario describir datos de mediciones en forma analítica por medio de un polinomio. La expresión de los datos de esta manera nos permite predecir resultados o simplemente describir nuestro experimento con una ecuación matemática. Para expresar nuestros datos por medio de un polinomio, MATLAB usa el comando polyfit cuya sintaxis es polyfit(x,y,n) donde x,y son los vectores de datos y n es el orden del polinomio deseado. Por ejemplo, supongamos que se tiene la tabla 2-1 que contiene datos de una medición. Tabla 2-1 Datos de medición x y 0 1 2 3 4 5 6 0 1 3.3 2.2 5.6 4.4 0 Una gráfica de estos datos la obtenemos con 2.4 A JUSTE DE CURVAS 69 >> x = [ 0, 1, 2, 3, 4, 5, 6]; >> y = [0, 1, 3.3, 2.2, 5.6, 4.4, 0]; >> plot ( x, y, ‘*k’) Figura 2.12 Gráfica de los puntos x= [ 0, 1, 2, 3, 4, 5, 6]. La gráfica se muestra en la figura 2.12, donde también hemos cambiado los límites de los ejes x,y en el menú de EditAxis Properties de -1 a 7. El símbolo ‘*k’ indica que los puntos se van a graficar con asteriscos. Ahora usamos polyfit para encontrar un polinomio de grado 3 que pasa por estos puntos >> a = polyfit( x, y, 3) a= -0.1583 1.0024 -0.3060 0.2190 lo que nos indica que el polinomio obtenido es a(x) = 0.1583x 3 + 1.0024x 2 0.3060x + 0.2190 Para graficar el polinomio a(x) junto con los puntos de las mediciones empleamos >> x1=linspace(0,7,100); >> p1=polyval(a, x1); >> plot(x, y,’*r’,x1, p1) Se obtiene la figura 2.13, que nos muestra el polinomio y los puntos a los cuales deseamos ajustar el polinomio. 70 2. V ARIABLES Y F UNCIONES Figura 2.13 Gráfica de los puntos x = [0,1,2,3,4,5,6] y del polinomio de interpolación de grado 3. En la figura obtenida vemos que el polinomio de 3er grado es una aproximación pobre ya que en algunos de los puntos la distancia a la curva del polinomio puede ser considerable. Si cambiamos a un polinomio de quinto grado >> a=polyfit(x,y,5) a= -0.0087 0.0718 -0.1301 -0.1960 1.6957 -0.0618 >> p1=polyval(a, x1); >> plot(x,y,’*r’,x1,p1) y si volvemos a graficar obtenemos la figura 2.14, que es una mejor aproximación. Para n= 5 se obtiene la mejor aproximación. Figura 2.14 Gráfica de los puntos x=[0,1,2,3,4,5,6] y del polinomio de interpolación de quinto grado. 2.5 A JUSTE CON SPLINES CÚBICOS 71 2.5 Ajuste con splines cúbicos Un spline cúbico proporciona otra manera de ajustar una curva a un conjunto de datos. La sintaxis es y= spline(entrada x, entrada y, x) donde entrada x y entrada y son las coordenadas de los puntos, x es un vector de puntos por donde quisiéramos que el spline y tomara los valores del vector y. Por ejemplo >> entrada_x=[1 2 3 4 5 6]; >> entrada_y=[1 0 4.4 0 5.5 0]; >> x=linspace(1,6,100); >> y=spline(entrada_x, entrada_y, x); >> plot(entrada_x, entrada_y,’*r’, x, y) nos da la figura 2.15, la cual muestra los puntos y el spline. Figura 2.15 Gráfica de los puntos x=[0,1,2,3,4,5,6] y del spline que aproxima la curva que pasa por ellos. Si comparamos este resultado con el que obtuvimos usando un polinomio de quinto grado con polyfit vemos que el spline da mejores resultados ya que el spline es exacto en los puntos de la medición. Esto se debe a que el spline es en realidad una función formada por varios polinomios de 3er grado con la condición adicional de que el spline es diferenciable en todo punto. 72 2. V ARIABLES Y F UNCIONES 2.5.1 Interfase para ajuste de curvas Otra forma de realizar el ajuste de curvas consiste en usar la interfase de ajuste (Basic Fitting) disponible en el menú de la figura. Para usar esta interfase primero graficamos los puntos de datos como lo hicimos al obtener la figura 2.12. Ahora en el menú Tools seleccionamos Basic Fitting como se muestra en la figura 2.16, y se obtiene el menú de la figura 2.17. Aquí se nos muestran varias opciones para polinomios interpoladores. Seleccionamos la primera opción de spline interpolant y la opción de 5th. degree polynomial (polinomio de 5º grado). Vemos que automáticamente se grafican el polinomio de 5º grado y la aproximación por splines, que son idénticas a las obtenidas en las figuras 2.13 y 2.14. Adicionalmente podemos mostrar las ecuaciones de los polinomios al marcar el espacio de Show equations. Además, podemos ver el error de cada aproximación marcando el espacio de Plot residuals que tiene la opción para representarlos con una gráfica de barras (bar plot), con puntos (scatter plot), o con líneas (line plot) y que se muestra en la figura 2.18. Figura 2.16 Selección del menú de Basic Fitting. Figura 2.17 Ventana de Basic Fitting. 2.5 A JUSTES CON SPLINES CÚBICOS 73 Figura 2.18 Curvas del polinomio de 5º grado y del spline, y la gráfica de los errores. Figura 2.19 Ventana de Basic Fitting con ventana de coeficientes y cálculo de la función. Si observamos la esquina inferior derecha de la figura 2.17 vemos una flecha que nos abre otra ventana que muestra los coeficientes del polinomio de 5º grado y otra flecha que al presionarla nos abre una ventana donde podemos evaluar el polinomio que obtuvimos y que se muestran en la figura 2.19. 74 2. V ARIABLES Y F UNCIONES 2.6 Solución de ecuaciones Para resolver ecuaciones MATLAB usa el comando solve. El argumento de este comando puede ser una ecuación como ax+b=0 o puede ser una expresión. En el segundo caso MATLAB iguala a cero la expresión. Por ejemplo, >> solve(‘a*x+b=0’) ans = -b/a >> solve(‘a*x+b’, ‘x’) ans = -b/a En el primer solve, MATLAB supone que la incógnita es x. En el segundo explícitamente elegimos a x como la incógnita. Si deseamos resolver para a entonces cambiamos a >> solve(‘a*x+b’, ‘a’) ans = -b/x En ocasiones MATLAB nos da un valor numérico para la solución. Como en >> f=solve(‘cos(x)=sin(x)’) f= 1/4*pi >> double(f) ans = 0.7854 Si no se puede encontrar una solución simbólica, MATLAB calcula una solución numérica como en 2.6 S OLUCIÓN DE ECUACIONES 75 >> x=solve(‘exp(x)=tan(x)’) x= 1.3063269404230792361743566584407 También se pueden resolver ecuaciones aunque indirectamente con fzero. Para este comando se necesita definir la función previamente en un archivo y dar un valor inicial de la solución. La sintaxis de fzero es x_sol=fzero(funcion, x_ini) donde x_sol es el vector con las soluciones, funcion es la función de la cual queremos encontrar sus soluciones y x_ini es el valor inicial de la solución. Por ejemplo, para encontrar las soluciones de (x )x = 7 definimos la ecuación como fx = (x )x 7 Esta ecuación se puede describir en un archivo-m. Para editar archivos-m tenemos que abrir el editor de MATLAB seleccionado FileNewM-File, como se muestra en la figura 2.20a. Ahí describimos la ecuación con el siguiente archivo-m: function y=fx(x); %Este es el archivo fx.m y=(x-3).*x-7; Figura 2.20a Secuencia para abrir el editor de MATLAB. Al salvarlo, MATLAB pregunta si lo guarda con el nombre por omisión como fx.m, como se muestra en la figura 2.20b. 76 2. V ARIABLES Y F UNCIONES Figura 2.20b Archivo de la función. Una vez creado el archivo, desde la ventana de comandos de MATLAB se ejecuta mediante la instrucción >> fzero(‘fx’,4) ans = 4.54138126514911 Para encontrar la otra solución, >> fzero(‘fx’,-1) ans = -1.54138126514911 Una manera de encontrar valores iniciales para las soluciones consiste en graficar la función por medio de fplot o ezplot, y ver dónde la función tiene cruces por cero. Para nuestra función sería >> ezplot(‘función’) >> fplot(‘función’) Por ejemplo, para encontrar las raíces de 3 x 3 = sen x hacemos >> syms x >> ezplot(x^3-sin(x)-3) >> grid que nos da la gráfica de la figura 2.21. 2.7 O TRAS FUNCIONES DISPONIBLES EN MATLAB 77 Figura 2.21 Gráfica de la función x3-sen(x)-3. donde vemos que una raíz está cerca de x=2. Entonces, con fzero y con un valor inicial de x=2 obtenemos la raíz correcta con >> raiz=fzero(‘x^3-sin(x)-3’,2) raiz = 1.5874 Finalmente, es necesario recordar que se puede obtener más información de las funciones solve, fzero, ezplot y fplot en la ayuda o simplemente escribiendo en la ventana de trabajo help o mhelp seguidos del nombre de la función de interés, por ejemplo, >>help solve >>mhelp solve lo que nos proporcionará la información para usar apropiadamente dichas funciones. 2.7 Otras funciones disponibles en MATLAB Existen en MATLAB algunas otras funciones que nos sirven tanto para evaluar funciones como para medir el tiempo de ejecución . 2.7.1 Evaluación de funciones con eval y feval Para evaluar una función se puede usar el comando eval. Por ejemplo para evaluar la función sen(x) en /2, cuyo valor es la unidad, podemos escribir en la ventana de trabajo. 78 2. V ARIABLES Y F UNCIONES >> eval (‘sin(pi/2)’) con lo que obtenemos ans = 1 El comando eval requiere que la función a evaluar esté entre comillas como si fuera una cadena de caracteres además de que debe encontrarse definida por MATLAB o haberse definido previamente por el usuario. Otro comando útil es feval. Por ejemplo, feval (‘cos‘, 2) evalúa la función cos(x) en x = 2. Podemos evaluar la función deseada en un vector de valores. Por ejemplo: >> x = [ 0, 0.2, 0.4, 0.6, 0.8, 1 ]; >> feval ( ‘cos’, x) ans = 1.0000 2.7.2 0.9801 0.9211 0.8253 0.6967 0.5403 El comando pause El comando pause causa que MATLAB pase y espere un determinado tiempo antes de continuar los cálculos durante la ejecución de programas escritos usando MATLAB. Las diferentes opciones de pause son: 2.7.3 Pause Espera a que el usuario responda y MATLAB continúa ejecutándose al oprimirse cualquier tecla. Pause (n) MATLAB para y espera n segundos y luego continúa ejecutándose. Pause off Especifica que cualquier pause posterior no se ejecuta. Pause on Especifica que todos los pause posteriores se ejecutan. Los comandos wavread y sound El comando wavread permite que se lea un archivo wav. La sintaxis es: >> [y, fs] = wavread (fnombre) 2.7 O TRAS FUNCIONES DISPONIBLES EN MATLAB 79 donde fnombre es el nombre del archivo que deseamos leer, y es un vector renglón que contiene los datos y fs es la frecuencia de muestreo con que se grabó el archivo wav. El comando sound reproduce un archivo wav con una frecuencia de muestreo especificada. La sintaxis es: >> sound (y,fs) El archivo wav se reproduce a través de la tarjeta de sonido de la computadora. El disco compacto que acompaña a este texto contiene el archivo musica.wav en el directorio capitulo2. Direccionamos la ventana de trabajo para este directorio y ejecutamos: >> fs = 24000 >> [y,fs] = wavread (musica) >> sound (y,fs) y podremos escuchar el archivo musica.wav. 2.7.4 Hora, fecha y tiempo de ejecución Existen varias funciones que nos permiten determinar la hora, fecha y tiempo de ejecución de una o de un conjunto de instrucciones ejecutadas en MATLAB. Aquí mencionaremos cputime, clock, date y tic y toc El comando cputime indica cuánto tiempo ha estado funcionando MATLAB. Si ejecutamos cputime luego de que ha terminado de arrancar MATLAB, se obtiene un tiempo parecido al que se muestra en la figura 2.22. Figura 2.22 Ventana de MATLAB mostrando el conteo de cputime. 80 2. V ARIABLES Y F UNCIONES Si esperamos aproximadamente un minuto sin hacer nada y ejecutamos otra vez cputime, obtenemos el tiempo transcurrido como se ve en la figura 2.23. Figura 2.23 Ventana de MATLAB mostrando el tiempo transcurrido con cputime. Podemos usar cputime para calcular el tiempo que tarda MATLAB en ejecutar una operación, por ejemplo: >>t_inicial = cputime; >>x = linspace (0, 0.1 , 1.00); >>a = sin (x); >>t_final = cputime – t_inicial t_final = 0.0500 Aquí vemos que el tiempo en el que se calculó el vector x y los valores de sen (x) es de 0.05 segundos. Con el comando clock obtenemos un vector renglón con los datos correspondientes a la fecha y la hora. El formato de los datos es el año, mes, día, hora, minutos y segundos. >> clock ans = 1.0e+003 * 2.0030 0.0100 0.0140 0.0100 0.0180 0.0559 2.7 O TRAS FUNCIONES DISPONIBLES EN MATLAB 81 Con los comandos tic y toc se calcula el tiempo transcurrido entre estos comandos. >> tic; >> x = linspace (0,0.01,100); >> x = tan (x).* sin (x); >> toc; elapsed_time = 0.0500 Esto nos indica que el tiempo empleado para ejecutar las instrucciones entre tic y toc fue de 0.01 segundos. El tiempo empleado en ejecutar estas instrucciones va a depender de la velocidad del procesador y de qué programas estén activos en el momento de ejecutarlas. La instrucción date nos da la fecha actual en una cadena. >> date ans = 14-Oct-2003 Y como con cualquier cadena, podemos escribir sólo algunos caracteres de la cadena. >> cadena = date; >> cadena (3:7) ans = -Oct- Matrices y Álgebra Lineal Como mencionamos en el capítulo 1, MATLAB fue diseñado originalmente para realizar operaciones con matrices, por esta razón es importante comprender la forma en que MATLAB trabaja con ellas. 3.1 Matrices Una matriz es un arreglo de números u objetos. Las matrices encuentran uso y aplicación en un gran número de situaciones. Por ejemplo, pueden contener los coeficientes de un sistema de ecuaciones simultáneas o representar las intensidades y colores de los pixeles de una imagen, entre otras muchas y variadas aplicaciones de matrices. De la matriz 1 2 3 4 A = 5 6 7 8 9 10 11 12 se dice que tiene 3 renglones o filas y 4 columnas y que es de dimensión 3 x 4. Si una matriz tiene n renglones y m columnas es una matriz n x m. A n x m se le llama la dimensión de la matriz. Para MATLAB, la matriz A se define por >> A = [1 2 3 4;5 6 7 8;9 10 11 12] A= 1 5 9 2 6 10 3 7 11 4 8 12 donde hemos separado los elementos de un mismo renglón por un espacio (se pueden separar con una coma) y los renglones se separan con punto y coma. Cada elemento de la matriz A tiene una posición ij, que corresponde a su posición en la i-ésima fila y en la j-ésima columna. Por ejemplo, el elemento 5 tiene la posición 2,1, mientras que el elemento 11 tiene la posición 3,3. El comando A(i,j) proporciona el elemento del renglón (también llamado fila) i y la columna j. Si el número de renglones es igual al número de columnas, es decir, n = m se dice que la matriz es cuadrada de dimensión n. Otros comandos se dan en la tabla 3-1. 85 86 3. M ATRICES Y Á LGEBRA L INEAL Tabla 3-1 Comandos de matrices A(a:b,c:d) Submatriz formada por las filas de la a hasta la b y por las columnas de la c hasta la d. A (a:p:b,c:q;d) Submatriz formada por las filas de la a hasta la b de p en p filas y por las columnas de la c hasta la d de q en q filas. A(i,:) Vector formado con los elementos de la i-ésima fila. A(:,j) Vector formado con los elementos de la j-ésima columna. Mayor información sobre matrices y álgebra lineal se puede obtener en la ayuda seleccionando en la pestaña de búsqueda (Search) Matrices, como se muestra en la figura 3.1. Figura 3.1 Ayuda para Matrices y Álgebra Lineal. 3.2 Operaciones básicas con Matrices Las operaciones básicas con matrices son la suma, resta, multiplicación y división. La suma de dos matrices sólo se puede realizar si ambas son de la misma dimensión. Por ejemplo considérense las matrices A, B y C dadas por 3 7 2 A= 4 9 1 4 12 7 B= 8 6 2 2 -7 C = 4 -8 -9 6 3.2 O PERACIONES BÁSICAS CON M ATRICES 87 Las dimensiones de cada matriz son para A 2x3, para B 2x3 y para C 3x2. Sólo se pueden sumar o restar A y B ya que ambas matrices son de dimensión 2x3 mientras que C es de dimensión 3x2. Entonces: >> A+B ans = -1 12 5 15 9 1 >> A-B ans = 7 -4 -19 3 -5 -3 >> B-A ans = -7 4 19 -3 5 3 La multiplicación de dos matrices sólo se puede realizar si el número de columnas de la primera matriz es igual al número de renglones de la segunda matriz. En nuestras matrices, se puede efectuar el producto de A y C, C y A, así como el de B y C, C y B. Estos productos se obtienen con >> A*C ans = -40 47 53 -106 >> C*A ans = -22 -77 -20 -100 -3 117 11 16 -24 88 3. M ATRICES Y Á LGEBRA L INEAL >> C*B ans = -64 -80 84 -18 0 -72 0 12 -51 >> B*C ans = -23 22 -26 -92 Para la división de matrices existen dos posibilidades A / B y A \ B. Para las matrices dadas tenemos que >> A/B ans = -0.4130 0.2287 0.0798 0.6889 >> A\B ans = 0.3636 0.7273 0 2.7273 -0.5455 0 1.4000 -0.4000 0 1.2500 -0.1667 0 -0.2000 0.1000 0 >> B\A ans = 0.2500 0.3333 0 Para potencias de matrices existen dos posibilidades. Si p es un escalar A^p nos da la matriz A elevada a un escalar p. Por otro lado p^A nos da el escalar p elevado a una matriz A. Los siguientes ejemplos ilustran esto: 2 5 D = 4 9 p=2 3.2 O PERACIONES BÁSICAS CON M ATRICES 89 >> D.^p ans = 4 16 25 81 >> p.^D ans = 4 16 32 512 24 44 55 101 >D^p ans = >> p^D ans = 1.0e+003* 0.4455 1.0202 0.8162 1.8738 Otras operaciones con matrices se dan en la tabla 3-2. Nótese que en algunos casos es necesario que la matriz sea una matriz cuadrada. Tabla 3-2 Operaciones con matrices diag (A) Vector formado con los elementos de la diagonal de A. inv (A) Inversa de A. A’ Transpuesta de A. transpose (A) Transpuesta de A. det (A) Determinante de A. rank(A) Rango de A. trace (A) Suma de los elementos de la diagonal de A. norm (A) Norma de A. A^c Matriz A a la c potencia A.^c Cada elemento de A se eleva a la c potencia. A/B Matriz A entre B. A\B Es lo mismo que B/A. 90 3. M ATRICES Y Á LGEBRA L INEAL Algunas matrices especiales son ones (m,n) matriz de dimensión m x n donde todos los elementos son la unidad. ones (n) matriz cuadrada de orden n donde todos los elementos son la unidad. zeros (m,n) matriz de dimensión m x n donde todos los elementos son cero. zeros (n) matriz cuadrada de orden n donde todos los elementos son cero. eye (n) matriz identidad cuadrada de orden n. eye (m,n) matriz de dimensión m n con unos en la diagonal principal y ceros en los demás elementos. Para mayor información de las operaciones fundamentales, ver la ayuda de MATLAB en matrices MATLAB, como se muestra en la figura 3.2a, lo que nos lleva a la figura 3.2b donde se explican dichas funciones. Figura 3.2a Búsqueda de información de matrices. Figura 3.2b Opciones para ayuda de operaciones con matrices. 3.3 V ECTORES 91 3.3 Vectores Un vector es una matriz con un solo renglón llamado vector renglón, o con una sola columna, llamado vector columna. Los vectores siguen las reglas de las matrices. Como ejemplo, el vector renglón dado por: x = [ 1 3 -7 4 ] es un vector renglón de dimensión 4, mientras que y = [ 9 ; 18 ; -5 ; 6 ; -7 ; 2 ; 4 ; 3 ; 11 ; 17 ] es un vector columna de dimensión 10. Si sólo deseamos desplegar algunos elementos de un vector usamos y(a : b) donde sólo se van a desplegar los elementos del a – ésimo al b – ésimo. Por ejemplo >> y(2:4) ans = 18 -5 6 mientras que y(i : j : k) da los elementos desde el i–ésimo hasta el k–ésimo, pero separados j unidades.Entonces, >> y(2 : 3 : 10) ans = 18 -7 3 El índice j puede ser también negativo. Por ejemplo: >> y(9 : -3 : 3) ans = 11 2 -5 92 3. M ATRICES Y Á LGEBRA L INEAL Algunas operaciones con vectores se dan en la tabla 3-3. A continuación presentamos algunos ejemplos de dichas operaciones. Tabla 3-3 Operaciones con vectores. a y b son vectores de dimensión n y c es una escalar Operación Resultado a+c [ a1+ c a2 + c ... an + c ] a*c [ a1 * c a2 * c .... an * c ] a+b [ a 1 + b 1 a 2 + b 2 … an + b n ] a.* b [ a 1 * b 1 a2 * b 2 … a n * b n ] a./ b [ a 1 / b1 a 2 / b 2 … a n / bn ] a.\ b [ b 1 / a1 b 2 / a 2 … b n / a n ] a.^ c [ a 1 ^ c a2 ^ c … a n ^ c ] c.^ a [ c ^ a 1 c ^ a 2 … c ^ an ] a.^ b [ a 1 ^ b 1 a 2 ^ b2 … a n ^ b n ] Si los vectores a y b y el escalar c están dados por 2 a = 3 6 4 b= 5 1 entonces podemos realizar las siguientes operaciones: >> a+c ans = 14 15 18 >> a*c ans = 24 36 72 c = 12 3.3 V ECTORES 93 >> a. *b ans = 8 15 -6 >> a.^b ans = 1.0e+002 * 0.16000000000000 2.43000000000000 0.00166666666667 >> a.\b ans = 2.00000000000000 1.66666666666667 -0.16666666666667 >> c.^a ans = 144 1728 2985984 La multiplicación de vectores sólo es posible si se respetan las reglas de multiplicación de matrices. De esta manera, es posible multiplicar dos vectores si el primero es un vector renglón de m columnas y el segundo es un vector columna de m filas, o si se trata de multiplicar un vector columna de n filas por un vector renglón de n columnas. Por ejemplo si tenemos los vectores [ t= a b c ] r = [w x y ] z 1 2 s = 3 4 5 10 u = 20 30 94 3. M ATRICES Y Á LGEBRA L INEAL Podremos realizar solamente las siguientes operaciones >> syms a b c w x y z >> t=[a b c]; >> r=[w x y z]; >> s=[1;2;3;4;5]; >> u=[10;20;30]; >> t*u ans = 10*a+20*b+30*c >> u*t ans = [ 10*a, 10*b, 10*c] [ 20*a, 20*b, 20*c] [ 30*a, 30*b, 30*c] Cualquier otra operación que se quiera realizar marcará un error porque las dimensiones de los vectores no lo permiten. Si tenemos una matriz A de dimensión n x m y un vector b de dimensión m x 1, se puede efectuar la multiplicación A*b. Si A y b son 3 2 0 4 9 17 A = 2 4 9 6 2 5 Entonces A*b es >> A=[3 -2 0;4 9 17;2 -4 9; 6 2 -5]; >> b=[3; 2; -7]; >> A*b ans = 5 -89 -65 57 3 b= 2 7 3.3 V ECTORES 95 La norma de un vector de dimensión n se define por n x p= x i=1 p i 1/ p La norma más conocida es la norma Euclidiana que es la típica magnitud del vector x n x 2 = x i=1 2 i 1/ 2 = x2 + x2 + L + x2 n 2 1 Para calcular en MATLAB la norma de un vector usamos. >>norm ( x, p) El valor predeterminado de p es 2. Así, para x = [ 3 4 -2 ], si queremos obtener la norma 1, >> norm ( x, 1) ans = 9 Para la norma Euclidiana podemos usar norm (x, 2) ó norm (x) >> norm ( x, 2) ans = 5.3852 >> norm ( x) ans = 5.3852 y para la norma >> norm ( x, inf ) ans = 4 En la ayuda se puede encontrar más información si se escribe vectors en la pestaña de Búsqueda (Search). 96 3. M ATRICES Y Á LGEBRA L INEAL 3.4 Productos escalar y vectorial El producto escalar también llamado producto punto de dos vectores a y b dados por a1 a a = 2 M a n b 1 b b = 2 M b n es un escalar y está definido por a b = a1b1 + a 2b 2 + ... + a nbn • y MATLAB lo calcula con >>dot ( a , b ) Para los vectores a y b dados por 2 3 a = 2 1 3 -8 b = 7 4 tenemos >> a = [ 2 ; 3 ; -2 ; 1 ]; >> b = [ 3 ; -8 ; 7 ; 4 ]; >> c = dot ( a , b ) c= -28 El producto punto también se puede calcular si el primer vector columna lo transponemos para que sea vector renglón y luego lo multiplicamos por el segundo vector columna, es decir, hacemos a’*b Para los vectores definidos anteriormente tenemos 3.4 P RODUCTOS ESCALAR Y VECTORIAL 97 >> a’*b ans = -28 El producto cruz a x b de dos vectores de tres dimensiones es otro vector y se obtiene con >>cross (a , b) Para los vectores a1 y b1 dados por 9 a1 = 6 23 27 b1 = 11 12 obtenemos >> a1=[ 9 ; 6 ;23 ]; >> b1=[ -27 ; 11 ; 12 ]; >> cross(a1, b1) ans = -181 -729 261 Mayor información se obtiene en la ayuda, escribiendo dot y cross en la Búsqueda en Search. 3.5 Funciones de matrices y vectores Es posible calcular funciones de matrices y vectores. Por ejemplo, si x = [ 2 3 –7 ], podemos obtener el sin(x) que es otro vector dado por el vector cuyas componentes son las funciones seno de cada componente, así por ejemplo >> y=sin(x) y= 0.90929742682568 0.14112000805987 -0.65698659871879 que es un vector donde cada componente es el seno de cada una de las componentes del vector x. 98 3. M ATRICES Y Á LGEBRA L INEAL Las funciones definidas en MATLAB y aquellas definidas por el usuario se pueden usar con vectores. Esto es para cualquier función f(x), si A es una matriz f(A) nos da f (a 11 ) f (a 12 ) L f (a 1n ) f (a ) f (a 22 ) L f (a 2n ) f ( A ) = 21 M M M M f (a m1 ) f (a m2 ) L f (a mn ) Y si v es un vector, entonces: f ( v ) =[ f ( v1) f (v2) … f (vn) ] donde v puede ser vector renglón o vector columna. Por ejemplo para un polinomio definido por p ( x ) = x^3 + 2 * x^2 – 7 * x + 17 donde x puede ser un escalar, un vector o una matriz. Si D es una matriz dada por 2 5 D= 4 9 entonces >> D=[2 5; -4 9]; >> D^3+2*D^2-7*D+17 ans = -281 -375 507 405 Un tipo especial de vector es el que formamos para evaluar una función en un intervalo dado, por ejemplo evaluar una función f(x) en un intervalo [xi, xf]. Si el espaciamiento deseado entre los puntos es lineal, podemos usar: x = linspace ( a, b, n ) Esta instrucción genera n valores igualmente espaciados entre a y b. Por ejemplo, >> x=linspace(1,10,10) x= 1 2 3 4 5 6 7 8 9 10 3.6 S ISTEMAS DE ECUACIONES SIMULTÁNEAS 99 Para crear un vector similar podemos usar x = a : incremento : b donde a es el valor inicial y los siguientes puntos son a+incremento, a+2*incremento, ... hasta llegar a b que es el valor final. Dependiendo del valor del incremento, el valor final puede ser distinto de b. Por ejemplo >> x=3 : 0.7 : 6 x= 3.0000 3.7000 4.4000 5.1000 5.8000 Para crear un espaciamiento logarítmico usamos x = logspace ( a , b , n ) donde el primer punto es 10 ^ a, el último punto es 10 ^ b y hay n puntos en el intervalo. Para a= 2, b= 5 y n= 4 tenemos >> x=logspace(2,5,4) x= 100 1000 10000 100000 3.6 Sistemas de ecuaciones simultáneas Si se tiene un conjunto de ecuaciones simultáneas a x +b y = c d x+e y = f Éstas se pueden resolver con >> [x, y]= solve(‘a*x+ b*y=c’,’d*x+e*y= f’,’x,y’) x= -(-e*c+f*b)/(a*e-b*d) y= (a*f-c*d)/(a*e-b*d) 100 3. M ATRICES Y Á LGEBRA L INEAL linsolve resuelve el mismo problema si expresamos el conjunto de ecuaciones en forma matricial. Entonces, para el problema anterior a b A = d e c v= f x w = y Se plantea como >> syms a b c d e f x y; >> A=[a b; d e]; >> v=[c; f]; >> x=linsolve(A,v) x= [ -(-e*c+f*b)/(a*e-b*d)] [ (a*f-c*d)/(a*e-b*d)] Los coeficientes de un sistema de ecuaciones simultáneas se expresan en forma matricial y por lo tanto son susceptibles de ser manejados por MATLAB. Por ejemplo, el sistema de ecuaciones 2a 2b = 5 2a + 6b 2c = 0 2b + 6c 2d = 0 2c + 8d = 0 se escribe en forma matricial como Ax=b donde 2 -2 0 0 -2 6 -2 0 A = 0 -2 6 -2 0 0 -2 0 a b x = c d 5 0 b = 0 0 Para resolver este sistema obtenemos la inversa de A y la multiplicamos por b: >> A=[2 -2 0 0;-2 6 -2 0;0 -2 6 -2;0 0 -2 0]; >> b=[5; 0; 0; 0]; >> x=inv(A)*b 3.6 S ISTEMAS DE ECUACIONES SIMULTÁNEAS 101 x= 3.7500 1.2500 0 -1.2500 Otra manera de resolver este sistema es por medio de la instrucción >> x=A\b x= 3.7500 1.2500 0 -1.2500 Que arroja el mismo resultado pero es más rápido de efectuar. En la pestaña de Búsqueda (Search) en la ayuda, podemos escribir Lineas equations para obtener más información de este tópico. 3.6.1 Factorización LU La factorización LU permite escribir una matriz cuadrada no singular A como el producto de una matriz triangular inferior L y una matriz triangular superior U, es decir, podemos escribir A como A=LU La factorización LU se obtiene con el comando lu(A) y la sintaxis es >>[ L , U]= lu (A) Por ejemplo, para la matriz A dada por >> A=[1 2 3 4;5 6 7 8;9 10 11 12;-3 4 -6 9] A= 1 5 9 -3 2 6 10 4 3 7 11 -6 4 8 12 9 102 3. M ATRICES Y Á LGEBRA L INEAL >> [L,U]=lu(A) L= 0.1111 0.5556 1.0000 -0.3333 0 .1212 0.0606 0 1.0000 1.0000 0.5000 0 0 0 1.0000 0 0 10.0000 7.3333 0 0 11.0000 -2.3333 2.0606 0 12.0000 13.0000 1.0909 0.0000 U= 9.0000 0 0 0 Si la matriz A forma parte de un sistema de ecuaciones dado por Ax=b entonces la solución se obtiene con x = U \ (L \ b ) Si b = [2 ; 4 ; 0 ; 0], entonces, para la matriz dada anteriormente >>x = U \ (L \ b ) x= 1.0e+015* -5.6768 7.4934 2.0437 -3.8602 En la pestaña de Búsqueda (Search) de la ayuda podemos escribir LU para más información de este tópico. 3.7 Vectores propios y formas de Jordan Una operación muy usada en matrices es la obtención de los vectores propios o eigenvectores. Estos son vectores que obedecen a la operación Ax= lx 3.7 V ECTORES PROPIOS Y FORMAS DE J ORDAN 103 Es decir, al multiplicar el vector por A, éste sólo cambia de tamaño pero no de dirección. A x e l se les llama eigenvector y eigenvalor (vector propio y valor propio) de la matriz A, respectivamente. Consideremos la matriz A dada por 7 4 A= -3 5 8 9 0 3 -1 19 1 0 4 7 -2 6 Para obtener los eigenvalores usamos la instrucción eig(A) como se muestra a continuación: >> A = [ 7 8 9 0; 4 3 -1 19; -3 1 0 4; 5 7 -2 6]; >> eig ( A ) ans = 19.8054 1.2350 + 6.4298i 1.2350 - 6.4298i -6.2755 Si deseamos obtener los vectores propios usamos [V, E]=eig(A) lo que nos devuelve dos matrices V y E. Las columnas de V son los vectores propios y los elementos de la diagonal principal de E son los valores propios. >> [ V, E ] = eig ( A ) V= 0.4844 0.6999 0.0671 0.5206 -0.7537 0.3759 - 0.0682i 0.1486 - 0.4778i 0.1547 + 0.1084i -0.7537 0.3759 + 0.0682i 0.1486 + 0.4778i 0.1547 - 0.1084i 0.4195 -0.8374 0.1255 0.3271 19.8054 0 0 0 0 1.2350 + 6.4298i 0 0 0 0 1.2350 - 6.4298i 0 0 0 0 -6.2755 E= 104 3. M ATRICES Y Á LGEBRA L INEAL Para diagonalizar una matriz usamos la expresión jordan (A) que nos devuelve la forma canónica de Jordan A = M-1JM donde la matriz J es una matriz diagonal formada por los valores propios y M es la matriz formada por los vectores propios. >> jordan ( A ) ans = -6.2755 0 0 0 0 1.2350 - 6.4298i 0 0 0 0 1.2350 + 6.4298i 0 0 0 0 19.8054 En la Búsqueda (Search) de la ayuda, escribiendo Jordan obtenemos más información de este tópico. 3.8 Estructuras Las estructuras son arreglos que pueden almacenar distintos tipos de datos en una misma variable. Para introducir el uso de estructuras consideremos una estructura que contiene información de estudiantes. Esta información es el nombre del estudiante, su número de matrícula, el semestre que cursa, los resultados de sus exámenes y de sus tareas y su año tentativo de graduación. Hacemos esto con Estudiante.Nombre = ‘Giuzel Luevano’; Estudiante.ID = 113596; Estudiante.Semestre = ‘Otoño 2002’; Estudiante.Tareas = [ 10 9.8 8 ]; Estudiante.Examenes = [ 9.9 8.9 ]; Estudiante.Graduacion = 2006; De esta manera estamos definiendo 6 campos, cada uno correspondiente a un dato distinto. Estos campos están agrupados bajo la variable Estudiante. Si en MATLAB escribimos Estudiante, obtendremos los datos de esa variable. Estudiante 3.8 E STRUCTURAS 105 Si queremos ver un campo específico sólo escribimos Estudiante y el campo separado por un punto. Por ejemplo Estudiante.Semestre Estudiante.Tareas Para cambiar algún valor del campo escribimos el mero valor. Supongamos que queremos cambiar el valor de las tareas a 10 9.9 9.8, entonces sólo escribimos Estudiante.Tareas = [ 10 9.9 9.8 ]; Para añadir el resultado de un tercer examen, sólo concatenamos el nuevo valor como Estudiante.Examenes = [ Estudiante.Examenes, 9.7 ]; Para añadir un segundo estudiante sólo escribimos Estudiante(2).Nombre = ‘Julio Solano’ La variable Estudiante tiene ahora dos elementos. El primer elemento es Estudiante(1), mientras que el segundo elemento sólo tiene definido el nombre Estudiante (2). Podemos añadir más datos al nuevo elemento con Estudiante(2).ID = 112999; Estudiante(2).Semestre = ‘Otoño 2002‘; Estudiante(2).Tareas = [10 10 7.8]; Estudiante(2).Examenes = [10 9.6]; Estudiante(2).Graduacion = 2006; De la misma manera podemos añadir más elementos al arreglo Estudiante. Cada campo se puede modificar sustituyendo o concatenando nuevos datos. Figura 3.3 Búsqueda de ayuda para Estructuras. 106 3. M ATRICES Y Á LGEBRA L INEAL Para obtener ayuda sobre estructuras, en la Búsqueda (Search) de la ayuda escribimos Structures y seleccionamos Data Types como se muestra en la figura 3.3. 3.9 Arreglos de celdas Al igual que las estructuras, los arreglos de celdas nos permiten almacenar información de diferentes tipos en cada celda. Para los datos de la sección anterior estos datos se darían como Estudiante1{ 1,1 } = ‘Giuzel Luevano’; Estudiante1{ 1,2 } = 113596; Estudiante1{ 1,3 } = ‘Otoño 2002’; Estudiante1{ 1,4 } = [ 10 9.8 8 ]; Estudiante1{ 1,5 } = [ 9.9 8.9 ]; Estudiante1{ 1,6 } = 2006; Este método de dar datos se conoce como direccionamiento por contenido. Para ver gráficamente estos datos escribimos cellplot ( Estudiante1 ) Con lo que obtenemos la figura 3.4. Para añadir el segundo estudiante Estudiante2(1,1) = {‘Julio Solano’}; Estudiante2(1,2) = {112999}; Estudiante2(1,3) = {‘Otoño 2002’}; Estudiante2(1,4) = { [10 10 7.8]}; Estudiante2(1,5) = {[10 9.6]}; Estudiante2(1,6) = { 2006}; Figura 3.4 Arreglo de celdas. 3.9 A RREGLOS DE CELDAS 107 La forma de dar datos en este segundo estudiante se conoce como indexado de celdas. En este caso los datos están encerrados en llaves. A diferencia del direccionamiento por contenido, donde las llaves están del lado izquierdo, en el indexado de celdas las llaves están del lado derecho. Se puede crear una celda que contenga todas las células. Esto se logra concatenando las celdas como datos = { Estudiante1; Estudiante2 } datos = {1x6 cell} {1x6 cell} De esta manera hemos creado una celda conteniendo a los datos de los estudiantes. Para ver los datos de un estudiante sólo seleccionamos el elemento correspondiente de datos. Por ejemplo, para ver los datos del primer estudiante datos{1} ans = ‘Giuzel Luevano’ [113596] ‘Otoño 2002’ [1x3 double] [1x2 double] [2006] Mientras que para ver un dato de un estudiante se obtiene con datos{1}{1,1} ans = Giuzel Luevano Información adicional sobre arreglos de celdas se puede obtener usando la Búsqueda (Search) de la ayuda y escribiendo Cell Arrays y seleccionando en la sección de Data Types como se muestra en la figura 3.5. Figura 3.5 Búsqueda de información para arreglos de celdas. Cálculo MATLAB permite realizar las operaciones de cálculo matemático más comunes, tales como la evaluación de límites, derivadas, integrales, resolución de ecuaciones diferenciales, series, entre otras. En este capítulo expondremos estas y otras operaciones que se pueden realizar tanto en forma numérica como en forma simbólica. 4.1 Límites La evaluación de límites es de primordial interés en cálculo. MATLAB nos proporciona el comando limit para este fin. La sintaxis para calcular el límite de una función f(x) cuando x tiende a x0 es limit (f, x , x0) que indica: lim f(x) x x0 Por ejemplo para f(x) = x2, el límite cuando x tiende a 3 se obtiene con >>syms x >>limit ( x^2 , x , 3) ans = 9 El límite de g(x) = x + 1 cuando x tiende a se calcula con 2 >>syms x >>limit ( sqrt ( x^2+1) , x , inf ) ans = inf Para calcular un límite lateral usamos limit (f, x, a, ‘left’) para el límite de f(x) cuando x tiende al valor a por la izquierda. Usamos limit (f, x, a, ‘right’) para calcular el límite por la derecha. De cálculo sabemos que una función f(x) es continua en un punto a si los límites laterales son iguales. Como ejemplo, consideremos f(x) = tan x en x = /2. Evaluando los límites laterales sabremos si esta función es continua en x = /2. Entonces, calculamos los dos límites como 111 112 4. C ÁLCULO >>syms x >>limit ( tan( x ), x , pi/2 , ‘left’) ans = inf >>limit ( tan ( x ), x , pi/2 , ‘right’) ans = -inf Como los límites laterales no son iguales, concluimos que la función tan x es discontinua en x = /2. Los límites se pueden anidar, es decir, se puede calcular el límite de un límite. Por ejemplo, en la función f(x,y)=3x2 +7xy, para evaluar lim [lim f( x , y ) = 3 x2 +7 x y ] x3 y2 usamos >>syms x y >>limit ( limit ( ( 3*x^2+7*x*y ) , y , 2 ) , x , 3 ) ans = 69 Mayor información sobre límites se obtiene en la ayuda en la pestaña de Búsqueda (Search) escribiendo Limits o Limit. 4.2 Límites de sucesiones También es posible calcular límites de sucesiones. Consideremos la sucesión an = n 1+ n n 2 Para calcular lim a n = lim n n n 1+ n n 2 4.3 C ONTINUIDAD 113 escribimos >>syms n >>limit ( ( ( 1+n) / n^2 )^( 1/n ) , inf ) ans = 1 4.3 Continuidad Se dice que una función f(x) es continua en el punto x=a si se cumple que lim f(x) = f(a) x a Si esto no se cumple se dice que la función es discontinua. Si el límite existe pero es distinto de f(a) entonces se dice que f(x) tiene una discontinuidad evitable en x=a. Consideremos las funciones f(x) y g(x) dadas por f( x ) = sen x x , g(x) = sen 1 x El límite de f(x) cuando x tiende a un punto a se obtiene con >>syms x a >>limit ( sin ( x ) / x , x , a) ans = sin(a)/a Pero cuando deseamos obtener el límite cuando x tienda a 0 obtenemos >>limit ( sin(x)/x , x , 0 ) ans = 1 Vemos que f(x) es discontinua en x=0, pero que la discontinuidad es evitable definiendo f(0)=1. 114 4. C ÁLCULO Para g(x) tenemos cuando x=a >>limit ( sin(1/x), x , a ) ans = sin(1/a) Pero en x=0 >>limit ( sin(1/x) , x , 0 ) ans = -1 .. 1 Esto indica que el límite está en el intervalo [-1,1]. Si calculamos ahora los límites laterales obtenemos limit ( sin ( 1/x ), x , 0, ‘left’ ) ans = -1 .. 1 >>limit ( sin ( 1/x ), x , 0 , ‘right’ ) ans = -1 .. 1 Esto comprueba que la función no es continua en x = 0. Consideremos ahora la función f(x,y) dada por f( x, y ) = xy 2 x +y 2 donde queremos encontrar el límite cuando tendemos al origen. En el caso de funciones de varias variables, si el límite en el punto (x0,y0) tiene el mismo valor independientemente de la forma como se llegue a dicho punto, entonces el límite existe. En nuestra función, entonces podemos tender al punto de dos maneras distintas (entre muchas otras) como 4.3 C ONTINUIDAD 115 >>syms x y >>limit ( limit ( x*y / ( x^ 2 + y^2 ) , x , 0 ) , y , 0) ans = 0 >> limit ( limit ( x*y / ( x^2 + y^2 ) , y , 0 ) , x , 0 ) ans = 0 Como los dos límites son iguales, entonces el límite al acercarnos al origen existe y es igual a cero. Una herramienta muy útil es calcular el límite desde cualquier dirección. Si queremos tender al punto (0,0) por medio de líneas rectas podemos usar la ecuación de la familia de rectas que pasan por el origen dada por y = mx donde m es la pendiente. Entonces la función f (x, y) se convierte en f( x, y ) = mx 2 2 x + mx con lo que el límite se calcula con sólo hacer tender x a 0. >>syms x m >> limit( ( m*x^2 )/(x^2 + m*x ), x , 0 ) ans = 0 Pero si deseamos otra forma de tender al punto (0, 0) podemos usar cualquier otra familia de curvas, por ejemplo, la familia de parábolas y2 = mx con lo que f(x,y) se convierte en 1/ 2 f( x, y ) = m x 2 3/2 x + mx 116 4. C ÁLCULO y el límite es >>limit (m^(1/2)*x^(3/2) )/(x^2+m*x), x , 0 ) ans = 0 4.4 Derivadas Como indicamos en el capítulo 2, MATLAB realiza tanto cálculos numéricos como simbólicos. Por ejemplo, en capítulos anteriores efectuamos de manera numérica multiplicaciones y evaluación de determinantes, entre otras muchas operaciones realizadas con MATLAB. Sin embargo, en ocasiones no estamos interesados en el resultado numérico, sino en un resultado donde no evaluamos numéricamente las variables. Por ejemplo, si deseamos evaluar la derivada de f(x)=2x2, sabemos que el resultado es f’ (x) = 4x Para realizar esto en MATLAB es necesario definir la x como una variable simbólica. Para definir x como una variable simbólica escribimos x=sym (‘x’) o también podemos escribir syms x con lo que MATLAB considera desde ahora x como una variable simbólica y no la evalúa numéricamente. Ahora ya podemos definir nuestra función f(x)=2x2 como >>syms x >>f = 2*x^2; Para derivar f(x) usamos el operador diff (f): >>syms x >>f = 2*x^2; >> diff ( f ) ans = 4*x 4.4 D ERIVADAS 117 Para calcular la segunda derivada de f(x): >>diff (f , 2 ) ans = 4 En el caso de la función g(x,y) = 2x3y deseamos derivar primero con respecto a x y luego con respecto a y. Para esto tenemos que definir las variables x, y como simbólicas >>syms x y >>g = 2*x^3*y; >>g1 = diff ( g , x ) g1 = 6*x^2*y>g2 = diff (g1 , y ) 2 = 6*x^2 En general, en caso de existir dos variables simbólicas, la derivada se realiza con respecto a las últimas letras del alfabeto como w, x, y, z, a menos que se indique lo contrario. De esta manera para la función h (x) = 2ax se tendrá >>syms a x >>h = 2*a*x; >>diff ( h ) ans = 2*a donde vemos que la derivada se realizó con respecto a x. Como otro ejemplo, si f(x) = xn, y deseamos derivar f con respecto a x >>syms x n >>f = x^n; >>diff ( f ) ans = x^n*n / x 118 4. C ÁLCULO ya que se deriva con respecto a x. Si deseamos derivar con respecto a n, explícitamente tenemos que indicarlo así, como en >>diff ( f , n ) ans = x^n*log ( x ) En caso de duda, es mejor indicar explícitamente con respecto a qué variable deseamos efectuar la derivada. Por ejemplo, en sen (x y) >>syms x y >>f = sin ( x*y); >>f1 = diff ( f , x ) f1 = cos ( x*y )*y >>f2 = diff ( f , y ) f2 = cos ( x*y )*x >>f3 = diff ( f ) f3 = cos ( x*y )*y Aquí vemos que las variables simbólicas están ordenadas alfabéticamente y así se toman para las derivadas. Nótese que si la función a derivar es función de dos o más variables, entonces la derivada que se realiza con diff es la derivada parcial con respecto a la variable indicada. Así, en la función f(x,y) diff( f, x ) = f x y diff( f, y ) = f y Si deseamos derivar la función Bessel de primera clase Bj(, z), predefinida en MATLAB y representada por besselj (nu, z) 4.5 I NTEGRACIÓN 119 >>syms nu z >>b = besselj ( nu , z ); >>db=diff (b) db = -besselj(nu + 1,z)+ nu/z*besselj(nu , z) Para información adicional del comando diff se puede consultar la ayuda. En la pestaña de Búsqueda (Search) escribimos diff para obtener dicha información. 4.5 Integración La operación de integración indefinida está definida para una función f(x) por F = int( f ) f( x )dx donde la nueva función F satisface diff(F)=f F se conoce también como la antiderivada de f y MATLAB la encontrará siempre que exista. Para una función de dos variables f(x, y) debemos explícitamente indicar con respecto a qué variable vamos a integrar, es decir int ( f, y ) indica que la variable de integración es y. Para las integrales definidas b b f( x )dx , f( v)dv a a se usa int (f, a , b ), int ( f , v , a , b ) Por ejemplo, para evaluar sen( x )dx 120 4. C ÁLCULO usamos >>syms x >>int ( sin ( x ) ) ans = -cos(x) y para evaluar 1 2x dx 0 tenemos que >>syms x >>f = 2*x; >>int ( f , 0 , 1 ) ans = 1 MATLAB nos permite evaluar integrales impropias, si es que éstas convergen. Por ejemplo, la integral impropia 0 x e sen x dx x se puede calcular con >>syms x >>f = ( exp (-x )*sin ( x ) ) / x; >>int ( f , 0 , inf ) ans = 1/4*pi lo que nos indica que la integral converge. Mientras que para la integral tan x dx 0 4.6 S ERIES 121 tenemos que considerar que /2 es punto singular, por lo que es necesario tomar el límite de la integral a lim a tan x dx 0 lo que se puede calcular con >>syms x b >>f = tan ( x ); >>limit ( int ( f , x , 0 , pi/2-b ) , b , 0 ) ans = inf con lo que vemos que la integral no converge. Entonces tenemos que considerar que es punto singular, por lo que se tomará el límite de la integral. El comando int sólo integra funciones simbólicas y por lo tanto es necesario tener instalado el paquete de matemáticas simbólicas (Symbolic Math Toolbox). Más información de int se puede obtener en la pestaña de Búsqueda (Search) de la ayuda escribiendo int de la sección de Symbolic Math Toolbox como se muestra en la figura 4.1. Figura 4.1 Ayuda de int para integrar funciones simbólicas. 122 4. C ÁLCULO 4.6 Series MATLAB permite evaluar series de la forma b f(n) n=a con el comando symsum. El formato es symsum ( f, n , a , b ) donde f es la función, n es la variable, a es el límite inferior y b es el límite superior, respectivamente. Por ejemplo, para evaluar la serie de potencias x n n=0 se puede evaluar con >>syms x n >>f = x^n; >>sumatoria = symsum ( f , n , 0 , inf ) sumatoria = -1/(x-1) Para la serie n=0 n 1 1+ n tenemos que >>syms n >>f = ( 1 + 1/n )^( -n^2 ); >>serie = symsum ( f , n , 1, inf ) serie = sum ( ( 1+1/n)^(-n^2), n = 1 .. inf) 2 4.7 S OLUCIÓN DE E CUACIONES D IFERENCIALES 123 La información adicional de symsum se obtiene en la ayuda, escribiendo symsum en la pestaña de Búsqueda (Search). 4.7 Solución de ecuaciones diferenciales MATLAB también nos permite resolver ecuaciones diferenciales. Para ilustrar el procedimiento consideremos una ecuación diferencial de primer orden dy( t ) = f( y( t ), t ) dt Cuando se describe una ecuación diferencial en MATLAB, la primera derivada se representa como Dy. Si apareciera la segunda derivada se representa como D2y. Para la n-ésima derivada, n d y( t ) dt n Dny( t ) Entonces, para la siguiente ecuación diferencial 2 d y( t ) dt 2 2 = 1+ y ( t ) D2y( t ) = 1+ y( t )^2 Las ecuaciones diferenciales se resuelven con el comando dsolve. Para la ecuación diferencial 2 d y( t ) dt 2 + y( t ) = 4 se puede resolver en MATLAB con >> dsolve( ‘D2y+y = 4 ’) ans = 4+C1*sin ( t )+C2*cos ( t ) donde en la solución C1 y C2 son constantes. Si se tienen las condiciones iniciales, y(0)= 1, y’(0)=0 se indican dentro de dsolve después de la ecuación diferencial como 124 4. C ÁLCULO >> dsolve ( ‘D2y+y = 4’,’y (0) = 1’,’Dy(0 )= 0’ ) ans = 4-3*cos ( t) donde ahora las constantes toman un valor dependiente de las condiciones iniciales. Nótese que MATLAB tomó como variable independiente a t. Si deseamos que x sea la variable independiente entonces >> dsolve( ‘D2y+y=4’ , ‘y(0)=1’ , ‘Dy(0)=0’ , ‘x’ ) ans = 4-3*cos(x) Para la ecuación diferencial 2 d y( t ) dt 2 +a dy( t ) + by( t ) = c dt el comando dsolve nos da la solución como >> y = dsolve (‘ D2y+a*Dy+ b*y = c’ ) y= 1/b*c+C1*exp(-1/2*(a+(a^2-4*b)^(1/2))*t)+C2*exp(-1/2*(a-(a^24*b)^(1/2))*t) Esto se puede reescribir en forma más fácil de leer con el comando pretty: >> pretty( y ) 2 1/2 2 1/2 c/b + C1 exp(- 1/2 (a + (a- 4 b) ) t) + C2 exp(- 1/2 (a - (a- 4 b) ) t) Para el sistema de ecuaciones dx( t ) = 3x( t ) + 4 y( t ) dt dy( t ) = 7x( t ) + 6 y( t ) dt 4.7 S OLUCIÓN DE E CUACIONES D IFERENCIALES 125 también usamos el comando dsolve como >> [x, y] = dsolve (‘D x= 3*x+4*y’,’Dy = -7*x+6*y’,’x (0) = 2',’y(0) = 1') x= -1/103*exp(9/2*t)*(-206*cos(1/2*t*103^(1/2))-2*103^(1/2)*sin(1/ 2*t*103^(1/2))) y= -1/103*exp(9/2*t)*(25*103^(1/2)*sin(1/2*t*103^(1/2))-103*cos(1/ 2*t*103^(1/2))) Usando pretty obtenemos >> pretty(x) 1/2 1/2 1/2 1/103 exp(9/2 t) (206 cos(1/2 t 103 ) + 2 103 sin(1/2 t 103 )) >> pretty(y) 1/2 1/2 1/2 1/103 exp(9/2 t) (-25 103 sin(1/2 t 103 ) + 103 cos(1/2 t 103 )) Otro método para resolver ecuaciones diferenciales es por separación de variables. Por ejemplo, la ecuación 2 ysen x dx (1+ y ) dy = 0 se puede reescribir como 2 sen x dx = (1+ y ) dy y y la solución se obtiene integrando ambos miembros de la ecuación por separado, y resolviendo la igualdad resultante. De esta manera, para el miembro de la derecha tenemos que >> int ( sin( x ) ) ans = -cos(x) mientras que para el miembro de la izquierda, 126 4. C ÁLCULO >> int (( 1+y^2 ) / y ) ans = 1/2*y^2+log(y) igualando las dos soluciones, se encuentra la solución de la ecuación diferencial usando el comando solve como, >> solve (‘-cos(x)=1/2*y^2+log(y)’) ans = acos(-1/2*y^2-log(y)) >> pretty ( ans ) 2 acos(- 1/2 y - log(y)) Consideremos la ecuación diferencial homogénea de orden n n1 n 2 a n y ( t ) + a n1y ( t ) + L + a 2 y ( t ) + a 1y'( t ) + a 0 y( t ) = 0 donde los coeficientes ai son constantes. El polinomio característico de esta ecuación diferencial es n a n x + a n1x n1 2 + L + a 2 x + a 1x + a 0 su ecuación característica es n a n x + a n1x n1 2 + L + a 2 x + a 1x + a 0 = 0 Si las raíces de esta ecuación característica son r1,r2...,rn, entonces, la solución de la ecuación diferencial está dada por r t r t r t r t y( t ) = C1e 1 + C2 e 2 + L + Cn1e n1 + Cne n donde C1, C2,..., Cn son constantes. Por ejemplo, para la ecuación diferencial 3y‘‘(t)+2y‘(t)-5 y(t)=0 La ecuación característica es 2 3x + 2x 5 = 0 4.7 S OLUCIÓN DE E CUACIONES D IFERENCIALES 127 y las raíces del polinomio característico se encuentran con >> r = solve ( ‘3*x^2+2*x-5’ ) r= [ -5/3] [ 1] finalmente, la solución se encuentra con >> y = dsolve ( ‘3*D2y+2*Dy-5*y = 0’ ) y= C1*exp(t)+C2*exp(-5/3*t) MATLAB proporciona, aparte del comando dsolve, otros comandos para resolver ecuaciones diferenciales. Dos de ellos son OD23 y ODE45. ODE23 usa métodos de Runge-Kutta de segundo y tercer orden. Con ODE23 la solución se calcula usando primero un método de segundo orden y luego un método de tercer orden. La diferencia de los dos métodos es una estimación del error para el método de segundo orden. Si el error no está dentro de cierto rango, ODE23 ajusta el paso de integración y recalcula la solución. ODE45 funciona de manera similar a ODE23 excepto que se usan métodos de cuarto y quinto orden. La sintaxis de estas funciones es [t,y] = ODE23 ( F, [ t_inicial, t_final ], Yo) [t,y] = ODE45 ( F, [ t_inicial, t_final ], Yo) donde F es una cadena de texto, que indica dónde está definida la ecuación diferencial, t_inicial y t_final son los tiempos inicial y final para la simulación y Yo es la condición inicial. Como ejemplo consideremos la ecuación diferencial dy = 2 y t dx la cual se describe en el archivo dy.m que se escribe a continuación y el cual se guarda en el directorio work. Ver la sección 2.6 para una descripción de cómo crear este archivo. function yderivada = dy (t,y) %Este es el archivo dy.m yderivada =-2*y*t 128 4. C ÁLCULO Al resolver la ecuación diferencial con ode23 tenemos entonces que >> y0 = 2; >> [ t , y ] = ode45 ( ‘dy’, [0,2] , y0 ); >> plot ( t , y ) >> grid El resultado se grafica en la figura 4.2. La solución exacta es y(t) = 2*exp (-t2). Si graficamos en la misma figura 4.2 la solución exacta vamos a ver que es idéntica. Esto lo podemos hacer denotando la solución exacta por y1 y añadiendo lo siguiente >>hold on >>y1 = 2*exp ( -t^2 ) Para obtener más información de dsolve, ode23 y ode45 se puede seleccionar la pestaña de Búsqueda (Search) en la ayuda y escribir la instrucción correspondiente. La figura 4.3 muestra la información para dsolve. Figura 4.2 Gráfica de la solución de la ecuación diferencial. Figura 4.3 Información para dsolve. Gráficas En este capítulo examinamos el potencial de MATLAB para graficar funciones y datos. Las características y opciones de graficado son muy variadas en MATLAB. Va desde generar gráficas en dos y tres dimensiones hasta la posibilidad de cambiar las propiedades de ellas. Además veremos cómo MATLAB identifica las gráficas y cómo realizar cambios en éstas. 5.1 Gráficas en dos dimensiones La instrucción básica para graficar es plot (X, Y) donde X es un vector de puntos y Y es un vector de datos y es de la misma dimensión del vector X. Con el uso de plot se abre una nueva ventana con la gráfica. El vector de puntos X se puede generar con la instrucción. x = linspace ( x1, x2, n) que indica que se genera un vector de n puntos igualmente espaciados. El valor del primer punto es x1 y el valor del último punto es x2. El incremento en cada punto es (x2-x1)/(n-1). Por ejemplo, >>x = linspace ( 0, 5, 6 ) x= 0 1 2 3 4 5 Del resultado que MATLAB entrega vemos que el primer punto es 0, el último punto es 5 y existe un total de seis puntos. Estos valores de x están almacenados en un vector renglón de 6 dimensiones. Como otro ejemplo, >>x = linspace (10, 15, 11) x= Columns 1 through 4 10.0000 10.5000 11.0000 11.5000 Columns 5 through 8 12.0000 12.5000 13.0000 13.5000 Columns 9 through 11 14.0000 14.5000 15.0000 131 132 5. G RÁFICAS Ahora obtenemos un vector renglón de dimensión 11 cuyo valor inicial es 10 y con valor final de 15. El incremento es (15-10)/(11-1)= 0.5. Si deseamos graficar sen(x) de 0 a 2 con una partición de 200 puntos, usamos entonces >>x = linspace (0, 2*pi, 200); >>y = sin (x); >>plot ( x, y) con lo que obtenemos la figura 5.1. Figura 5.1 Gráfica de sen(x) usando plot. Ahora consideremos la gráfica de y = |x | sen ( x) Si definimos y como y = abs(x)*sin (x), ya que estamos tratando con vectores, usamos y= abs(x). * sin(x) donde .* indica multiplicación de vectores término a término. Entonces >>x = linspace (-50,50,400); >>y = abs (x). *sin(x); >>plot (x,y) nos da la gráfica de la figura 5.2. 5.1 G RÁFICAS EN DOS DIMENSIONES Figura 5.2 133 Gráfica de |x|sen(x). Grafiquemos ahora la función sen x de 0 a 2. Si graficamos luego y = cos x, obtenemos una nueva figura con la función cos x. Si deseamos obtener las dos curvas en la misma figura usamos el comando hold on, como se muestra a continuación: >>x = linspace ( 0, 2*pi, 100); >>y = sin(x); >>plot ( x, y); >>hold on >>plot ( x, cos (x)) con lo que se obtienen las dos funciones en la misma figura (ver figura 5.3). Para cancelar el hold on se usa hold off (cualquier otra curva que grafiquemos se añadirá sobre la misma figura hasta cancelar el hold on). Podemos también graficar dos funciones en la misma figura definiendo pares x, y. Por ejemplo para obtener sen 2x y cos 3x en la misma gráfica: >>x = linspace (0, 2*pi,100); >>y1 = sin (2*x); >>y2= cos (3*x); >>plot (x, y1, x, y2) nos da la gráfica de la figura 5.4. Nótese que cada función se grafica con distinto color. 134 5. G RÁFICAS Figura 5.3 Dos Curvas en la misma gráfica usando hold on. Figura 5.4 Dos Curvas en la misma figura usando pares x, y. Para darle información a la gráfica usamos las instrucciones xlabel, ylabel, title y legend. Así, para nuestra última gráfica añadimos >>xlabel (‘x’); >>ylabel (‘y’); >>title (‘Funciones seno y coseno’); >>legend (‘sen (x)’, ‘cos(x)’) 5.1 G RÁFICAS EN DOS DIMENSIONES 135 con lo que se obtiene la gráfica que se muestra en la figura 5.5. Figura 5.5 Adición de información para identificar las trazas de la gráfica. Para realizar una gráfica semilogarítmica usamos primero una partición semilogarítmica con x = logspace(x1, x2, n) lo que hace que se divida el intervalo de forma logarítmica. Los puntos de la partición se generan de acuerdo a la regla siguiente. El primer punto es 10^x1, el último punto es 10^x2, y el total de puntos es n. El equivalente de plot es semilogx(x,y) De esta manera, con las instrucciones >>x= logspace(-2,0.8,100); >>y= sin (x); >>semilogx (x,y) se genera la figura 5.6. Nótese que el eje horizontal es logarítmico mientras que el eje vertical se mantiene lineal. 136 5. G RÁFICAS Figura 5.6 Gráfica logarítmica de sen(x). Otra manera de graficar varias funciones en la misma gráfica, se logra definiendo las funciones en un vector de funciones. Para graficar sen x, cos x, sen x cos x, |x|sen (x), procedemos de la siguiente manera. >>x = linspace (0,2*pi,100)’; % se toma la transpuesta para que sea >>%vector columna >>y = [sin(x),cos(x),sin(x).*cos(x),abs(x).*sin(x)]; >>plot(x,y) >>xlabel(‘x-radianes ‘) >>ylabel(‘Cuatro funciones’) >>title(‘Gráfica múltiple’) >>legend(‘sen x’,’cos x’,’sen x *cosx’, ‘|x|sen x’) >>grid on con lo que obtiene la gráfica de la figura 5.7. Nótese que hemos incluido la instrucción grid on que le añadió una rejilla a la gráfica. El número de puntos al generar el vector x nos define qué tan suave es la gráfica, por ejemplo si en las gráficas anteriores cambiamos x a x = linspace (0,2*pi,10)’; Ahora el vector x sólo tiene 10 puntos y entonces obtenemos las gráficas de la figura 5.8 que se observan no tan suaves como las de la figura 5.7. 5.2 O PCIONES DE GRÁFICAS 137 Figura 5.7 Gráfica múltiple con legend, title y label. Figura 5.8 Gráfica con pocos puntos en el eje x. 5.2 Opciones de gráficas Existen varias opciones para dar más información en una gráfica. La forma general de la instrucción plot es: plot (X1,Y1,S1,X2,Y2,S2,...) Donde Xi,Yi contiene la información de las curvas a graficar y Si son cadenas de texto que especifican color, marcadores, tamaño de marcadores, ancho del trazo y estilos del trazo. Cada cadena puede tener de uno a cuatro caracteres. La tabla 5-1 muestra las distintas opciones para el color de las curvas, el estilo y los marcadores. 138 5. G RÁFICAS Las opciones se pueden cambiar con el editor de propiedades. Para usar este editor simplemente seleccionamos el botón para editar la gráfica (Edit Plot) en la barra de herramientas y luego colocamos el cursor sobre la curva, presionamos con el botón derecho del mouse y seleccionamos el parámetro a cambiar, como se muestra en la figura 5.9. En este menú podemos cambiar el ancho de la línea (line width), el marcador (marker), el color, el tamaño del marcador y el estilo de línea (line style) Tabla 5-1 Códigos de color, estilo de línea y marcador color color marcador y m c r g b w k amarillo magenta azul obscuro rojo verde azul claro blanco negro . o x + * s d v ^ < > p h estilo de línea lines style : -. -- Línea sólida Puntos Línea y punto Línea discontinua Figura 5.9 marker punto círculo X más asterisco cuadro diamante Triángulo (hacia abajo) Triángulo (hacia arriba) Triángulo (izquierdo) Triángulo (derecho) Pentagrama Hexagrama Forma de editar las propiedades de las curvas graficadas. 5.2 O PCIONES DE GRÁFICAS 139 Cuando hay que dibujar varias líneas, por predeterminación se van escogiendo sucesivamente los colores de la tabla comenzando por el azul, hacia arriba, y cuando se terminan se vuelve a empezar otra vez por el azul. Si el fondo es blanco, este color no se utiliza para las líneas. El color del fondo de una gráfica puede cambiarse con el comando whitebg Y se regresa al color anterior repitiendo el mismo comando. Para colocar texto sobre una gráfica usamos el comando text con el siguiente formato text ( x, y, ‘cadena’) donde x, y son las coordenadas donde empezará a escribirse el texto. Por ejemplo >>x=linspace(0,10,100); >>y= sin(x); >> y2= cos(x); >> plot( x, y, x, y2) >> text( 2, 0.5, ‘texto de prueba’) nos da la figura 5.10 Figura 5.10 Texto sobre una gráfica. 140 5. G RÁFICAS Por lo general MATLAB asigna los valores mínimos y máximos de las coordenadas x, y de la gráfica. Sin embargo, el usuario también los puede definir con el comando axis que tiene la sintaxis axis ([x_inicial x_final y_inicial y_final]) Por ejemplo axis ( [ 0 10 -2 2] ) especifica que la variable x sólo se grafica de 0 a 10 mientras que la variable y sólo se grafica de -2 a 2. Alternativamente podemos usar el menú de EditAxes Properties… con lo que se abre debajo de la figura una ventana donde podemos especificar los límites deseados para los ejes, además podemos dar la opción de etiquetar los ejes (y label y x label). Usando este último menú o indicándolo como el comando axis obtenemos la figura 5.11. Figura 5.11 Gráfica con texto y límites de los ejes modificados. 5.3 G RÁFICAS POLARES 141 5.3 Gráficas polares Se puede graficar una función expresada en coordenadas polares por medio del comando polar que tiene la sintaxis polar ( ,r,s) donde y r son las coordenadas polares y s es una cadena que especifica las mismas opciones del comando plot y es opcional. Por ejemplo, si deseamos graficar la función de la espiral r=2 usamos >>teta = linspace (0,8*pi,200); >>r=2*teta; >>polar (teta,r) para obtener la figura 5.12 Figura 5.12 Gráfica polar de la espiral. La función r= sen 2 cos 2 se puede graficar con 142 5. G RÁFICAS >>teta=linspace (0,2*pi); >>ro=sin(2*teta).*cos(2*teta); >>polar(teta,ro,’g’) >>title (‘Gráfica polar de sin (2 teta) cos(2teta)’) y se obtiene la figura 5.13. Figura 5.13 Gráfica polar. 5.4 Otros tipos de gráficas 5.4.1 Gráfica de barras Este tipo de gráficas se obtiene con el comando bar (x,y,s) donde y es un vector de valores en las coordenadas x y s son las opciones de la gráfica. Por ejemplo, para graficar 21 puntos de –10 a 10, usamos >>x=linspace(-10,10,21); >>y=exp(-x.*x); >>bar(x,y); >>title(‘Gráfica de barras de una curva de campana’) 5.4 O TROS TIPOS DE GRÁFICAS 143 y se obtiene la figura 5.14 Figura 5.14 Gráfica de barras. 5.4.2 Gráfica de escalera La misma función se puede graficar en forma de escalera con stairs (x,y,’s’) Si en la gráfica anterior cambiamos bar por stairs y en title cambiamos barras por escalera, obtenemos la figura 5.15. Figura 5.15 Gráfica de la escalera. 144 5. G RÁFICAS 5.4.3 Gráfica de histograma La gráfica del histograma es similar a la gráfica de barras, pero sólo proporciona 10 barras entre el máximo y un mínimo del vector y. El comando es hist (y,n) donde y es la variable que deseamos graficar y n es el número de barras de la gráfica. Para volver un histograma la gráfica de barras cambiamos hist por bar y en title cambiamos histograma por barras y obtenemos la figura 5.16 >>x=linspace(-5,5,50); >>y=randn(5000,1); >>hist(y,x); >>title(‘Gráfica de histograma de una curva de campana’) Figura 5.16 5.4.4 Gráfica de histograma. Gráfica de puntos (stem) Esta es una gráfica de puntos. El comando es stem (x,y, ‘s’) Por ejemplo para una secuencia aleatoria de puntos 5.4 O TROS TIPOS DE GRÁFICAS 145 >>y= randn (50,1); >>stem (y,’:’); >>title (‘Gráfica de puntos’) genera la figura 5.17. Figura 5.17 Gráfica de puntos usando stem. 5.4.5 Gráfica de brújula (Compass) Esta gráfica muestra la magnitud y ángulo de números complejos. El comando es compass (z)=compass (x+jy) =compass (x,y) donde z=x+jy Por ejemplo, para el vector z dado por z = [3+2j, -4+7j, 6-9j, -4-5j] obtenemos la figura 5.18 con compass (z) 146 5. G RÁFICAS Figura 5.18 Gráfica de Brújula. 5.4.6 Gráfica de pie La gráfica de pie es una gráfica para desplegar el porcentaje que cada elemento en un vector o matriz contribuye a la suma de todos los elementos. pie y pie3 crean gráficas de 2 y 3 dimensiones, respectivamente. Para el vector A dado por A=[3 4 5 9 3] la gráfica de pie se obtiene con pie(A) y el resultado se muestra en la figura 5.19. Figura 5.19 Gráfica de pie. 5.5 S UBGRÁFICAS (SUBPLOTS) 147 5.5 Subgráficas (SUBPLOTS) Es posible dividir una gráfica en varias gráficas más pequeñas llamadas subgráficas. Cada subgráfica se genera independientemente de las demás. La instrucción es subplot y su sintaxis es subplot (m,n,p) Este comando divide la figura en m x n subgráficas arregladas en forma de matriz de m renglones y n columnas. La variable p hace que se active cada subgráfica. Para 4 subgráficas en arreglo 2 x 2 usamos subplot (2, 2, p) donde p indica qué posición en el arreglo ocupa esta subgráfica. En este caso p puede tomar uno de los valores 1,2,3 o 4. La posición en el arreglo es 1 2 3 4 Por ejemplo, >>subplot(2,2,1) >>x=linspace(0,2*pi,100); >>y=sin(x); >>plot(x,y); >>title(‘Función seno’) >>subplot(2,2,2) >>r=5*log10(x); >>polar(x,r); >>title(‘Espiral’) activa las subgráficas en el primer renglón en las dos columnas, como se aprecia en la figura 5.20a. Por ejemplo >>subplot (2,2,3) >>plot(x,tan(x)) produce la primera gráfica del segundo renglón (la posición 3) en la figura 5.20b. Nótese que no hay subgráfica (2,2,4). 148 5. G RÁFICAS Figura 5.20a Gráfica múltiple con dos subgráficas. Figura 5.20b Gráfica múltiple con tres gráficas. 5.6 Gráficas en 3 dimensiones Las gráficas de 3 dimensiones en ocasiones aparte de ser más vistosas, aportan más información al usuario. Existen varios tipos de gráficas de 3 dimensiones, algunas de las cuales mencionaremos en esta sección. Las dimensiones se definen como x, y, z. El comando para graficar una función z=f(x, y) en tres dimensiones depende del tipo de gráfica que se desea obtener. 5.6 G RÁFICAS EN 3 DIMENSIONES 149 5.6.1 El comando plot3 La sintaxis para este comando es plot3(x,y,z,s) donde x, y, z son las coordenadas de la función y s son las opciones para la gráfica. Por ejemplo, la gráfica de la espiral dada por x=sen t y=cos t z=t se puede obtener con >>t=linspace (0,10*pi,500); >>plot3(sin (t),cos(t),t); >>title (‘Espiral tridimensional’) >>text (0,0,0, ‘Origen’) >>grid y nos da la gráfica de la figura 5.21. Figura 5.21 Gráfica con plot3. 150 5. G RÁFICAS Supongamos ahora que deseamos graficar tres funciones distintas: sin x, cos x, y sen2 x, en tres planos diferentes. Esto se puede hacer si cada una de ellas es una variable distinta que empieza en un valor distinto de la variable y, es decir, en un plano distinto. El código para hacer esto es: >>x=linspace (0,3*pi,100); >>Z1=sin (x); >>Z2=cos (x); >>Z3=sin(2*x); >>Y1=zeros (size (x)); >>Y2=ones (size (x)); >>Y3= Y2/2; >>plot3(x,Y1,Z1,x,Y2,Z2,x,Y3,Z3); >>grid >>title(‘sen x, cos x, sen 2x) con lo que se obtiene la gráfica de la figura 5.22 Figura 5.22 Gráfica de 3 curvas en 3 dimensiones. 5.6 G RÁFICAS EN 3 DIMENSIONES 151 5.6.2 Gráficas de malla (mesh) Las funciones que se pueden graficar son de la forma z= f(x,y) y el comando es mesh (x,y,z) donde se debe primero haber definido una rejilla (meshgrid) que genera las matrices x,y. Esto se logra con [x,y] = meshgrid (xi, yi: inc: xf, yf) donde (xi, yi) y (xf, yf) son los valores iniciales y finales de x, y, y la variable inc es el incremento de x, y. Por ejemplo, >>[X,Y]= meshgrid (-10:0.5: 10); >>R=sqrt(X.^2 + Y.^2) + eps; >>Z=sin(R)./R; >>mesh (X,Y,Z) nos da la gráfica de la figura 5.23 y como se observa en la pantalla del monitor es en color. Figura 5.23 Gráfica de malla (mesh). 152 5. G RÁFICAS Esta gráfica se puede hacer transparente añadiendo: hidden off, como se muestra en la figura 5.24. Figura 5.24 Gráfica de malla transparente. mesh(x,y,z) también acepta opciones para la gráfica. Por ejemplo, para obtener una figura en color negro podemos cambiar mesh (X,Y,Z) por mesh (X,Y,Z, ‘Edgecolor’,’black’) Dos formas similares a mesh son meshc y meshz. meshc añade un mapa de contorno y meshz añade un plano cero. Si cambiamos mesh por meshc y luego por meshz obtenemos las gráficas de las figuras 5.25 y 5.26. Figura 5.25 Gráfica de malla con contorno sobre el plano x, y. 5.6 G RÁFICAS EN 3 DIMENSIONES 153 Figura 5.26 Gráfica de malla con contorno y plano cero. 5.6.3 Gráfica de superficie (surf) La gráfica de superficie surf es similar a la de malla, excepto que los rectángulos de la superficie están coloreados. Los colores de los rectángulos están determinados por los valores de Z y por el mapa de colores. Por ejemplo la figura sphere está definida en MATLAB. Si deseamos obtener una gráfica superficial de ella, la podemos graficar con >>[x,y,z]=sphere(12); >>surf(x,y,z) >>title(‘Gráfica de la esfera’) >>grid,xlabel(‘Eje x’),ylabel(‘Eje y’),zlabel(‘Eje z’) para obtener la gráfica de la figura 5.27. Figura 5.27 Gráfica de superficie con surf. 154 5. G RÁFICAS En esta gráfica se pueden quitar las líneas negras añadiendo el comando shading flat con lo que se obtiene la figura 5.28. Si en lugar de shading flat añadimos shading interp obtenemos una gráfica en la que los colores se suavizan, como se muestra en la figura 5.29. El comando surfl produce una gráfica con una iluminación aplicada. Cambiando por esta instrucción surfl (x, y, z) obtenemos la figura 5.30 Figura 5.28 Gráfica de superficie con sombreado. Figura 5.29 Gráfica de superficie con sombreado suavizado. 5.6 G RÁFICAS EN 3 DIMENSIONES Figura 5.30 155 Gráfica de superficie con iluminación. 5.6.4 Gráfica de contorno (Contour) Contour nos da una gráfica en dos dimensiones de los contornos de la gráfica. Por ejemplo si usamos ahora la función peaks, predefinida en MATLAB. Por ejemplo, >>[x,y,z]= peaks (30); >>contour3(x,y,z,16) % con 16 líneas de colores >>xlabel (‘Eje x’), ylabel (‘Eje y’) >>title (‘Contorno de peaks’) produce la figura 5.31. Figura 5.31 Gráfica de contorno. 156 5. G RÁFICAS Una gráfica similar pero en pseudocolor se obtiene con pcolor y se muestra en la figura 5.32. Figura 5.32 Gráfica de pseudocolor. Otra gráfica similar es waterfall, que se obtiene para la función peaks con >>[x,y,z]= peaks (30); >>waterfall (x,y,z) que nos da la gráfica de la figura 5.33. Figura 5.33 Gráfica de Cascada. 5.6 G RÁFICAS EN 3 DIMENSIONES 157 La función quiver le da líneas direccionales a una gráfica de contorno con >>[X,Y,Z,]= peaks (30); >>[DX,DY] = gradient (Z,0.5,0.5); >>contour (X,Y,Z,20) >>hold on >>quiver (X,Y, DX, DY) >>hold off para obtener la figura 5.34. clabel añade valores a la altura de una gráfica contour. La figura 5.35 se obtiene con lo siguiente: >>[x,y,z]= peaks (30); >>cs=contour (x,y,z,10); % para valores numéricos de contour >>clabel (cs) >>xlabel(‘Eje x’), ylabel(‘Eje y’) >>title (‘Contorno de peaks con valores ‘) Figura 5.34 Gráfica con líneas direccionales. Figura 5.35 Gráfica con valores de altura. 158 5. G RÁFICAS 5.7 Punto de observación Si observamos cualquiera de las gráficas en tres dimensiones que se han realizado en las secciones anteriores, nos damos cuenta que están siendo vistas por nosotros desde una posición determinada. Esta posición en coordenadas esféricas está dada por la distancia r, y los ángulos de acimut y elevación como se muestra en la figura 5.36. Figura 5.36 Punto de observación de una gráfica tridimensional. La elevación es el ángulo que hace la línea del radio vector que va del observador al origen de la gráfica con el plano x y. El origen de la figura está dado por (xmin, ymin, zmin). El acimut es el ángulo que hace la proyección del radio vector con el eje y. Los valores nominales de acimut y elevación son de -37.5 º y 30 º, respectivamente. Por ejemplo, en la gráfica de mesh de la figura 5.26 podemos cambiar la posición del observador cambiando el punto de observación usando el comando view e indicando los ángulos de acimut y elevación. Por ejemplo, si deseamos ver desde un acimut de 60° y una elevación 30° usamos >>view ( [ 30 60 ] ) para obtener la figura 5.37, donde observamos la misma superficie pero desde otro punto de observación. Alternativamente podemos usar el botón de rotación para rotar con el apuntador la gráfica. Este botón se muestra en la figura 5.38 y una vez presionado podemos ver la gráfica desde distintos puntos de vista con sólo arrastrar el apuntador con el ratón. Una gráfica de dos dimensiones tiene valores nominales de acimut y elevación de 0º y 90º, respectivamente. 5.8 E STRUCTURA DE LOS GRÁFICOS DE MATLAB 159 Figura 5.37 Gráfica de malla con el punto de observación cambiado. Figura 5.38 Botón para cambiar el punto de observación. 5.8 Estructura de los gráficos de MATLAB Si examinamos las gráficas obtenidas en este capítulo, vemos que cada una de ellas está numerada como figure 1. Esto es así porque cada vez que MATLAB grafica alguna curva nueva lo hace sobre la última gráfica que se creó, y si no hay ninguna abierta, crea una nueva como figura 1. Para abrir varias ventanas de figuras podemos usar el comando figure que sirve para crear y seleccionar ventanas de figuras. Los formatos son cualquiera de los siguientes: h = figure figure (h) Si se usa como h = figure, se crea una nueva ventana de figura y h es el identificador (handle) de esta figura. Cada vez que se usa figure, se crea una nueva ventana y se le asigna un valor al identificador de esa figura. Por otro lado, figure (h) hace que la 160 5. G RÁFICAS ventana de la figura h sea la figura activa y la pone enfrente de todas las ventanas que estén en la pantalla. Si la figura h no existe, figure (h) crea una nueva figura con identificador h. (h debe ser un entero para ser identificador de figura). Por ejemplo >> f1 = figure f1 = 1 crea una ventana para la figura 1, con identificador h=1. >> f2 = figure f2 = 2 crea otra ventana para la figura 2, con identificador h=2. Nótese que conforme vamos creando ventanas los identificadores se van incrementando. Podemos arbitrariamente dar cualquier valor al identificador. Por ejemplo, podemos crear la figura 5 con >> f3 = figure (5) f3 = 5 Ahora tenemos tres ventanas abiertas para las figuras 1, 2 y 5. Nuestro siguiente paso es poner gráficas en ellas. Si ejecutamos las siguientes instrucciones, >> x = linspace (0, pi, 25); >> y = sin(x); >> plot(x,y) vemos que la gráfica aparece en la ventana de la figura 5 ya que es la ventana activa. Si escribimos >>figure(f1) la ventana de la figura 1 será la ventana activa. Si ahora ejecutamos: >> y2 = cos (2*x); >> plot (x, y2); obtenemos que en la ventana de la figura 1 se grafica la función y2=cos (2x). 5.8 E STRUCTURA DE LOS GRÁFICOS DE MATLAB 161 El comando shg hace que la ventana de la figura activa se despliegue encima de las demás ventanas. El comando clf borra la ventana activa. El comando close (h) cierra la ventana con el identificador h. Si se usa simplemente como close cierra la ventana activa y si se desea cerrar todas las ventanas se usa close all. 5.8.1 Identificadores de otros objetos En una ventana existen distintos objetos, cada uno de los cuales tiene asignado un identificador. Por ejemplo en la gráfica de y2=cos(2x), los ejes y las curvas graficadas tienen identificadores. Para ver cómo se asignan los identificadores repitamos el último comando plot como >>Ident_y = plot (x, y2) Para obtener Ident_y = 101.0042 El valor del identificador es 101.0042, pero el valor del identificador puede variar en otras computadoras. Sin embargo, el valor del identificador no es tan interesante, sólo debemos saber el nombre de la variable en donde está almacenado. Nótese que este identificador no es entero como los identificadores de figuras. Ahora ejecutamos el siguiente código >> x = linspace (pi/2, 2*pi, 100); >> y1 = sin(x); >> y2 = cos(x); >> y3 = sin(x) + cos (2*x); >> ident123 = plot(x, y1, x, y2, x, y3) ident123 = 127.0010 101.0048 128.0006 que son los identificadores para las tres curvas graficadas. Para los textos escritos sobre una gráfica también se tiene un identificador de texto con 162 5. G RÁFICAS >>iden_texto_y = ylabel (‘Eje y’) iden_texto_y = 129.0006 >>iden_textox = xlabel( ‘Eje x’) iden_textox = 130.0006 5.8.2 Identificador de ejes (gca) Para obtener el identificador de ejes usamos gca. Por ejemplo >>id_ejes = gca id_ejes = 100.0011 5.8.3 Propiedades de un objeto Para ver las propiedades de un objeto, del cual conocemos su identificador usamos el comando set como set (identificador) Por ejemplo para el texto que escribimos en la última gráfica >> set (iden_ texto_y) Para cambiar las propiedades de un objeto usamos el formato set (identificador, propiedad, valor) Por ejemplo para cambiar la fuente del texto usamos. >> set (iden_texto_y, “fontname”, arial ); >> set (iden_texto_y, “fontsize”, 21) 5.9 J ERARQUÍA DE LOS OBJETOS DE MATLAB 163 5.9 Jerarquía de los objetos de MATLAB Los gráficos de MATLAB tienen una estructura jerárquica formada por objetos de distintos tipos. Esta jerarquía tiene forma de árbol, con el aspecto mostrado en la figura 5.39. Pantalla (Screen) Líneas (Line) Rectángulos (Rectangle) Superficies (Surface) Figura 5.39 Ventana 1 (Figure) Ventana 2 (Figure) Ejes 1 (Axes) Ejes 2 (Axes) Controles (Uicontrol) Menús (Uimenu) Texto (Text) Imagen (Image) Polígono (Patch) Luz (Light) Menús contx. (Uicontextmenu) Jerarquía de los objetos de MATLAB. Según se muestra en la figura 5.39, el objeto más general es la pantalla (screen). Este objeto es la raíz de todos los demás y sólo puede haber un objeto pantalla. Una pantalla puede contener una o más ventanas (figures). A su vez cada ventana puede tener uno o más ejes de coordenadas (axes) en los que representar otros objetos de más bajo nivel. Una ventana puede tener también controles (uicontrol) tales como botones, barras de desplazamiento, botones de selección o de opción, etc. y menús (uimenu). Finalmente, los ejes pueden contener los seis tipos de elementos gráficos que permite MATLAB: líneas (line), rectángulos (rectangle), polígonos (patches), superficies (surface), imágenes bitmap (image) y texto (text). La jerarquía de objetos mostrada en la figura 5.39 indica que en MATLAB hay objetos padres e hijos. Por ejemplo, todos los objetos ventana son hijos de pantalla, y cada ventana es padre de los objetos ejes, controles o menús que están por debajo. A su vez los elementos gráficos (líneas, polígonos, etc.) son hijos de un objeto ejes, y no tienen otros objetos que sean sus hijos. Cuando se borra un objeto de MATLAB automáticamente se borran todos los objetos que son sus descendientes. Por ejemplo, al borrar unos ejes, se borran todas las líneas y polígonos que son hijos suyos. Los identificadores de la ventana activa, de los ejes activos y del objeto activo se pueden obtener respectivamente con los comandos gcf (get current figure), gca (get current axes) y gco (get current object): Los objetos se pueden borrar con el comando delete (handle). Programación con MATLAB MATLAB proporciona un lenguaje de programación muy poderoso con un ambiente computacional interactivo. Una ventaja muy importante que tiene programar en MATLAB cuando lo comparamos con otros lenguajes de programación, es que MATLAB no requiere que se declaren las variables y sus tipos al principio del programa ya que éstas se definen automáticamente cuando las usamos por primera vez. A los archivos que contienen código de MATLAB se les llama archivos–M (M-files) y tienen la extensión .m. Existen dos tipos de archivos–M, que son Scripts y Funciones. Los Scripts no aceptan datos de entrada o producen argumentos de salida. Usan datos de variables que se han usando previamente en la sesión con MATLAB. Las funciones pueden aceptar datos o argumentos de entrada y regresan también datos de salida. Las variables internas de una función son variables locales. Para ver el contenido de un archivo–M se usa el comando type, por ejemplo, para ver el archivo libro.m usamos type libro Figura 6.1 Menú para crear un archivo–M. 167 168 6. P ROGRAMACIÓN CON MATLAB Figura 6.2 Directorio para guardar un archivo-M. a) b) Figura 6.3 Menú para indicar la trayectoria donde se guardó un archivo–M. a) Selección de Set Path, b) Con Add Folder indicar dónde deseamos guardar los archivos-M. 6.1 I NSTRUCCIONES BÁSICAS DE PROGRAMACIÓN EN MATLAB 169 Los archivos–M más importantes y usados son las funciones. La estructura de una función puede incluir: 1. 2. 3. 4. 5. Comentarios, los cuales empiezan con el símbolo % Instrucción para leer los datos de entrada Instrucciones a ejecutar Instrucciones para escribir los datos de salida. Instrucción end para terminar la función. Para editar un archivo–M podemos usar un editor de textos como Word. Lo único que debemos hacer al terminar es guardar nuestro archivo como archivo de texto con la extensión .m. También podemos usar el editor de archivos–M “M-File Editor/ Debugger”, el cual podemos abrir en el menú File seleccionando M-File como se muestra en la figura 6.1. Una vez que escribimos nuestro programa, lo guardamos en el directorio Capítulo 6 dentro del directorio de MATLAB como se muestra en la figura 6.2. Si el archivo–M se guarda en otro directorio tenemos que indicarle a MATLAB dónde se encuentra con Set Path en el menú de File como se muestra en la figura 6.3a y en las ventanas de diálogo siguientes indicamos en qué directorio buscar los archivos-M, lo que se muestra en la figura 6.3b. 6.1 Instrucciones básicas de programación en MATLAB En esta sección presentamos las instrucciones básicas que se requieren dentro de un programa de MATLAB. El uso de estas instrucciones nos permitirá realizar programas simples pero ilustrativos del potencial de MATLAB. 6.1.1 La instrucción if-end Una característica vital en todo lenguaje de programación es la habilidad de poder cambiar la secuencia en que se ejecutan las instrucciones, dependiendo de que se satisfagan algunas condiciones que pueden depender de valores de las variables generados durante el programa. En MATLAB la declaración if-end se usa para este propósito. Tiene la forma general >> if condición declaraciones >> end 170 6. P ROGRAMACIÓN CON MATLAB La condición del if también puede contener operadores lógicos. Los operadores lógicos disponibles en MATLAB se muestran en la tabla 6-2. Si la condición se cumple entonces se ejecutan las declaraciones siguientes hasta el end. Si la condición no se cumple, el programa ejecuta la primera instrucción después de end. La condición es de la forma e1 R e2 donde e1 y e2 son expresiones aritméticas y R es alguno de los operadores de relación de la tabla 6-1. Un pequeño ejemplo nos ilustrará cómo usar la instrucción if. Tabla 6-1 Operadores de relación Operación de relación R Definición > >= < <= == ~= Mayor que Mayor que o Igual a Menor que Menor que o igual a Igual a No igual a, distinto de Tabla 6-2 Operadores lógicos de MATLAB Operador Descripción Ejemplo Descripción & AND lógico (a>b) & (x<5) Si se cumplen las dos condiciones el resultado es 1, y si sólo se cumple una, el resultado es 0. | OR lógico (a>b) | (x<5) Si se cumple cualquiera de las dos condiciones simultáneamente el resultado es 1, y si no se cumple ninguna, el resultado es 0. ~ NOT ~(a>b) XOR OR Exclusivo xor(a>b,x<5) EJEMPLO 6.1 Si se cumple la condición el resultado es 0 y si no se cumple el resultado es 1. Si se cumplen o no las dos condiciones simultáneamente el resultado es 0, y si sólo se cumple una, el resultado es 1. Uso de la instrucción if-end Una calificación debe ser mayor que 7.5 para aprobar. El programa lee el dato e indica si el individuo está aprobado o reprobado. Este archivo lo creamos con el editor de MATLAB y lo guardamos en el directorio C:\Capitulo 6, con el nombre Archivo seis_1.m, como se muestra en la figura 6.4a y b. 6.1 I NSTRUCCIONES BÁSICAS DE PROGRAMACIÓN EN MATLAB 171 % Archivo seis_1.m % Lee un dato de entrada y escribe % como dato de % salida si aprueba o reprueba. % Pide la calificación calif= input (‘Dame la calificación: \n’); if calif >=7.5 fprintf (‘Felicidades, estás aprobado.’) end if calif<7.5 fprintf(‘Lo siento. Estás reprobado.’) end a) Figura 6.4 a) Archivo Seis_1.m editado en el editor de MATLAB, b) Guardado del archivo en el directorio C:\Capitulo 6. b) 172 6. P ROGRAMACIÓN CON MATLAB Si ahora corremos el programa con una calificación de 8 y otra de 5, >>seis_1 Dame la calificación: 8 Felicidades, estás aprobado. >>seis_1 Dame la calificación: 5 Lo siento. Estás reprobado. 6.1.2 La instrucción if-else-end Una segunda forma del if-end es la inclusión de la cláusula else. Esta nueva cláusula permite al programador el uso de un solo if en muchos casos para ejecutar dos conjuntos de declaraciones. La forma del if-else-end es if condición declaración a1 declaración a2 : : declaración an else declaración b1 declaración b2 : : declaración bm end Si la condición se cumple, se ejecutan las declaraciones a1 a la an. Después de la declaración an, el programa continúa con la instrucción que sigue al end. Si la condición no se cumple, se ejecutan las declaraciones b1a bm. Cuando se termina la declaración bm, el programa continúa con la instrucción que sigue al end. Claramente se ve que el if-else-end sustituye a dos if-end. En cualquier caso, la persona que programa tiene la libertad de usar lo que crea más conveniente. 6.1 I NSTRUCCIONES BÁSICAS DE PROGRAMACIÓN EN MATLAB EjEMPLO 6.2 173 Uso de la instrucción if-else-end El ejemplo 6.1 se puede reescribir usando un if-else-end como se muestra a continuación, % Archivo seis_2.m % Lee un dato de entrada y escribe % como dato de % salida si aprueba o reprueba. % Pide la calificación calif= input (‘Dame la calificación: \n’); if calif >=7.5 fprintf (‘Felicidades, estás aprobado.’) else fprintf (‘Lo siento, estás reprobado.’) end El comportamiento del programa es idéntico al del ejemplo 6.1. 6.1.3 La instrucción elseif La tercera forma de la declaración if usa la palabra clave elseif. Con el elseif se puede checar un mayor número de condiciones. La sintaxis es if condición 1 declaraciones A1 elseif condición 2 declaraciones A2 elseif condición 3 declaraciones A3 : : elseif condición n declaraciones An end En este if-elseif-end, se checa qué condición se cumple primero, ejecuta las declaraciones después de la condición y continúa con la instrucción que sigue al end. 174 6. P ROGRAMACIÓN CON MATLAB EJEMPLO 6.3 Uso de la instrucción elseif Modificamos el ejemplo 6.1, para el caso de que el usuario da una letra en lugar de un número, entonces el programa no ejecuta ninguna acción. Con el if-elseif-end, se puede corregir esto de la siguiente manera % Archivo seis_3.m % Lee un dato de entrada y escribe % como dato de % salida si aprueba o reprueba. % Pide la calificación calif= input (‘Dame la calificación: \n’); if calif>=7.5 fprintf (‘Felicidades, estás aprobado’) elseif calif <7.5 fprintf (‘Lo siento, estás reprobado’) end 6.1.4 La instrucción switch–case La instrucción switch-case se usa cuando queremos checar si una expresión es igual a algún valor determinado. No se puede usar para checar una condición como a 5 o b 3. Sin embargo, encuentra aplicaciones en muchas situaciones donde se requiere ejecutar declaraciones distintas dependiendo del valor de una expresión. La sintaxis es switch expresión case valor 1 declaración a1 declaración a2 : declaración an case valor 2 declaración b1 declaración b2 : declaración bm 6.1 I NSTRUCCIONES BÁSICAS DE PROGRAMACIÓN EN MATLAB 175 case valor 3 declaración c1 declaración c2 : declaración cl otherwise declaración d1 : declaración dm end Cada valor puede ser numérico o una cadena de texto. Además, cada case puede tener uno o más valores, como en case {valor1, valor2,..., valork} declaración 1 : declaración m En este caso si la expresión es igual a cualquiera de los valores valor1, valor2, ...valork se ejecutan las declaraciones 1 a la m. EJEMPLO 6.4 Uso de la instrucción switch-case Como ejemplo, podemos modificar el archivo del ejemplo 6.1 % Archivo seis_4.m % Lee un dato de entrada y escribe % como dato de % salida si aprueba o reprueba. % Pide la calificación calif= input (‘Dame la calificación: \n’); switch calif case{7.5, 8, 8.5, 9, 9.5, 10} fprintf (‘Felicidades, estás aprobado.’) case{0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5} fprintf (‘Lo siento, estás reprobado.’) otherwise fprintf (‘No fue suficiente y estás reprobado.’) end 176 6. P ROGRAMACIÓN CON MATLAB 6.1.5 La instrucción for La instrucción for se usa para formar ciclos o lazos de instrucciones que se tienen que repetir un número determinado de veces. La sintaxis es for variable=expresión declaración 1 declaración 2 declaración n end En esta instrucción, si se cumple que variable=expresión entonces se ejecutan las declaraciones 1 a la n para continuar después con la declaración que está después del end. Si no se cumple, ya no se ejecutan las declaraciones 1 a la n y la siguiente declaración que se ejecuta es la que está después del end. Es posible que las declaraciones 1 a la n no se ejecuten ni una sola vez. EJEMPLO 6.5 Uso de la instrucción for Deseamos efectuar la suma de los 10 primeros enteros. % Archivo seis_5.m suma=0; for i= 1:10 suma=suma+i; end fprintf (‘La suma es % g.’ , suma) Si ahora deseamos sumar sólo los enteros pares entre 1 y 10 % Archivo seis_5a.m suma=0; for i= 0:2:10 suma=suma+i; end fprintf (‘La suma es % g.’ , suma) Nótese que 1:10 quiere decir que la variable i varía de 1 a 10 incrementándose en 1 en cada iteración. También podemos escribir esto como 1 : 1 : 10. Para la suma de los pares se usó 0 : 2 :10 lo cual indica que se incrementa la variable i de 2 en 2 empezando con 0 lo que nos da los enteros menores o iguales a 10. El incremento puede ser negativo, por ejemplo, en 4 : - 1 : 0 empieza en 4 y ahora es un decremento de 1, lo que nos da 3, 2, 1 y termina con 0. Finalmente, el incremento o decremento puede ser fraccionario, como en 4:0.25 : 5 nos daría 4, 4.25, 4.50, 4.75 y 5. 6.1 I NSTRUCCIONES BÁSICAS DE PROGRAMACIÓN EN MATLAB EJEMPLO 6.6 177 Cálculo del factorial de un entero El factorial de n donde n es un entero se define por n!= 1× 2 × 3 × L × n Esta operación se puede ejecutar con un for como se muestra a continuación, % Archivo seis_6.m % Cálculo del factorial de n donde n % es un entero no negativo n=input (‘Dame un entero no negativo \n’); factorial_n=1; for i=1:n factorial_n=factorial_n *i; end fprintf(‘El factorial de % g es % g.’, n, factorial_n) Los for se pueden anidar, es decir, dentro de un ciclo de for puede haber uno o más ciclos de for. EJEMPLO 6.7 Uso de for anidado Deseamos sumar todos los elementos aij de una matriz n x m. Esto se puede hacer realizando la suma n suma = m a ij i=1 j=1 que se puede efectuar con % Archivo seis_7.m % Este archivo calcula la suma % de los elementos de una matriz n x m. n= input (‘Dame el número de renglones \n’); m= input (‘Dame el número de columnas \n’); % Lee los elementos % Inicializa la suma suma=0; 178 6. P ROGRAMACIÓN CON MATLAB % Lee los elementos y los suma for i=1:n % Lee los elementos del renglón i y los suma for j=1:m fprintf(‘Dame el elemento %g,%g’, i, j); a(i,j)=input(‘ de la matriz \n’); suma=suma+a(i, j); end end fprintf(‘La suma total es %g’, suma) 6.1.6 La instrucción while La instrucción while sirve para repetir un conjunto de declaraciones e instrucciones un número indeterminado de veces. La diferencia con el for es que éste se ejecuta un número de veces determinado. La sintaxis de while es: while condición declaración 1 declaración 2 : : declaración n end La manera como un while funciona es la siguiente. Si la condición no se cumple, entonces se ejecuta la primera instrucción después del end. Si la condición se cumple, se ejecutan todas las declaraciones de la 1 hasta la n. En este punto se checa si la condición se cumple todavía, y de ser así se vuelven a ejecutar las declaraciones de la 1 hasta la n y se vuelve a checar la condición. Este proceso se repite hasta que la condición no se cumple, en cuyo caso se salta a ejecutar la primera declaración después del end. EJEMPLO 6.8 Uso de la instrucción while Para calcular el volumen de las esferas de radio 1 hasta 5, usamos % Archivo seis_8.m % Este programa calcula el radio de las esferas de radio 1 hasta 5 % r es el radio de la esfera r=0; while r<5 6.2 F UNCIONES 179 r=r+1; vol=(4/3)* pi*r^3; fprintf (‘El radio es % g y el volumen es %g. \n’, r, vol) end Al correr el archivo seis_8 obtenemos, >> seis_8 El radio es 1 y el volumen es 4.18879. El radio es 2 y el volumen es 33.5103. El radio es 3 y el volumen es 113.097. El radio es 4 y el volumen es 268.083. El radio es 5 y el volumen es 523.599. 6.2 Funciones Una función en MATLAB es un subprograma que se puede emplear para escribir un programa muy grande en varios subprogramas más pequeños o para realizar una tarea repetitiva escribiendo solamente un programa. La forma de una función es function y =operación(x) declaraciones de la función y=operación donde x es el argumento o parámetro de entrada, y es el parámetro de salida, y operacion es el nombre de la función. Para calcular el factorial podemos escribir el archivo del ejemplo 6.9 con opciones para checar si el número es entero o negativo. . EJEMPLO 6.9 Cálculo del factorial usando function En este ejemplo calculamos el factorial de un número. La función para calcular factorial es la siguiente: function x= factorial (n) % Esta función calcula el factorial de n. % Este es el archivo factorial.m factorial=1; if n== 0 factorial = 1; else 180 6. P ROGRAMACIÓN CON MATLAB for i= 1:n factorial = factorial *i; end end x = factorial Si ejecutamos esta función obtenemos, >> factorial(3) ans = 6 >> factorial(4) ans = 24 >> factorial(5) ans = 120 Esta función factorial(n) ahora puede ser parte de otro programa o puede ser usada repetitivamente sin necesidad de reescribir el código cada vez que la usemos. Esta función todavía tiene algunas opciones que se le pueden añadir. Por ejemplo, factorial(n) no tiene forma de checar qué pasa cuando n no es entero ni cuando n es negativo. Podemos usar factorial(n) en otro programa que haga esto. EJEMPLO 6.10 Uso de una función dentro de un programa Deseamos ahora escribir un programa que calcule el factorial de n con opciones para checar si n es un entero y si éste es o no negativo. % Archivo seis_10.m % Cálculo del factorial de un entero % n con mensajes de error en el caso de que n no sea entero o sea negativo. n= input (‘Dame un entero n \n’); error =0; if floor (n) ~=n % checa si es entero % floor (n) calcula la parte entera de n. Si x =3.4, floor (x)=3. error =1; % n no es entero end if n<0 % checa si n es negativo error = 2; % n es negativo end 6.2 F UNCIONES 181 if error ==1 fprintf (‘El número que me diste no es entero. \n’) elseif error ==2 fprintf (‘El número que me diste es negativo. \n’) elseif error~=1&error~=2 x = factorial (n); fprintf(‘El factorial de %g es %g. \n’, n, x ) end Si corremos este programa encontraremos lo siguiente: >> seis_10 Dame un entero n -6 El número que me diste es negativo. >> seis_10 Dame un entero n 4 El factorial de 4 es 24. >> seis_10 Dame un entero n 1.4 El número que me diste no es entero. EJEMPLO 6.11 Solución de una ecuación de segundo grado Las soluciones de la ecuación cuadrática ax 2 + bx + c = 0 Están dadas por x 1,2 = b ± b 2 4ac 2a Una función que calcula estas soluciones es la función cuadrática (a,b,c) guardada en el archivo cuadratica.m. function [x1, x2]=cuadratica (a,b,c) % Esta función calcula las raíces x1 y x2 % de una ecuación cuadrática ax^2+bx+c=0 % Las dos soluciones son x1 y x2 182 6. P ROGRAMACIÓN CON MATLAB % El archivo es cuadratica.m discriminante =(b^2-4*a*c ); x1= (-b+ sqrt (discriminante))/(2*a); x2= (-b-sqrt (discriminante))/(2*a); al correr esta función obtenemos, para la ecuación x2+2x+3=0 >> [x1,x2]=cuadratica(1, 2, 3) x1 = -1.0000 + 1.4142i x2 = -1.0000 - 1.4142i y para la ecuación 4x2+ 8x-60=0 >> [x1,x2]=cuadratica(4, 8, -60) x1 = 3 x2 = -5 6.3 Variables de funciones Las variables del programa principal y de una función son independientes aunque tengan el mismo nombre. En general pueden tener distintos valores, a menos de que sean declaradas como argumentos de la función. Para ver esto, consideremos la función prueba del siguiente ejemplo: EJEMPLO 6.12 Declaración de variables en funciones En este ejemplo checamos cómo se pasan las variables entre subrutinas. Las funciones no tienen declaradas todas las variables como argumentos de entrada o salida. function y=prueba (x) % Función de prueba para ver variables. fprintf (‘Acabo de entrar a prueba. \n’) a=1; b=10; c=100; y=3; 6.3 V ARIABLES DE FUNCIONES 183 fprintf (‘Estoy dentro de la función. \n’) fprintf (‘Las variables son \n a= %g \n b= %g \n c= %g \n’ , a , b ,c ) fprintf (‘Saliendo de la función. \n’) Si esta función está dentro del programa principal % Archivo seis_12.m a = 4; b = 2; c = 0.47; fprintf (‘Las variables antes de prueba son \n a= %g \n b= %g \n c= %g \n’ , a , b ,c ) y=prueba(1); fprintf (‘Estoy de regreso en el programa principal \n’); fprintf (‘Las variables son \n a= %g \n b= %g \n c= %g \n’ , a , b ,c ) Al correr el programa principal vemos que los valores de a, b y c declarados antes de la función prueba no se pasan a la función y al regresar al programa principal, tampoco se pasan de la función al programa principal ya que no se declararon. >> seis_12 Las variables antes de prueba son a= 4 b= 2 c= 0.47 Acabo de entrar a prueba. Estoy dentro de la función. Las variables son a= 1 b= 10 c= 100 Saliendo de la función. Estoy de regreso en el programa principal. Las variables son a= 4 b= 2 c= 0.47 Observamos que los valores no se modificaron al entrar a la función prueba. Una manera de pasar valores de variables del programa principal a una función se obtiene si se declaran en el argumento. Esto lo mostramos modificando el ejemplo anterior. 184 6. P ROGRAMACIÓN CON MATLAB EJEMPLO 6.13 Paso de variables declarándolas como argumentos de la función Consideremos la siguiente función: function y=prueba6_13 (a,b,c) a=a*2; b=b*10; c=c*100; y=4; fprintf (‘Estoy dentro de la función. \n’) fprintf (‘Las variables son \n a= %g \n b= %g \n c= %g \n’ , a , b , c ) fprintf (‘Saliendo de la función. \n’) la cual usamos dentro del programa principal seis_13. % Archivo seis_13.m a = 4; b = 2; c = 0.47; fprintf (‘Las variables antes de prueba6_13 son \n a= %g \n b= %g \n c= %g \n’ , a , b ,c ) p=prueba6_13(a,b,c); fprintf (‘Estoy de regreso en el programa principal. \n’); fprintf (‘Las variables son \n a= %g \n b= %g \n c= %g \n’ , a , b ,c ) Al correr el programa seis_13.m, obtenemos lo siguiente >> seis_13 Las variables antes de prueba6_13 son a= 4 b= 2 c= 0.47 Estoy dentro de la función. Las variables son a= 8 b= 20 c= 47 Saliendo de la función. Estoy de regreso en el programa principal. Las variables son a= 4 b= 2 c= 0.47 6.3 V ARIABLES DE FUNCIONES 185 Notamos que los valores de a = 4, b = 2 y c = 0.47 se pasan a la función, ahí se modifican y se imprimen modificados. Al regresar al programa se mantienen en los valores originales. Esto quiere decir que podemos pasar valores de variables de un programa principal a una función, pero no a la inversa. Esta forma de pasar variables se conoce como llamar por valor (call by value) porque los valores de las variables se pasan a la función pero éstas permanecen sin cambiar en el programa principal. 6.3.1 Variables globales Hemos visto que las variables así como sus valores difieren en las funciones y en el programa principal. Es decir, las variables no se comparten entre las diferentes partes que forman un programa. A las variables definidas de esta manera se les llama variables locales. Esto puede ser conveniente en algunas ocasiones donde deseamos usar el mismo nombre para algunas variables pero que deseamos que no se alteren de valor en otra parte del programa, por ejemplo, con las variables que i, j, r, x, y que usamos continuamente. Si estas variables no fueran locales los programadores tendríamos muchos problemas al no saber qué valor tendrían en algunas partes del programa. Para evitar este problema MATLAB designa todas las variables como locales. En algunas ocasiones, el programador encuentra conveniente que una misma variable tenga el mismo nombre y el mismo valor en diferentes porciones del programa. En este caso, es necesario declarar la variable como global. De esta manera, toda la información de una variable quedará compartida en las funciones y en el programa que las declaren como global. EJEMPLO 6.14 Programa con una variable global Para ver cómo funcionan las variables globales, consideremos la variable a=3 que deseamos manejar en una función y en el siguiente programa principal. % Archivo seis_14.m % Programa para checar las variables globales y locales. global a a=3; fprintf (‘Valor de a antes de llamar a la función cambio1 a = %g \n’, a) cambio1 fprintf (‘Valor de a después de cambio1 a=%g \n’, a) cambio2 (a) fprintf (‘Valor de a después de cambio2 a = %g \n’, a) 186 6. P ROGRAMACIÓN CON MATLAB La función cambio1 es la siguiente: % Archivo cambio1.m function x=cambio1(a) global a fprintf (‘Valor de a después de haber entrado a cambio1 a = %g . \n’, a) a=7; fprintf (‘Valor de a modificado en cambio1 a = %g . \n’,a) La función cambio2 es: % Archivo cambio2.m function x=cambio2 (a) fprintf (‘Valor de a después de entrar a prueba2 a = %g . \n’, a) a=12; fprintf (‘Valor de a modificado en prueba 2 a = %g . \n’, a) Corremos ahora el programa principal, >> seis_14 Valor de a antes de llamar a la función cambio1 a = 3 Valor de a después de haber entrado a cambio1 a = 3 . Valor de a modificado en cambio1 a = 7 . Valor de a después de cambio1 a=7. Valor de a después de entrar a prueba2 a = 7 . Valor de a modificado en prueba 2 a = 12 . Valor de a después de cambio2 a = 7 Como vemos al correr el programa, el valor de a es global en el programa principal y en la función cambio1, pero es local en la función cambio2 y no se pasa su valor de la función cambio2 al programa principal. 6.3.2 La instrucción return Por lo general, al escribir una función esperamos que termine con la última línea de ella. Sin embargo, hay otras ocasiones en las que es preciso terminarla antes. Para poder hacer esto usamos la instrucción return. Con esto, en el momento en que la función encuentra un return, interrumpirá la ejecución y regresará el control al programa o función que llamó a dicha función donde se encontró el return. 6.3 V ARIABLES DE FUNCIONES EJEMPLO 6.15 187 Uso de return en una función Consideremos el siguiente programa que usa la función mayor_menor para decidir si un número es menor o mayor que cero: % Archivo seis_15.m x= input (‘Dame un valor de x: \n’); y= mayor_menor (x); fprintf (‘ Termina la corrida. \n’) La función mayor_menor es: % Archivo mayor_menor.m function y=mayor_menor (x) if x<0 fprintf (‘ x es menor a 0. \n’) y= x; return else fprintf (‘ x es mayor o igual a 0. \n’) end y= x; >> seis_15 Dame un valor de x: 0 x es mayor que o igual a 0. Termina la corrida. >> seis_15 Dame un valor de x: 8 x es mayor que o igual a 0. Termina la corrida. >> seis_15 Dame un valor de x: -6 x es menor que 0. Termina la corrida. 188 6. P ROGRAMACIÓN CON MATLAB 6.3.3 Nargin y nargout Las instrucciones nargin y nargout nos sirven para averiguar el número de variables de entrada y salida en una función. Para la función del ejemplo 6.15, nargin =1 y nargout=1. nargin es abreviatura para número de argumentos de entrada (Number of ARGuments in the INput) y nargout es la abreviatura para el número de argumentos en la salida (Number of ARGumentos in the OUTput). nargin y nargout son variables. 6.3.4 Funciones recursivas Una función recursiva es una función que se llama a ella misma. Esta propiedad está disponible en MATLAB, a diferencia de muchos lenguajes de programación que no lo permiten. El ejemplo más simple de función recursiva lo presenta la función factorial. El factorial de un entero no negativo n está dado por n!=nx(n-1)x...x2x1 la cual se puede reescribir como n!=nx(n-1)! Un programa que efectúa esta operación se muestra en el siguiente ejemplo. EJEMPLO 6.16 Cálculo recursivo del factorial En este ejemplo vemos cómo la función definida como factorial(n) se llama a sí misma de manera recursiva. function x= factorial (n) % Esta función calcula el factorial de n. % Este es el archivo factorial.m factorial=1; if n== 0 factorial = 1; else for i= 1:n factorial = factorial *i; end end x = factorial; 6.4 M ANEJO DE ARCHIVOS 189 La función factorial (n) del ejemplo 6.9 se puede reescribir como % Archivo fact_rec.m function x= fact_rec(n) if n~=1 x=n*fact_rec(n-1); else x=1; end Al correrla encontramos, >> fact_rec(6) ans = 720 de tal manera que esta función se está llamando a sí misma para calcular el factorial de un número entero. 6.4 Manejo de archivos Hasta este punto los datos de los programas y funciones se dan a través del teclado (entrada) y se muestran los resultados en la pantalla (salida). Otra manera de dar datos a un programa de MATLAB es a través de archivos. Estos archivos pueden ser creados por MATLAB o por algún otro programa. Esto último permitiría que se intercambiaran datos entre MATLAB y otros programas. Por ejemplo, se pueden crear datos con una hoja de cálculo y luego usar estos datos por MATLAB para realizar cálculos y graficarlos. De la misma manera los archivos con datos generados por MATLAB se pueden usar por otros programas. Una ventaja de usar archivos con datos de entrada/salida es que se pueden guardar en disco. De esta manera, el apagar la computadora, los datos no se pierden y se pueden usar nuevamente cuando se encienda la computadora. 6.4.1 Abrir y cerrar archivos Para leer de o escribir a un archivo es necesario abrirlo. MATLAB abre un archivo con el comando fopen cuya sintaxis es fid= fopen (nombre-del-archivo, permisos) 190 6. P ROGRAMACIÓN CON MATLAB Tabla 6-3 Códigos de permisos para abrir archivos Permiso Acción ‘r’ Abre el archivo para leer. El archivo debe existir. Si no existe se marca error. ‘r+’ Abre el archivo para leer y escribir. El archivo debe existir. Si no existe se marca error. ‘w’ Abre el archivo para escribir. Si el archivo existe, borra su contenido previo. Si no existe lo crea. ‘w+’ Abre el archivo para leer y escribir. Si el archivo existe, borra su contenido previo. Si no existe lo crea. ‘a’ Abre el archivo para escribir. Si el archivo existe, añade los nuevos datos al final. Si no existe lo crea. ‘a+’ Abre el archivo para leer y escribir Tabla 6-4 Identificador fid Identificadores para archivos Significado -1 Error al abrir el archivo. Generalmente se marca cuando se desea leer de un archivo y este no existe. 0 Entrada estándar. Generalmente el teclado que siempre está abierto para escribir (‘r’). 1 Salida estándar, la cual es la ventana de comandos de MATLAB. Siempre abierta con permiso para añadir datos al final de los existentes. 2 Error estándar. Siempre abierto y con permiso para añadir datos al final de los existentes. donde nombre-del-archivo es el nombre del archivo el cual ya debe existir para poder leerlo. En caso de escribir el archivo si este no existe se creará con el nombre dado y permisos es una variable que especifica cómo se abre el archivo. Los códigos de permisos disponibles aparecen en las tablas 6-3 y 6-4. Se pueden abrir tantos archivos como se desee. fid es un identificador que identifica el archivo que se acaba de abrir y se le llama identificador (handle). Este identificador empieza con el valor 3 ya que los identificadores de –1 a 2 tienen un significado específico para MATLAB. Después de terminar de usar los datos de un archivo, este debe cerrarse. El comando para cerrar archivos en MATLAB es fclose que tiene la sintaxis. status=fclose(fid) 6.4 M ANEJO DE ARCHIVOS 191 donde fid contiene el identificador del archivo que se desea cerrar. La variable status nos da otro identificador para saber si el archivo se cerró correctamente. Un status = 0 indica que se cerró correctamente, mientras que status = -1 indica que no se pudo cerrar el archivo. EJEMPLO 6.17 Uso de fopen Supongamos que queremos abrir un archivo inexistente llamado ejemplo6_17.txt. Entonces usamos: >>identificador_archivo=fopen(‘ejemplo6_17.txt’, ‘r’); >>identificador_archivo identificador_archivo = -1 El fid que llamamos identificador_archivo es –1 ya que quisimos leer de un archivo inexistente. Si usamos ‘w’ en lugar de ‘r’, obtenemos: >>identificador_archivo=fopen(‘ejemplo6_17.txt’, ‘w’); >>identificador_archivo identificador_archivo = 3 El valor que obtenemos para el fid es 3 indicando que se creó el archivo ejemplo 6_17.txt, ya que no existía, y ahora ya podemos escribir en él los datos que necesitemos. Este archivo abierto se identifica con identificador_archivo=3. Creamos ahora otro archivo datos.txt con: >> identificador_datos=fopen(‘datos.txt’,’w’) identificador_datos = 4 Para este archivo el identificador fid es 4 ya que estos identificadores se asignan secuencialmente. Con el comando dir vemos todos los archivos abiertos en el directorio en el que estamos trabajando, en donde veremos nuestros archivos que acabamos de abrir: >>dir ... ejemplo_6_17.txt..... datos.txt Como no hemos escrito nada en ellos, estarán abiertos. Podemos usar cualquier procesador de textos para ver su contenido, como puede ser el Bloc de notas de Windows o Word. 192 6. P ROGRAMACIÓN CON MATLAB Para abrir o crear un archivo en otro directorio ya existente sólo es necesario especificar la trayectoria. Por ejemplo: >> otro= fopen(‘C:\nuevo\archivo.txt’,’w’) otro= 5 Para cerrar un archivo usamos fclose cuya sintaxis es status=fclose(fid) donde fid es el identificador con el que se abrió el archivo que se desea cerrar. La variable status indica si se cerró el archivo correctamente (status=0). Si no se pudo cerrar, MATLAB nos enviará un mensaje de la razón por la que no se pudo cerrar el archivo. Antes de cerrar MATLAB es conveniente cerrar todos los archivos que hayamos abierto para evitar que se pierdan los datos que ahí se escribieron. 6.5 Escritura de Información en un archivo La forma más simple de escribir en un archivo es usando la instrucción fprintf. Esta instrucción ya la hemos usado para escribir datos de salida en la pantalla de MATLAB, como: >> fprintf (‘Escribe esto que va a la pantalla’) Escribe esto que va a la pantalla Para escribir a un archivo primero necesitamos crearlo y abrirlo. Abramos dos archivos: >> fid1= fopen(‘archivo1.txt’,’w’); >> fid2= fopen(‘archivo2.txt’,’w’); Para escribir a un archivo necesitamos indicar su identificador. Así entonces: >> fprintf (fid1, ‘aquí escribimos a archivo1.txt \n’); >> fprintf (fid2, ‘aquí escribimos a archivo2.txt \n’); Para ver lo que se escribió en ellos usando el bloc de notas, primero cerramos los archivos con: >> fclose(3);fclose(4); Ahora los podemos abrir con el bloc de notas y observar lo que escribimos en ellos. 6.5 E SCRITURA DE INFORMACIÓN EN UN ARCHIVO 193 6.5.1 Escritura y lectura de datos con formato MATLAB también nos permite leer y escribir datos formateados. Ilustraremos el procedimiento con un ejemplo. EJEMPLO 6.18 Escritura de datos con formato Supongamos que tenemos información de los anotadores del equipo de Brasil de la copa del mundo 2002. Los datos son 1) 2) 3) 4) Nombre Apellido Edad Goles anotados — Cadena de 20 caracteres. — Cadena de 20 caracteres. — Cantidad de 2 dígitos. — Cantidad de 2 dígitos. Si cada dato es menor que los caracteres indicados, los caracteres restantes se llenan con espacios en blanco. Cada uno de los incisos se almacena en un arreglo. Si hay 10 jugadores que anotaron goles entonces cada inciso es un arreglo de 10 líneas. Los datos son: >> Nombre= [‘Rivaldo’;’Ronaldo’;’Roberto’; ‘Cafu >> Apellido=[‘Vitor’;’Luiz ’;’Morae’;’Nelso’]; >> Edad=[30;26;32;29]; >> Goles= [3;2;1;4]; ’]; Para ver los datos de uno de ellos: >>fprintf (‘%s %s\n%g\n%g\n’,Nombre(2,:), Apellido(2,:), Edad(2,:), Goles(2,:)); Ronaldo Luiz 26 2 Para escribir esta información en un archivo usamos el siguiente programa script. %Archivo Ejemplo6_5_1.m fid_brasil=fopen(‘Datos_de_Brasil.txt’,’w’); for i=1:length(Goles); fprintf(fid_brasil,’%7s,%5s,%2d,%1d\n’,Nombre(i,:),Apellido(i,:), Edad(i,:),Goles(i,:)); end fclose(fid_brasil); 194 6. P ROGRAMACIÓN CON MATLAB Luego de correr el programa, al abrir con el bloc de notas vemos el archivo como se muestra en la figura 6.5 Figura 6.5 Contenido de Datos_de_Brasil.txt. Podemos leer ahora los datos del archivo desde un programa de MATLAB. Debemos checar varias cosas: 1. Si ya se llegó al final del archivo con un final de archivo end_of_file que se denota con feof. 2. Leer cada cadena con un fscanf y asignarla a su campo correspondiente. 3. Cerrar el archivo después de encontrar el final del archivo feof. El program script es: %Este archivo es leer_datos.m fid_datos= fopen(‘Datos_de_Brasil.txt’,’r’) %definimos las matrices de las variables Nombre=[ ]; Apellido=[ ]; Edad=[ ]; Goles=[ ]; 6.5 E SCRITURA DE INFORMACIÓN EN UN ARCHIVO 195 while ~feof(fid_datos) %lee el nombre cadena=fscanf(fid_datos,’%7c’,1); Nombre=[Nombre;cadena]; coma=fscanf(fid_datos,’%1c’,1); %lee el apellido cadena=fscanf(fid_datos,’%5c’,1); Apellido=[Apellido;cadena]; coma=fscanf(fid_datos,’%1c’,1); %lee la edad num=fscanf(fid_datos,’%2d’,1); Edad=[Edad;num]; coma=fscanf(fid_datos,’%1c’,1); %lee goles num=fscanf(fid_datos,’%1d’,1); Goles=[Goles;num]; end_of_line=fscanf(fid_datos,’%1c’,1); end fclose(fid_datos); La condición del while checa para ver si el archivo ya se terminó buscando el end_of_file (fin de archivo). El fscanf busca los primeros caracteres usando el formato %7c, que lee los primeros 7 caracteres, incluyendo espacio. Si hubiéramos usado %7s, sólo se leen los caracteres y se ignoran los espacios. El 1 indica que sólo se lee un elemento. De esta manera, cadena=fscanf(fid-datos,’%7c’,1) indica que se lea un elemento del archivo abierto con el identificador fid_datos y que se coloque en la variable cadena. La línea coma=fscanf(fid_datos,’%1c’,1) indica que después de leer la primera variable se lea una coma. No hacemos nada con la coma pero necesitamos leerla, ya que de otra manera la leería la siguiente instrucción fscanf. Para la Edad y Goles es necesario leer un dato numérico por lo que usamos %2d que lee un dato decimal de dos caracteres. Después de leer los goles se terminan los datos y llegamos al final de la línea, lo cual se lee con un carácter especial, por lo que es necesario leerlo con fin_de_línea = fscanf (fid_datos,’%1c’,1) que aunque no lo usamos es necesario leerlo para que no lo lea el siguiente fscanf, como lo hicimos con las comas. 196 6. P ROGRAMACIÓN CON MATLAB Para ver cómo funciona esto corremos el archivo y vemos las variables: >> leer_datos fid_datos= 3 >> who Your variables are: Apellido Goles Edad Nombre ans cadena coma end_of_line Si ahora vemos los datos >> Nombre Nombre = Rivaldo Ronaldo Roberto Cafu >> Apellido Apellido = Vitor Luiz Morae Nelso >> Edad Edad = 30 26 32 29 >>Goles Goles = 3 2 1 4 veremos las variables que definimos anteriormente. fid_brasil fid_datos i num 6.5 E SCRITURA DE INFORMACIÓN EN UN ARCHIVO 197 6.5.2 Escritura y lectura de archivos binarios Los datos de las secciones anteriores son datos de texto que se pueden leer por el usuario. A este tipo de datos se les llama datos ASCII. La desventaja de ellos es que usan mucha memoria para almacenarse, lo cual tiene una desventaja muy grande si, por ejemplo, se van a transmitir por Internet. Los archivos binarios son más eficientes para uso de memoria ya que necesitan menos memoria para almacenarse. Desafortunadamente, no son legibles desde un editor de textos. Para leer y escribir archivos binarios usamos fread y fwrite. La sintaxis del comando fwrite es: Cuenta = fwrite ( fid , A, ’precision’) donde A contiene los datos que deseamos escribir. Cuenta contiene el número de elementos que se pudieron escribir exitosamente. fid es el identificador con el que se abrió el archivo (ver figura 6.4). precision dice cómo queremos guardar la información. Algunas de las opciones de guardar más información se dan en la tabla 6-5. EJEMPLO 6.19 Lectura y escritura de archivos binarios Supongamos que deseamos almacenar en forma binaria en un archivo binario.dat los siguientes datos. 4 28 A = , 30 46 Tabla 6-5 Opción ‘char’ ‘Short’ 4 B = 27, C = ‘MATLAB, D = 9 3 Opciones para la variable precision Significado Caracteres de 8 bits. Usando texto Enteros de 16 bits. Usando para representar enteros en el rango de –215 a 215-1 ‘long’ Enteros de 32 bits (2’s complemento) Para representar enteros en el rango – 231 a 231-1 ‘float’ Número real de precisión sencilla ‘double’ Número real de precisión doble 198 6. P ROGRAMACIÓN CON MATLAB Primero se ingresan los datos >>A= [4 -28; 30 46]; B=27; C=‘MATLAB’; D=[4; -9; -3]; Luego abrimos el archivo >>fid_binario=fopen(‘binario.dat’, ‘w’) fid_binario = 3 Para escribir usamos >>fwrite(fid_binario, A, ‘double’) ans= 4 La operación de escribir regresa el 4 indicando que se escribieron cuatro elementos de la variable A. Ahora escribimos B, >>fwrite(fid_binario, B, ‘short’) ans= 1 Lo que indica que se escribió un elemento de B. Continuamos con C, >>fwrite(fid_binario, C, ‘char’) ans= 6 Lo que indica que se escribieron 6 caracteres. Finalmente para D, >>fwrite(fid_binario, D, ‘long’) ans= 3 Lo que indica que se escribieron 3 elementos para D. Ahora cerramos el archivo >>fclose (fid_binario) ans= 0 y lo tratamos de leer con el block de notas como se muestra en la figura 6.6. 6.5 E SCRITURA DE INFORMACIÓN EN UN ARCHIVO Figura 6.6 199 Ventana del bloc de notas para binario.dat. Como se ve en la figura 6.6, no se pueden leer los datos de binario.dat ya que los guardamos en forma binaria. Como se mencionó antes, el propósito de guardar datos en forma binaria es para almacenarlos más eficientemente y no se pretende que puedan ser leídos con un editor de textos. Para leer los datos primero abrimos el archivo >>fid_bin=fopen(‘binario.dat’,’r’) fid_bin= 3 y ahora usamos fread, cuyo formato es: >>[A,cuenta]=fread(fid_bin,[2,2],’double’) donde A es el nombre de la matriz y cuenta es el número de elementos (4 en el caso de la matriz A). Si A fuese una matriz de 8x4 entonces, en lugar de [2,2] escribiríamos el nuevo tamaño [8,4]. MATLAB nos da como resultado de la lectura los datos de A que se almacenaron en binario.dat previamente, como se muestra a continuación. >> [A,cuenta]=fread(fid_bin,[2,2],’double’) A= 4 -28 30 46 cuenta = 4 Nota: Los datos deben ser leídos en el mismo orden y en el mismo formato con el que fueron escritos en el archivo binario. Para leer los datos de las demás variables que almacenamos en nuestro archivo binario usamos: 200 6. P ROGRAMACIÓN CON MATLAB >>B=fread(fid_bin,[1],’short’) B= 27 >C=fread(fid_bin,[6],’char’) C= 77 65 84 76 65 66 Nótese que C es una cadena escrita en ASCII. Para convertirla a cadena de caracteres, obtenemos la transpuesta y usamos setstr. >> C=C’ C= 77 65 84 76 65 66 >> C=setstr(C) C= MATLAB >D=fread(fid_bin,[2 1],’long’) D= 4 -9 Ya que terminamos con el archivo binario.dat lo cerramos >fclose(fid_bin) ans = 0 indicando con este resultado que el archivo se cerró satisfactoriamente. 6.6 I NTERCAMBIO DE DATOS ENTRE MATLAB Y EXCEL 201 6.6 Intercambio de datos entre MATLAB y EXCEL Un programa muy usado en cálculos financieros es Excel, una de las hojas de cálculo más usadas en muchas áreas de las ciencias, ingenierías, finanzas, contabilidad, etc. Dado que tanto MATLAB como EXCEL pueden leer y escribir datos en archivos, es posible que los datos de un archivo creado por MATLAB puedan ser leídos por Excel y viceversa. Por ejemplo, MATLAB puede crear archivos de datos separados por comas. Esto es ideal para que EXCEL pueda leer estos datos. Para esto consideremos el archivo creado en la sección 6.5.1 y mostrado en la figura 6.5 y que se guardó con el nombre Datos_de_Brasil.txt. Recordemos que este archivo tiene los datos separados por comas las cuales reciben el nombre de separadores o delimitadores. Si ahora deseamos abrir estos datos con EXCEL, ejecutamos EXCEL y seleccionamos Abrir Archivo con lo que vemos la ventana de la figura 6.7. Cuando Excel abre los archivos y lee los datos reconoce que estos datos no fueron creados por Excel y que están delimitados por separadores, como se muestra en la figura 6.8. Figura 6.7 Ventana para abrir un archivo en EXCEL. Figura 6.8 Ventana de diálogo para importar datos. 202 6. P ROGRAMACIÓN CON MATLAB Para que Excel los pueda leer, seleccionamos Delimited y presionamos Next (ver figura 6.9) para obtener la ventana de diálogo de la figura 6.10 donde especificamos la coma como delimitador (el delimitador por omisión es el Tab). Antes de presionar el botón de Siguiente seleccionamos todos los datos como se muestra en la figura 6.11. Presionamos Finalizar y Excel importa los datos y aparece como se muestra en la figura 6.12. Ahora ya podemos procesar los datos en Excel. Figura 6.9 Figura 6.10 Selección de delimitador. Selección de delimitar con comas. 6.6 I NTERCAMBIO DE DATOS ENTRE MATLAB Y EXCEL Figura 6.11 Figura 6.12 203 Selección de los datos que se van a exportar. Ventana de Excel con los datos creados en MATLAB. Los datos que va a escribir MATLAB a un archivo se pueden separar automáticamente por comas con la instrucción csvwrite (nombre_del_archivo, m) donde csv son las iniciales de coma separated values (valores separados por comas). Por ejemplo, los datos de un arreglo A se escribirán en el archivo matriz separados por comas, la extensión será .csv. Entonces para A dado por 204 6. P ROGRAMACIÓN CON MATLAB >>A = [ 2702 A= 2702 25 5 2507 0; 2507 27 7 25 27 3; 5 7 330 ] 0 3 330 Podemos escribir este arreglo a un archivo matriz.csv con >>csvwrite ( ‘matriz.csv’, A ) que podemos ver con el WordPad como se muestra en la figura 6.13. Figura 6.13 Contenido del archivo matriz.csv. Figura 6.14 Ventana de Excel con los datos de matriz.csv. 6.6 I NTERCAMBIO DE DATOS ENTRE MATLAB Y EXCEL 205 Como Excel reconoce archivos con la extensión csv, podemos leer nuestro archivo matriz.csv. Para hacer esto ejecutamos Excel y abrimos el archivo. La ventana se ve entonces como se muestra en la figura 6.14. 6.6.1 Lectura en MATLAB de datos creados en EXCEL El formato csv permite el intercambio de datos entre distintos programas. Excel permite crear archivos con esta extensión que, por lo tanto, pueden ser leídos por MATLAB. Para ver esto consideremos un conjunto de datos en Excel como se muestra en la figura 6.15. Figura 6.15 Datos en EXCEL. Figura 6.16 Ventana de diálogo para salvar con la extensión csv. Ahora salvamos estos datos en el archivo lista_6_6.csv como se muestra en la figura 6.16, y después los podemos ver en MATLAB usando csvread ( ‘ lista_6_6.csv ’ ) 206 6. P ROGRAMACIÓN CON MATLAB como se muestra en la figura 6.17. Figura 6.17 Datos de lista_6_6.csv en MATLAB. Interfases Gráficas Salvador García Bernal, Miguel Sandino Parra y David Báez López Una interfase gráfica es el vínculo entre el usuario y un programa computacional, constituida generalmente por un conjunto de comandos o menús, instrumentos y métodos por medio de los cuales el usuario se comunica con el programa durante las operaciones que se desean realizar, facilitando la entrada y salida de datos e información. Una interfase es una de las partes más importantes de cualquier programa puesto que determina qué tan factible y preciso será el desempeño del programa ante los comandos que el usuario pretenda ejecutar. Aunque un programa sea muy poderoso, si se manipula por medio de una interfase pobremente elaborada, tendrá poco valor para un usuario inexperto. Es por esto que las interfases gráficas tienen una gran importancia para usuarios inexpertos o avanzados de cualquier programa ya que facilita su uso. Ejemplos de interfases gráficas son las ventanas de Word, Excel, la ventana de MATLAB, entre otras. Una interfase gráfica consiste de botones, menús, ventanas, etc, que permiten utilizar de una manera muy simple, y en ocasiones casi intuitiva, programas realizados en ambientes como Windows y Linux. Las interfases gráficas también se conocen como interfases de usuario. El nombre en inglés de las interfases gráficas es Graphical User Interface y se denominan GUI, por lo que nosotros también nos referiremos a ellas de la misma manera. Existen diferentes lenguajes de programación que permiten crear GUIs tales como Visual C, Visual Basic, TK y MATLAB por mencionar algunos. Todos ellos permiten usar diferentes controles y tienen distintas maneras de programarlos. MATLAB nos permite realizar GUIs de una manera sencilla usando una herramienta llamada GUIDE (GUI Development Environment). En este capítulo presentaremos una introducción a las técnicas en MATLAB para crear interfases gráficas. 7.1 Creando una GUI en MATLAB La forma de implementar las GUI con MATLAB es crear los objetos y definir las acciones que cada uno va a realizar. Al usar GUIDE para crear una GUI obtendremos dos archivos: un archivo FIG que contiene la descripción de los componentes que contiene la interface y un archivo M que contiene las funciones y los controles del GUI así como el callback. Un callback se define como la acción que lleva·a cabo un objeto de la GUI cuando el usuario lo active. Para ejemplificarlo, suponga que en una ventana existe 209 210 7. I NTERFASES G RÁFICAS un botón que al presionarlo ejecutará una serie de instrucciones, a ese conjunto de instrucciones se le conoce como la función del callback. 7.2 Iniciando GUIDE Para empezar a crear una GUI en MATLAB usamos GUIDE, ya sea que escribamos guide en la ventana de comandos de MATLAB o lo ejecutemos desde el menú principal File –> New –> GUI como se muestra en la figura 7.1. Figura 7.1 Ejecución de GUIDE usando el menú principal. Una vez hecho lo anterior MATLAB nos mostrará una ventana con opciones para la creación de la GUI o si deseamos abrir una ya existente (ver figura 7.2a). Si seleccionamos nueva GUI, entonces el área de diseño de la figura 7.2b aparecerá mostrando en la parte superior los menús y opciones de GUIDE. En la parte izquierda se aprecian los diferentes controles y en la parte central el área de diseño donde pondremos los controles a usar. (Se puede hacer que los controles aparezcan con su nombre mediante el menú File PreferencesK Guide y seleccionando luego Show names in component palette). 7.3 P ARTES DE GUIDE 211 a) Figura 7.2 a) Ventana de selección de nueva GUI o de una existente, b) Área de trabajo de GUIDE. b) 7.3 Partes de GUIDE Mencionaremos las partes más importantes de GUIDE que nos servirán para realizar los ejemplos representativos. La figura 7.3 muestra la lista de los controles con sus nombres. Cada botón cuenta con una serie de propiedades que explicaremos más adelante. En la parte superior de la figura 7.2b se encuentra la barra de herramientas que contiene entre otras las siguientes: Alineación de objetos, Editor de menú, Editor del orden del tabulador, Editor de archivo M, Inspector de propiedades, Navegador de objetos y Activación de GUI. Describiremos brevemente algunas de ellas que son necesarias para empezar a generar GUIs. Inspector de propiedades. Cada control cuenta con diferentes propiedades y es aquí donde podremos cambiar: el color, el nombre, el tag, el valor, el callback, entre otros. Activación de Figura. Una vez que hayamos terminado de diseñar, presionamos este botón para activar la figura y poder probar nuestra GUI. Botón de presión (Push Button). Crea un botón. Botón de selección (Radio Button). Crea un botón circular. Area de texto (Edit Text). Crea un campo para captura de texto. Ejes (Axes). Crea un área para gráficas. Marco (Frame). Crea un marco que puede contener otros controles. Texto estático (Static Text). Crea un letrero fijo. 212 7. I NTERFASES G RÁFICAS Figura 7.3 Objetos disponibles en la paleta de elementos nuevos. 7.4 Propiedades de los controles Para entender las propiedades de un control primero crearemos un botón y luego activamos el inspector de propiedades (figura 7.4). Los distintos elementos se pueden crear en el área de diseño con sólo seleccionarlos y arrastrarlos a donde deseamos que queden colocados. Figura 7.4 Propiedades del Botón de presión (Push Button). 7.5 E JEMPLOS 213 Como se ha mencionado, las propiedades varían dependiendo del control a usar. A continuación se explican las más comunes: BackgroundColor. Cambia el color del fondo del control. Callback. La propiedad más importante del control, ya que le dice al control qué hacer cuando este se active. Enable. Activa o desactiva un control. String. En el caso de botones, cajas de texto, texto estático; es el texto que se muestra en el control. Tag. Otra de las propiedades más importantes ya que con ésta es posible regresar datos o identificar al control. 7.5 Ejemplos Empezamos esta sección con una GUI sencilla y luego procedemos con ejemplos que involucran más componentes de las GUIs. EJEMPLO 7.1 Una GUI sencilla Para ilustrar el proceso de creación de una GUI consideremos una muy simple. Quizá uno de los ejemplos más simples es el de Hola Mundo en cualquier lenguaje de programación. Para ello creamos una nueva figura y agregamos un Static Text y un Push Button (ver figura 7.5) y lo guardamos como HolaMundo.fig; la extensión fig la da MATLAB automáticamente. Figura 7.5 Ventana de diseño de la GUI con el Texto estático y el Botón de presión. 214 7. I NTERFASES G RÁFICAS Después de guardar nuestro archivo, GUIDE automáticamente nos mostrará una ventana nueva con el código del archivo HolaMundo.m generado por GUIDE. Si se observa el código se puede notar·que hay líneas con %, lo cual indica que se trata de un comentario en el archivo script. Ahora en la ventana de GUIDE seleccionamos el Static Text y activamos el Inspector de Propiedades para modificar la propiedad String por Hola Mundo (figura 7.6). Se repite la misma operación para el Botón de presión pero en String escribimos Salir (figura 7.7) Figura 7.7 Propiedad modificada en el Botón de presión. Figura 7.6 Propiedad modificada en el Texto estático. Como siguiente paso vamos a editar el callback de nuestro botón Salir para que al ser activado cierre la ventana. Para ello seleccionamos el botón Salir con el botón derecho del apuntador y seleccionamos View Callbacks-> Callback como se muestra en la figura 7.8. Al hacer esto GUIDE nos mostrará el editor de funciones del archivo HolaMundo.m en donde escribimos nuestras instrucciones como se muestra en la figura 7.9. Para cerrar una figura en MATLAB la forma más sencilla es agregar close (gcbf) 7.5 E JEMPLOS 215 lo cual indica que cerraremos una figura de tipo gráfico. La manera de agregarlo en nuestra función se aprecia en la figura 7.9. Una vez guardado el archivo HolaMundo.m activamos la figura con la herramienta Activación de GUI y tendremos una salida como se muestra en la figura 7.10. Figura 7.8 Editando el callback del botón Salir. Figura 7.9 Agregando código a la función del botón Salir. 216 7. I NTERFASES G RÁFICAS Figura 7.10 GUI de Hola Mundo. Otra manera de ejecutarlo es usando la ventana de comandos y escribiendo: EDU>>HolaMundo Este GUI sólo ejecuta la acción de Salir al presionar dicho botón. Hay que mencionar que en este momento contamos con dos archivos: HolaMundo.fig y HolaMundo.m. Ambos archivos son necesarios para poder ejecutar nuestro GUI. EJEMPLO 7.2 Calculadora de derivadas/integrales/Fourier (Calculador DEINFOU) Nuestro segundo ejemplo consiste en la creación de una GUI para el cálculo de derivadas, integrales y evaluación de la transformada de Fourier. Este proyecto nos permitirá explicar cómo usar los Cuadros de Edición (Edit Text) para pedir información y los Static Text para desplegar resultados, así como algunas otras propiedades importantes. Para empezar creamos una nueva figura y agregamos un Static Box, a un lado ponemos un Edit Text y al lado del Edit Text ponemos un Push Button, debajo de estos controles ponemos seis Static Text y finalmente agregamos dos Push Buttons y lo guardamos como CalcDeIntFour.fig. Al finalizar tendremos una interfase como la que se muestra en la figura 7.11. El fondo blanco de nuestro GUI se puede lograr colocando el cursor sobre cualquier punto del GUI, haciendo doble pulsación con el botón izquierdo para que se abra el Editor de Propiedades y ahí seleccionamos que el color sea blanco. 7.5 E JEMPLOS 217 Ahora en el primer Static Text cambiamos sus propiedades con el Inspector de Propiedades y modificamos el String a Funcion, como se muestra en la figura 7.12. En Text Box cambiamos la propiedad de String a x, al primer Push Button le cambiamos el String a Calcula. Figura 7.11 Interfase del Proyecto CalcDEINFOU. Figura 7.12 Cambio de la propiedad String a Funcion. 218 7. I NTERFASES G RÁFICAS En el siguiente orden modificamos las propiedades de String de cada Static Text restante como: String: Derivada String: Integral String: Fourier Para los Static Text abajo del Edit Text no escribimos nada para que queden en blanco. Finalmente para el Push Button del lado izquierdo modificamos la propiedad String a Limpia y para el Push Button del lado derecho a Salir. Finalmente obtendremos los controles como se muestra en la figura 7.13. Figura 7.13 GUI con propiedades String modificadas. El siguiente paso es editar la propiedad Tag de cada control. El Tag es el nombre como se va a identificar cada componente del GUI. Para ello seleccionamos Tag en el Inspector de propiedades. Primero editamos el Tag de nuestro control de la caja de texto (Edit Text) por la_ecuación, lo que se muestra en la figura 7.14. Para los Static Text que no tienen texto modificamos sus Tag en el siguiente orden por: resultado_derivada resultado_integral resultado_Fourier 7.5 E JEMPLOS 219 Figura 7.14 Propiedad Tag modificadas en el Edit Text. El Tag de los controles restantes es igual a su String correspondiente. Ahora vamos a editar el callback del botón Salir y agregamos el código necesario para cerrar la ventana. El código para salir es close(gcbf); y después de agregar close(gcbf), el código del botón salir queda como se muestra en la figura 7.15. Figura 7.15 Código completo del botón Salir. 220 7. I NTERFASES G RÁFICAS Luego editamos el callback del botón Limpia, cuya acción es limpiar el Edit Text de la función y los resultados de cada operación que se escriben en los Static Text. Para limpiar necesitamos conocer el identificador o “handle” de cada componente a limpiar. Esto lo podemos saber si recordamos el Tag de cada uno de ellos. De esta manera los identificadores son handles.la_ecuacion handles.resultado_derivada handles.resultado_integral handles.resultado_Fourier para el Edit Text y los tres Static Text, respectivamente. El comando para limpiar consiste en cambiar la propiedad String por una cadena en blanco. Esto se puede hacer con limpia = ‘’; set ( handles.resultado_derivada, ‘String’, limpia), Proseguimos a limpiar los otros dos Static Text y el Edit Text de la misma manera. El código del botón limpiar queda como se muestra en la figura 7.16. Figura 7.16 Código del botón Limpiar. Finalmente llevaremos a cabo las operaciones correspondientes que se ejecutan al presionar el botón Calcula. Para ello editamos el callback de este botón según el siguiente algoritmo: 7.5 E JEMPLOS 221 1. Obtengo la ecuación usando el identificador 2. Hago cálculos 3. Presento resultados Para obtener la ecuación que se escriba en el Edit Text usamos ecuación = eval ( get ( handles.la_ecuacion, ‘String’)); Para realizar el cálculo de la derivada: derivada1 = diff (ecuacion); Ahora preparo el resultado para desplegarlo en forma de caracter usando la instrucción char(): derivada2 = char (derivada1); Finalmente despliego el resultado de la derivada: set (handles.resultado_derivada, ‘String’, derivada2 ); Y realizo la misma operación para los otros dos cálculos. En la figura 7.17 se aprecia el código completo del botón Calcula. Para probar nuestra aplicación activamos la figura y tendremos una salida como en la figura 7.18 para la función x2+5x–8. Figura 7.17 Código del botón Calcula. 222 7. I NTERFASES G RÁFICAS Figura 7.18 EJEMPLO 7.3 Prueba de la aplicación CalcDeIntFour. Conversor de temperaturas Nuestro siguiente ejemplo es un conversor de temperaturas que nos permite convertir entre las escalas de temperatura Celsius-Kelvin-Fahrenheit. Para empezar ejecutamos Guide como se ha visto y colocamos cuatro StaticText como se muestra en la figura 7.19, dándoles el tamaño indicado en la figura. Figura 7.19 Posición y tamaño de los Static Text. 7.5 E JEMPLOS 223 En el caso de cada una de ellas modificamos la propiedad String con el Property Inspector en el siguiente orden: Calculador de Temperaturas Celsius Kelvin Fahrenheit En la figura 7.20 se puede apreciar el estado actual de la GUI, mientras que la figura 7.21 muestra la ventana del Inspector de Propiedades con el cambio del último Static Text a Fahrenheit Figura 7.20 Estado actual de la GUI. Debajo de las etiquetas Celsius, Kelvin, Fahrenheit agregamos tres Edit Text y cuatro Push Button y modificamos la propiedad String para que los Edit Text queden en blanco, quitando todo texto de la propiedad String, y en los Push Button cambiamos la propiedad String a Calcula para los tres primeros y Salir para el último, para dejar ahora la interfase como se muestra en las figura 7.22. Al mismo tiempo cambiamos la propiedad Tag de los Push Button a Boton_Celsius, Boton_Kelvin y Boton_Fahrenheit, respectivamente, como se muestra en la figura 7.23 para el botón Celsius. Para el botón Salir le cambiamos su Tag a Boton_Salir. 224 7. I NTERFASES G RÁFICAS Figura 7.21 Cambio del nombre en el Inspector de Propiedades. Figura 7.22 La interfase con los nuevos controles. 7.5 E JEMPLOS 225 Figura 7.23 Definiendo el Tag del Push Botton Celsius como Boton_Celsius. Ahora es necesario definir las variables que se van a usar en el callback, y para ello se debe modificar en la propiedad Tag de los Edit Text de acuerdo con el siguiente orden. Celsius Kelvin Fahrenheit Para realizar esto seleccionamos el Edit Text y modificamos la propiedad Tag con los datos anteriores para cada uno de los Edit Text. Esto se aprecia en la figura 7.24 para Fahrenheit. Figura 7.24 Modificando la Propiedad Tag. 226 7. I NTERFASES G RÁFICAS Una vez hecho lo anterior guardamos nuestra interfase con File Save AsK y ponemos el nombre de conv_temp; esto nos abrirá una nueva ventana del editor de MATLAB en donde pondremos el código necesario. Ahora tenemos dos archivos: conv_temp.fig y conv_temp.m. Primero agregaremos código al botón de Salir, y para ello seleccionamos la opción callback del control a modificar (en este caso Salir) y escribimos close (gcbf). En la figura 7.25 se observa el código agregado para el botón Salir. Figura 7.25 Agregando código al callback del Botón Salir. En el control de Calcula debajo de Celsius pondremos el código para convertir de Celsius a Kelvin y Fahrenheit, y para ello tenemos el siguiente algoritmo: 1. 2. 3. 4. Obtengo el dato de Celsius Realizo conversión de Celsius a Kelvin Realizo conversión de Celsius a Fahrenheit Despliego resultados Basándonos en lo anterior recordamos las fórmulas para realizar dichas conversiones: 7.5 E JEMPLOS Celsius a Kelvin K = (Celsius + 273.15) 227 Celsius a Fahrenheit F = (1.8 * Celsius) + 32 Tomando en cuenta lo anterior, en el editor de archivos-m modificamos el callback del botón Calcula debajo de Celsius que corresponde a Boton_Celsius y escribimos el código necesario. Para leer el dato usamos micelsius = eval ( get ( handles.Celsius, ‘String’)); y para convertir de Celsius a Kelvin y a Fahrenheit usamos mikelvin = micelsius + 273.15; mifahrenheit = 1.8 * micelsius + 32; y para escribir en los Edit Text de Kelvin y Fahrenheit usamos: set ( handles.Kelvin, ‘String’ , mikelvin); set ( handles.Fahrenheit, ‘String’ , mifahrenheit); La figura 7.26 muestra cómo queda el código del botón Calcula correspondiente a Celsius. Figura 7.26 Código completo para convertir grados Celsius a Kelvin y a Fahrenheit. 228 7. I NTERFASES G RÁFICAS Como siguiente acción pondremos el código para convertir de Kelvin a Celsius y Fahrenheit el cual se observa en la figura 7.27, el algoritmo es muy similar al anterior y las fórmulas usadas son: Kelvin a Fahrenheit F = (K – 273.15) / 5 * 9 + 32 Figura 7.27 Kelvin a Celsius C = K – 273.15 Código para convertir de Kelvin a Celsius y a Fahrenheit. El código necesario es mikelvin = eval ( get ( handles. Kelvin, ‘String’)); y para convertir de Kelvin a Celsius y a Fahrenheit usamos mifahrenheit = ( mikelvin - 273.15) * 9 / 5 + 32; micelsius = mikelvin – 273.15; 7.5 E JEMPLOS 229 y para escribir en los Edit Text de Celsius y Fahrenheit usamos: set ( handles.Celsius, ‘String’ , micelsius); set ( handles. mifahrenheit, ‘String’ , mifahrenheit); Finalmente pondremos el código para convertir de Fahrenheit a Celsius y Kelvin, el cual se observa en la figura 7.28. El algoritmo es muy similar al anterior y las fórmulas usadas son: Fahrenheit a Celsius C = (F – 32) * 0.555 Figura 7.28 Fahrenheit a Kelvin K = (F – 32) / 9 * 5 + 273.15 Código de Fahrenheit a Celsius y Kelvin. Ahora lo podemos ejecutar escribiendo en la ventana de comandos conv_temp y obtendremos la salida de la figura 7.29, en donde se muestra el programa ejecutándose. 230 7. I NTERFASES G RÁFICAS Figura 7.29 EJEMPLO 7.4 Aspecto final del Convertidor de Temperaturas. Uso de gráficas en GUI´s. En este ejemplo presentamos cómo se puede realizar una interfase gráfica conteniendo la gráfica de una función. La función que deseamos graficar es: y(t ) = sen(2ft ) donde ƒ es la frecuencia de la función seno. Para realizar nuestra GUI abrimos una nueva GUI usando GUIDE. A esta GUI le agregamos ejes (axes), 3 Edit Text, 4 Static Text y un Radio Button como se muestra en la figura 7.30. Modificamos la propiedad string de los Static Text de la siguiente manera: - Rango de Tiempo - Tiempo Inicial - Tiempo Final - Frecuencia Para el Radio Button, las propiedades string y Tag las cambiamos a Rejilla. Para los Edit Text la propiedad string la borramos para dejarla en blanco y el Tag lo modificamos a lo siguiente: Tiempo_inicial Tiempo_final Frecuencia 7.5 E JEMPLOS Figura 7.30 GUI inicial. El GUI final se muestra en la figura 7.31. Figura 7.31 GUI con los String en su forma final. 231 232 7. I NTERFASES G RÁFICAS Ahora es necesario editar los callbacks de nuestro GUI. El único que vamos a editar es el callback del Edit Text cuyo Tag es Frecuencia y que contiene la frecuencia de la función seno. El procedimiento es el siguiente: 1. Obtener el rango de la gráfica que va de Tiempo_inicial a Tiempo_final. 2. Obtener la frecuencia del seno. 3. Graficar la función con plot. El Radio Button tiene la propiedad value = 1 si está seleccionado y 0 si no está seleccionado. Después de usar el plot checamos para ver si se le añade una rejilla a la gráfica. Las instrucciones que vamos a realizar son entonces las siguientes: 1. Para obtener los rangos de tiempo que escribimos en la propiedad string de los Edit Text del rango de tiempo t1= str2num(get(handles.Tiempo_inicial, ‘string’)); t2= str2num(get(handles.Tiempo_final, ‘string’)); 2. Formamos el vector de tiempos con 200 puntos t = linspace ( t1, t2, 200); 3. Obtenemos el valor de la frecuencia frec = str2num( get ( handles.Frecuencia, ‘string’)); 4. Graficamos la función y = sin ( 2*pi*frec*t ); plot ( t , y ); 5. Checamos si se requiere rejilla en la gráfica rejilla1=get(handles.Rejilla, ‘value’); if rejilla1==1 grid on end El callback completo se muestra a continuación y se muestra en negritas el código añadido por nosotros. 7.5 E JEMPLOS 233 function Frecuencia_Callback(hObject, eventdata, handles) % hObject handle to Frecuencia (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,’String’) returns contents of Frecuencia as text % str2double(get(hObject,’String’)) returns contents of Frecuencia as a double %Para obtener los rangos de tiempo t1= str2num(get(handles.Tiempo_inicial, ‘string’)); t2= str2num(get(handles.Tiempo_final, ‘string’)); %Formamos el vector de tiempos con 200 puntos t = linspace ( t1, t2, 200); %Obtenemos el valor de la frecuencia frec = str2num( get ( handles.Frecuencia, ‘string’)); %Graficamos la función y = sin ( 2*pi*frec*t ); plot ( t, y ); %Checamos si se requiere rejilla en la gráfica rejilla1=get(handles.Rejilla, ‘value’); if rejilla1==1 grid on end La figura 7.32 muestra la manera como trabaja nuestra GUI. Como sólo se editó el callback del Edit Text de la frecuencia, el GUI se activa al dar el valor de la frecuencia y presionar Enter. Figura 7.32 El GUI trabajando para una frecuencia de 3 Hz y un tiempo inicial de 1 seg y tiempo final de 2 seg y con rejilla. 234 7. I NTERFASES G RÁFICAS EJEMPLO 7.5 Uso de barras de deslizamiento Una barra de deslizamiento es un elemento de GUIs que nos permite cambiar el valor de una variable entre un límite mínimo y un límite máximo almacenados en las propiedades Min y Max, respectivamente. La posición de la barra es la propiedad Value. A nuestro GUI del ejemplo 7.3 le añadimos una barra de deslizamiento para variar la frecuencia entre los valores de Min y Max a 1 y 10, respectivamente, así como dos Static Text para indicar los valores máximos y mínimos de frecuencia. Figura 7.33 GUI mostrando la barra de deslizamiento. Ahora deseamos que al cambiar la posición de la barra cambie la frecuencia y se cambie la gráfica, adicionalmente a que se cambie el valor de la frecuencia en el Edit Text de Frecuencia. Cambiamos las propiedades de la barra de desplazamiento a: Min Max Value Tag String 1 10 5 Barra en Blanco 7.5 E JEMPLOS 235 Y el callback del Edit Text de la frecuencia se tiene que modificar para tomar en cuenta el valor y la posición de la barra, asegurándonos que estén dentro de los límites y que el valor de Value sea numérico. La instrucción isnumeric checa si el valor de Frecuencia es numérico. El callback para el Edit Text de Frecuencia entonces queda como se muestra a continuación (en negritas lo que se añadió por nosotros): function Frecuencia_Callback(hObject, eventdata, handles) % hObject handle to Frecuencia (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,’String’) returns contents of Frecuencia as text % str2double(get(hObject,’String’)) returns contents of Frecuencia as a double %Obtenemos los límites de tiempo ( Rango de tiempo ) t1 = str2num ( get ( handles.Tiempo_inicial, ‘String’ ) ); t2 = str2num ( get ( handles.Tiempo_final, ‘String’ ) ); %Formamos el vector de tiempos con 200 puntos t = linspace( t1, t2, 200); %Obtenemos el valor de la frecuencia y modificamos % la barra de deslizamiento. frec = str2num ( get ( handles.Frecuencia, ‘String’ ) ); editamin = get ( handles.Barra, ‘Min’ ); editamax = get( handles. Barra, ‘Max’ ); %Checamos si el valor de Frecuencia es numérico if isnumeric ( frec) & length ( frec) == 1 & ... frec >= editamin & ... frec <= editamax set ( handles. Barra, ‘Value’, frec ) elseif frec < editamin set ( gcbo, ‘String’, editamin ); set ( handles.Barra, ‘Value’, editamin ); frec = editamin; 236 7. I NTERFASES G RÁFICAS elseif frec > editamax set ( gcbo, ‘String’, editamax ); set ( handles.Barra, ‘Value’, editamax ); frec = editamax; end %Graficamos la función: y = sin ( 2*pi*frec*t ); plot ( t, y ); %Checamos si se requiere rejilla en la gráfica. rejilla1 = get ( handles.Rejilla, ‘value’ ); if rejilla1 == 1 grid on end y para la barra de desplazamiento (Barra) en donde queremos que se regrafique la función cuando se mueva la barra de desplazamiento se muestra a continuación: function Barra_Callback(hObject, eventdata, handles) % hObject handle to Barra (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,‘Value’) returns position of slider % get(hObject,‘Min’) and get(hObject,‘Max’) to determine range of slider set( handles.Frecuencia, ‘String’, get ( gcbo, ‘Value’ ) ); t1= str2num ( get ( handles.Tiempo_inicial, ‘String’ ) ); t2= str2num ( get ( handles.Tiempo_final, ‘String’ ) ); t = linspace ( t1, t2, 200 ); frec=get ( gcbo, ‘Value’ ); y = sin ( 2*pi*frec*t ); plot ( t, y ); rejilla1 = get ( handles.Rejilla, ‘value’ ); if rejilla1 == 1 grid on end 7.5 E JEMPLOS 237 La figura 7.34 nos muestra la GUI funcionando. El lector puede comprobar el funcionamiento de este GUI y ver cómo cambia la gráfica al mover la barra de deslizamiento. Figura 7.34 GUI final con barra de deslizamiento. Simulink SIMULINK sirve para modelar, simular y analizar sistemas, los cuales pueden ser lineales o no lineales, de tiempo continuo o de datos muestreados o combinación de ambos. También los sistemas discretos con los que SIMULINK puede trabajar pueden ser de distinta frecuencia de muestreo. Los sistemas que se simulan en SIMULINK reciben el nombre de modelos. Para modelar sistemas, SIMULINK tiene una interfase gráfica que sirve para construir modelos como diagramas de bloques. Para este propósito, SIMULINK incluye una muy completa biblioteca de componentes lineales y no lineales, fuentes y sumideros y conectores. Además, el usuario puede crear sus propios componentes. Después de que se define un modelo para un sistema, este se puede simular usando menús en SIMULINK. Las limitantes para los modelos de SIMULINK es la cantidad de toolboxes que se hayan comprado. 8.1 Inicio de SIMULINK Para usar SIMULINK debemos estar trabajando con MATLAB. SIMULINK se puede que se encuentra en la iniciar con una pulsación sobre el icono de SIMULINK barra de tareas de MATLAB o escribiendo SIMULINK en el espacio de trabajo de MATLAB, lo que nos lleva a la figura 8.1a donde aparece el Manejador de la biblioteca de SIMULINK (SIMULINK Library Browser) donde se muestran las bibliotecas de bloques. Para observar los e1ementos o bloques que cada biblioteca tiene sólo colocamos el cursor sobre la biblioteca y observamos qué componentes contiene en la parte derecha de la ventana de la figura 8.1b. Para crear un modelo de sistema en SIMULINK, en el menú File seleccionamos New con lo que se abre una ventana para “armar” nuestro modelo como la que se muestra en la figura 8.2. Ilustraremos el procedimiento de “armado” mediante un modelo para un integrador. Para “armar” el modelo de un integrador, en la biblioteca de fuentes (Sources) seleccionamos el bloque de la fuente senoidal Sine Wave y lo “arrastramos” a la ventana del modelo. Hacemos lo mismo con el integrador que está en la biblioteca Continuous, el osciloscopio (Scope) que está en la biblioteca Sinks y el bloque mux que está en la biblioteca Signal Routing para obtener la figura 8.3. Los paréntesis angulares (>) junto a cada bloque indican si una señal entra o sale de ese bloque. Si el símbolo > apunta hacia afuera del bloque indica un puerto de salida. Si el símbolo > apunta hacia adentro entonces es un puerto de entrada. En la onda seno la señal sale, mientras que en el Scope la señal entra. En los bloques del integrador y del mux hay señales que entran y salen. 241 242 8. SIMULINK a) b) Figura 8.1 Manejador de la Biblioteca de SIMULINK. 8.1 I NICIO DE SIMULINK Figura 8.2 243 Ventana de trabajo de SIMULINK para armar nuestros modelos. Figura 8.3 Bloques para nuestro circuito integrador. Para conectar los bloques entre sí, colocamos el cursor en un puerto de salida. Manteniendo el botón izquierdo del ratón presionado, movemos el cursor hasta el puerto de entrada superior del mux. Vemos que se forma una línea punteada y que el puerto de entrada del mux cambia a +. Al soltar el botón, los dos puertos quedan conectados, como se muestra en la figura 8.4. Se puede hacer una ramificación de una conexión a un puerto de entrada. Se coloca el cursor sobre la conexión como se muestra en la figura 8.5a y con el botón derecho del ratón presionando se conecta hasta el puerto de entrada deseado como se muestra en la figura 8.5b. 244 8. SIMULINK Figura 8.4 Conexión entre bloques. a) b) Figura 8.5 Pasos para hacer una ramificación de una conexión: a) colocar el cursor sobre la rama; b) arrastrar hacia el puerto de entrada del bloque al cual deseamos conectar. 8.1 I NICIO DE SIMULINK 245 Finalmente conectamos todos los bloques para que quede como la figura 8.6. Ahora necesitamos guardar nuestro modelo en un archivo. Para esto usamos el menú FileSave con lo que se abre la ventana de diálogo donde damos el nombre con el cual queremos guardar nuestro modelo. Nótese que los archivos de SIMULINK se guardan con la extensión mdl de modelo. Figura 8.6 Modelo Final. Ahora en el menú Simulation escogemos Configuration Parameters como se ve en la figura 8.7a, lo cual abre la ventana de la figura 8.7b. Aquí escogemos el tiempo final de la simulación Stop time de 10 seg. Presionamos Ok y para empezar la simulación en el menú de Simulation seleccionamos Start. Alternativamente podemos usar el icono de Start en la barra de herramientas. Para ver la salida en Scope abrimos el bloque de Scope con el botón derecho y seleccionamos Open Block como se ve en la figura 8.7c. La figura 8.8 nos muestra el resultado. Las señales en la ventana de Scope son la señal de entrada y la señal integrada. Figura 8.7a) 246 8. SIMULINK b) c) Figura 8.7 Pasos para especificar datos de la simulación a) Seleccionamos de Configuration Parameters. b) Ventana para especificar los parámetros. c) Para abrir la ventana de Scope. 8.2 E L ELEMENTO SCOPE 247 Figura 8.8 Resultados de la simulación. 8.2 El elemento Scope Si observamos la figura 8.8 notamos que en la ventana del Scope aparece una barra de herramientas que nos permiten realizar distintas funciones sobre la gráfica que tenemos a la vista. La función de estos iconos se muestra con nombre en la figura 8.9 y se invita al lector a usarlos en la gráfica mostrada en la figura 8.8. Una breve explicación de las más usadas de estas herramientas se da a continuación. Figura 8.9 Iconos de la barra de herramientas de la ventana de Scope. 248 8. SIMULINK Print Parámetros Autoescalar Selección de señal 8.3 Sirve para imprimir la gráfica que Scope presenta en ese momento. Abre una ventana para indicar el número de ejes, el rango de tiempo, poner marcadores a las curvas, indicar si es Scope flotante. Además da la opción de enviar los resultados a la ventana de trabajo de MATLAB para su uso en otro programa y de limitar el número de puntos de los datos a graficar. Automáticamente fija los ejes dentro de los rangos de la señal graficada. Permite seleccionar cualquiera de las señales disponibles en el modelo. Ejemplos EJEMPLO 8.1 Filtro pasabanda El filtro pasabanda de variable de estado KHN se puede escribir como el diagrama de bloques de la figura 8.10. La función de transferencia que deseamos realizar es N( s) = Figura 8.10 10 s 2 s + 0.1s + 1 Filtro pasabanda KHN. 8.3 E JEMPLOS 249 lo que corresponde a un filtro pasabanda con una ganancia de 20, una frecuencia central de 1 rad/seg y un factor de calidad Q de 10. Deseamos observar su respuesta al escalón. Los bloques de este modelo se encuentran en las bibliotecas siguientes: Elemento Biblioteca Sum (suma) Math Integrator (integrador) Continuous Gain (ganancia) Sources Scope (osciloscopio) Sinks Para establecer las características de los elementos de la figura 8.10 primero se selecciona el elemento de interés, y luego se despliega el menú Edit y se ejecuta el comando de parámetros. Para hacer el tiempo final de la simulación igual a 100 se despliega el menú Simulation y se ejecuta el comando Configuration Parameters. ▼ Con una doble pulsación sobre el Scope abrimos la ventana de éste y después de presionar el botón de correr ( ) observamos la respuesta de la figura 8.11. La respuesta al escalón del filtro tarda bastante en amortiguarse y tiene un sobretiro muy alto también debido al valor tan alto del factor de calidad Q con el que se diseñó. El lector puede ver que si se reduce el factor de calidad, el tiempo de amortiguamiento y el sobretiro se reducirán. Figura 8.11 Respuesta al escalón del filtro KHN de variable de estado. EJEMPLO 8.2 Respuesta de una ecuación diferencial Consideremos la siguiente ecuación diferencial con condiciones iniciales y(0) = 0, y ’(0) = 2000. 2 d y( t ) dt 2 +a dy(t) + b y( t ) = 0 dt 250 8. SIMULINK Para simular esta ecuación diferencial la escribimos como 2 d y( t ) dt 2 = a dy(t) b y( t ) dt Con a = 2000 y b = 20000, obtenemos el modelo de la figura 8.12. Para dar las condiciones iniciales, hacemos una doble pulsación con el botón izquierdo del ratón sobre cada integrador. Para el integrador de dy/dt damos la condición inicial (initial condition) de -2000, para el integrador de y damos la condición inicial de 0. Los valores de los bloques de ganancia son –2000 y –20,000, respectivamente. Para especificar el tiempo de la corrida, en el menú de Simulation escogemos Configuration Parameters y escribimos un Stop time de 10 milisegundos. Hacemos doble pulsación sobre el bloque de Scope y corremos la simulación. Al correr la simulación obtenemos la gráfica de la figura 8.13. Figura 8.12 Modelo en SIMULINK de la ecuación diferencial del circuito RLC. Figura 8.13 Respuesta del circuito RLC. 8.3 E JEMPLOS EJEMPLO 8.3 251 Bloque de Función de Transferencia de un filtro pasabanda Consideremos la función de transferencia de un filtro pasabanda N( s) = 10 s 2 s + 0.1 s + 1 Esta función la podemos realizar con el bloque Transfer Fcn que se encuentra en la biblioteca Continuous y que se muestra en la figura 8.14. Haciendo doble pulsación sobre el bloque con el botón izquierdo del ratón se abre la ventana de la figura 8.15 donde se pueden dar los coeficientes del numerador y denominador en orden de potencias descendientes de s. En nuestro caso, para el numerador damos [10 0] y para el denominador [1 0.1 1]. Este bloque lo alimentamos con una señal escalón (step). El circuito completo se muestra en la figura 8.16. Después de correr la simulación, la salida del filtro la observamos en un Scope y después de presionar el botón de Autoscale obtenemos la figura 8.17 donde observamos cómo el filtro pasabanda responde al escalón que es una señal de corriente directa pero que tiende a amortiguarse cuando el tiempo transcurre. Figura 8.14 Bloque para definir funciones de transferencia. Figura 8.15 Ventana para definir los coeficientes de bloque de la función de transferencia. 252 8. SIMULINK Figura 8.16 Modelo para el filtro usando el bloque de función de transferencia. Figura 8.17 EJEMPLO 8.4 Señal de salida. Filtro digital de segundo orden Consideremos la función de transferencia de un filtro digital N( z ) = 1 z 1 1 1 0.909 z + 0.809 z 2 el cual se puede modelar como se muestra en la figura 8.18. Como este filtro digital es un filtro pasabanda, al aplicarle una señal senoidal vemos en la figura 8.19 cómo se filtra la señal y cómo aparece la salida muestreada. 8.4 S UB SISTEMAS Figura 8.18 Figura 8.19 253 Filtro digital pasabanda. Señales de entrada y salida. 8.4 Subsistemas Cuando un modelo aumenta de tamaño y complejidad, es útil simplificarlo agrupando varios bloques en un subsistema. Con el uso de subsistemas se puede reducir el número de bloques desplegados en el modelo, además de tener la posibilidad de establecer una jerarquía en el diagrama de bloques donde el bloque de un subsistema está en un nivel y los bloques que forman el subsistema están en otro nivel. 254 8. SIMULINK Entre las ventajas que ofrece la creación de subsistemas están las siguientes: a) Ayuda a reducir el número de bloques que se despliegan en la ventana de trabajo. b) Permite mantener agrupados bloques relacionados. c) Permite establecer un diagrama jerárquico donde los bloques de subsistemas están en un nivel y los bloques que forman cada subsistema están en otro nivel. Los subsistemas se pueden crear de dos maneras. La más sencilla es cuando a un sistema ya creado añadir un bloque de subsistema —subsystem— y abrir el bloque y añadirle los bloques del sistema que deseamos aparezcan en el subsistema. La otra forma es añadir a la ventana de trabajo los bloques que deseamos que contenga el subsistema y agruparlos en un subsistema. Mostraremos estas dos maneras de crear subsistemas con ejemplos. EJEMPLO 8.5 Creación de un subsistema Supongamos que tenemos el sistema discreto dado en la figura 8.20. Si queremos agrupar el sumador, el multiplicador y el bloque 1/z dentro del subsistema, seleccionamos todos los componentes que deseamos poner en el subsistema con el botón izquierdo del ratón, y del menú Edit seleccionamos Create Subsystem. Al hacer esto, SIMULINK reemplaza los elementos seleccionados por un bloque de subsistema como se muestra en la figura 8.21. Figura 8.20 Modelo principal con una parte de él encerrado en una superficie gaussiana. 8.4 S UB SISTEMAS 255 Figura 8.21 Modelo con parte de sus componentes encerradas dentro de un bloque de subsistema. Si ahora abrimos el bloque del subsistema, SIMULINK nos muestra los bloques del subsistema como se muestra en la figura 8.22. Nótese que SIMULINK añade puertos de entrada y salida Inport y Outport para representar las entradas y salidas del subsistema. Figura 8.22 Subsistema creado con los componentes seleccionados en la figura 8.20. 256 8. SIMULINK Para revertir la creación del subsistema, en el menú Edit seleccionamos Undo. Se puede revertir un subsistema que posteriormente a su creación se haya editado. Los únicos cambios que no se pueden revertir son aquellos cambios numéricos (no gráficos). SIMULINK envía un mensaje de advertencia cuando hay el riesgo de esto. EJEMPLO 8.6 Generación de un subsistema Ahora crearemos un subsistema usando un bloque de subsistema. Este bloque se encuentra en la biblioteca de Ports & Subsystems con el nombre de Subsystem. Para empezar abrimos una ventana para un modelo nuevo. Arrastramos a esta ventana el bloque de Subsystem para que nuestro modelo quede como en la figura 8.23. Hacemos doble pulsación sobre este bloque con lo que se abre la ventana de la figura 8.24a, en donde vemos que solamente existen puertos de entrada y salida unidos entre sí. Este sistema lo modificamos agregando un bloque de función de transferencia, un sumador (Sum), un bloque de ganancia y los conectamos como se muestra en la figura 8.24b. Regresamos a la ventana donde se creó el bloque de Subsystem y le conectamos un Scope, un generador de pulsos y un Mux para ver las señales de entrada y salida, como se muestra en la figura 8.25. Las señales de entrada y salida se muestran en la figura 8.26. Figura 8.23 Bloque para generar un subsistema. 8.4 S UB SISTEMAS 257 a) Figura 8.24 Subsistema creado, a) El subsistema que crea SIMULINK, b) nuestro subsistema. b) Figura 8.25 Sistema completo con señal de entrada de generador de pulsos. 258 8. SIMULINK Figura 8.26 Formas de onda de entrada y salida. Conclusiones En este capítulo dimos una introducción al uso de SIMULINK en la simulación de sistemas. A diferencia del uso de MATLAB donde sólo necesitamos conocer las ecuaciones del sistema para poder simularlo, con SIMULINK necesitamos conocer no sólo las ecuaciones del sistema sino también es necesario tener una idea de cómo podrían realizarse estas ecuaciones por un sistema físico para que junto con las ecuaciones del sistema formar nuestro modelo en SIMULINK. Adicionalmente, SIMULINK primordialmente realiza análisis en el dominio del tiempo con los toolboxes básicos. Aplicaciones en la Ingeniería En este capítulo presentamos aplicaciones de MATLAB en algunas áreas de las ingenierías. No pretendemos ser exhaustivos ya que las distintas ingenierías tienen especialidades tan extensas que harían imposible cubrirlas todas. Por lo tanto sólo damos ejemplos que ponen de manifiesto el potencial de MATLAB para encontrar aplicación y solución en un gran número de problemas. En algunos casos se hace uso de algunas toolboxes de MATLAB. Tal es el caso de los toolboxes de Matemáticas Simbólicas, Optimización, de Control y de Señales. 9.1 Aplicaciones en la Ingeniería Química EJEMPLO 9.1 Ecuaciones de una reacción química en el balance de material Una reacción química se lleva a efecto en una serie de cuatro reactores con agitadores como se muestra en la figura 9.1 V1 C A1 V2 C A2 V3 C A3 V4 C A4 K1 K2 K3 K4 C A1 Figura 9.1 C A2 C A3 1000 lit./h C A4 Serie de cuatro reactores con agitadores. La reacción química es una reacción irreversible de primer orden del tipo: ki A B Las condiciones de temperatura en cada reactor son tales que las constantes ki son diferentes en cada reactor. Adicionalmente, los volúmenes en cada reactor son también 261 262 9. A PLICACIONES EN LA I NGENIERÍA diferentes y sus valores se dan en la Tabla 9.1 Para resolver este sistema supongamos que 1) el sistema está en estado estable, 2) las reacciones están en la fase líquida, 3) el líquido no cambia de volumen ni de densidad y 4) el componente A desaparece en cada reactor a una velocidad de: Ri = Vik iC Ai Para cada reactor la ecuación general de balance de material en estado no estable es: Entrada = salida + material que desaparece por la reacción + acumulación Pero como el sistema está en estado estable, la acumulación es cero y la ecuación anterior se reduce a : Entrada = salida + material que desaparece por la reacción Para cada reactor esta ecuación es: 1000 (1) = 1000 C A1 + V1 k 1 C A1 1000 C A1 + 100 C A3 = 1100 C A2 + V2 k 2 C A2 1000 C A2 + 100 C A4 = 1200 C A3 + V3 k 3 C A3 1100 C A3 = 1100 C A4 + V4 k 4 C A4 1er reactor 2o reactor 3er reactor 4o reactor Usando los valores de Vi y ki de la Tabla 9.1, estas ecuaciones se convierten en: 1100 C A1 = 1000 1000 C A1 1400 C A2 + 100 C A3 = 0 1000 C A2 1240 C A3 + 100 C A4 = 0 1100 C A3 1250 C A4 = 0 Tabla 9-1 Parámetros de los reactores Reactor Vi ( litros) ki (h-1) 1 1000 0.1 2 1500 0.2 3 100 0.4 4 500 0.3 9.1 A PLICACIONES EN LA I NGENIERÍA Q UÍMICA 263 Este sistema de ecuaciones lineales simultáneas se puede resolver en MATLAB definiendo primero la matriz A y usando C = A\b como se muestra en el siguiente archivo-m: %Archivo9_1.m % Este archivo resuelve las ecuaciones de una % reacción química. % El vector b contiene la entrada neta % de material al sistema, la matriz A contiene % los coeficientes de las velocidades de % combinación de los componentes en % cada reactor. El vector c contiene las concentraciones % de salida de cada reactor clc clear close all b=[1000 0 0 0]’; A=[1100 0 0 0;... 1000 -1400 100 0;... 0 1100 -1240 100;... 0 0 1100 -1250]; % % La solución es fprintf(‘ La concentración de salida de cada reactor es:\n’) c=A\b El resultado que se ve en la ventana de trabajo de MATLAB es: La concentracion de salida de cada reactor es: c= 0.9091 0.6969 0.6654 0.5856 EJEMPLO 9.2 Transferencia de masa Se desea calcular el flujo de vapor de agua que se evapora de un recipiente con agua a una temperatura de 25 °C a una presión de 1 atm. La distancia de la superficie del agua y la abertura del recipiente es de 0.4 m. El flujo de vapor de agua está dado por la ecuación de Bird: 264 9. A PLICACIONES EN LA I NGENIERÍA Nz = cD x cD x z=0 z 1 x 0 z donde NZ es el flujo de vapor de agua a un valor de z, el eje z es hacia arriba, c es la concentración total de la fase gaseosa, D es el coeficiente de difusión de agua en el aire, es la fracción molar del vapor de agua y x0 indica el valor de x en z = 0. La concentración no estacionaria, suponiendo que no hay flujo de aire en la abertura, se puede obtener con: x 1 erf(Z ) =C= x0 1+ erf donde Z= z 4Dt donde t es el tiempo y se obtiene de la solución de la ecuación no lineal de Nz. 1 x0 = 1+ [ (1 + erf ) exp ] 2 1 Para el sistema se tienen las siguientes constantes: D = 2.2 x 10-5 m2/s x0 = c= Psat (25o C) = 0.0312 Pi Pt 3 = 0.049 Kmol/m RT Para resolver este problema, primero calculamos de la ecuación de x0. Reescribimos dicha ecuación como: 1 1+ [ 2 ] ( 1+ erf ) exp ( ) 1 x0 = 0 la que ahora se puede definir en un archivo-m como: 9.1 A PLICACIONES EN LA I NGENIERÍA Q UÍMICA function fi_a = fi_b( x , x0 ) % Ecuacion no lineal para calcular fi global x0 fi_a = 1/( 1 + (sqrt( pi )*( 1 + erf( x ) )*x*exp( x^2 ))^(-1))-x0; El archivo para calcular el flujo de agua es: % Archivo Ejemplo9_2.m % Este archivo calcula el flujo de vapor de agua % por la abertura de un recipiente. close all clc clear global x0 syms z x0 = 0.0312; z0 = 0; c = 0.0409; t = [ eps: 20 :3600 ]; z0 = 0.1; %Distancia de la superficie del agua a la abertura. D = 2.2e-5; % Concentración de agua. x0 = 0.0312; % Fracción molar. % solución de la ecuación fi = fzero( ‘fi_b’, 1 ); x = x0*(1-erf(z./sqrt(4*D*t)))/(1 + erf( fi)); a = diff( x, z); zi= [0.1 0.2 0.3 ]; cc = subs( a, z, 0 ); for i = 1:3 b = subs( a, z, zi(i) ); xx = subs ( x, z, zi(i) ); N( i, : ) = -c*D*b-c*D*xx.*cc/(1-x0); end plot( t/60, N*3600*18*1000 ) legend( ‘z = 0.1’ , ‘z = 0.2’ ,’z = 0.3' ) xlabel( ‘tiempo ( min)’ ) ylabel( ‘N (gr/m2-hr)’ ) figure for i= 1:3; dd(i,:) = subs( x, z, zi(i) ); end 265 266 9. A PLICACIONES EN LA I NGENIERÍA plot ( t/60 , dd(1,:), t/60 , dd(2,:),’+’,t/60 , dd(3,:),’*’) legend( ‘z = 0.1’ , ‘z = 0.3’ ,’z = 0.3' ) xlabel( ‘tiempo ( min)’ ) ylabel( ‘Fraccion molar del vapor’ ) Las figuras 9.2 y 9.3 muestran el flujo de vapor de agua y la fracción molar de vapor de agua. Figura 9.2 Flujo contra tiempo. Figura 9.3 Fracción molar. 9.1 A PLICACIONES EN LA I NGENIERÍA Q UÍMICA EJEMPLO 9.3 267 Proceso de fermentación En el estudio de procesos de fermentación, dos parámetros importantes son la velocidad de evolución del CO2 y la velocidad de consumo de oxígeno (uptake rate). Estos se calculan de análisis experimentales de la entrada y salida de gases del fermentador, así como de las razones (velocidades) de flujo, temperatura y presión de los gases. El cociente de la velocidad de evolución de CO2 y velocidad de la entrada de O2 producen el cociente respiratorio el cual es un buen barómetro de la actividad metabólica del microorganismo. Además, las velocidades anteriores se pueden integrar para obtener las cantidades totales de CO2 producido y de O2 que se consume durante el proceso de fermentación. La tabla 9.2 proporciona un conjunto de datos de la fermentación de Penicilina Chrysogenum que es la base de las penicilinas antibióticas. Tabla 9-2 Tiempo Datos de la fermentación Vel. de evolución de CO2 140 141 142 143 144 145 146 147 148 149 150 15.72 15.53 15.19 16.56 16.21 17.39 17.36 17.42 17.60 17.75 18.95 Vel. de entrada de CO2 15.49 16.16 15.35 15.13 14.20 14.23 14.29 12.74 14.74 13.68 14.51 Estos datos forman tres vectores de datos. Para integrar los datos dados como un vector, MATLAB tiene el archivo trapz.m el cual solo necesita tener los datos de la función. De esta manera si CO2 es el vector de datos de la evolución de CO2 entonces la integral se obtiene con: CO2 total= trapz ( CO2 ) y para la velocidad de entrada del O2 trapz ( O2 ) El siguiente archivo-m realiza estas operaciones, 268 9. A PLICACIONES EN LA I NGENIERÍA % Este es el archivo Ejemplo9_3.m % Se calcula las cantidades del dióxido de carbono % producido y oxígeno consumido en un proceso % de fermentación. % Velocidad de evolución del CO2. CO2 = [ 15.72; 15.53; 15.19; 16.56; 16.21; ... 17.39; 17.36; 17.42; 17.60; 17.75; 18.95 ]; % Velocidad de consumo del oxígeno. O2 = [ 15.49; 16.16; 15.35; 15.13; 14.20;... 14.23; 14.29; 12.74; 14.74; 13.68; 14.51 ]; CO2_total = trapz(CO2) O2_total = trapz(O2) Lo que arroja los datos de salida CO2_total = 168.3450 O2_total = 145.5200 EJEMPLO 9.4 Solución de un sistema de reacción química Consideremos la reacción: k1 k2 A B C k3 Donde k1=1 min-1, k2=2 min-1, k3=3 min-1. Las concentraciones iniciales en t = 0 son: CA (0) = 1 CB (0) = 0 CC (0) = 0 9.1 A PLICACIONES EN LA I NGENIERÍA Q UÍMICA 269 La velocidad de formación de cada compuesto está dado por el siguiente sistema de ecuaciones diferenciales: dC A = k 1C A dt dCB = k 1C A k 2 CB + k 3 CC dt dCC = k 2 CB k 3 C C dt que en forma matricial se puede escribir como: ˙ = kC(t) C(t) donde: C A (t ) C(t ) = CB (t ) C (t ) C d C A (t ) dt d C˙ (t ) = CB (t ) dt d CC (t ) dt k 1 0 K = k 1 k 2 0 k2 0 1 0 0 k 3 = 1 2 3 k 3 0 2 3 Entonces para resolver este sistema de ecuaciones diferenciales, primero creamos un archivo-m en el que definimos las ecuaciones diferenciales con la función cpunto de la siguiente manera: function Cpunto = dc( t, C) global k Cpunto( 1 ) = -k( 1 )*C( 1 ) + k( 2 )*C( 2 ) ; Cpunto( 2 ) = +k( 1 )*C( 1 ) - k( 2 )*C( 2 ) - k( 3 )*C( 2 ) + k( 4 )*C( 3 ); Cpunto( 3 ) = k( 3 )*C( 2 ) - k( 4 )*C( 3 ); Cpunto=Cpunto’; 270 9. A PLICACIONES EN LA I NGENIERÍA Luego para resolver el sistema y graficar los perfiles de concentración creamos el siguiente archivo-m: % Este es el archivo Ejemplo9_4.m % Calcula los perfiles de concentración % de los componentes en una reacción % química. global k % Datos de entrada: %fprintf( ‘\Dame las constantes cinéticas\’ ) %k( 1 ) = input (‘ A->B , k1 = ‘); %k( 2 ) = input (‘ B->A , k2 = ‘); %k( 3 ) = input (‘ B->C , k3 = ‘); %k( 4 ) = input (‘ C->B , k4 = ‘);% %fprintf( ‘\Dame las concentraciones iniciales\’ ) %C0( 1 ) = input( ‘ Concentración inicial de A = ‘ ); %C0( 2 ) = input( ‘ Concentración inicial de B = ‘ ); %C0( 3 ) = input( ‘ Concentración inicial de C = ‘ ); %tmax = input( ‘ \Dame el tiempo máximo\ tmax = ‘); tmax=5;k=[1,0,2,3];C0=[1 0 0]; t = [ 0:.01:tmax ]; [ t, C ]= ode45( ‘dc’ , [ 0, tmax], C0); plot(t,C) xlabel( ‘ tiempo ( seg )’ ) ylabel( ‘Concentraciones’ ) legend( ‘CA’, ‘CB’ , ‘CB’ ) Figura 9.4 Perfiles de concentración para los componentes de la reacción. 9.2 A PLICACIONES EN S EÑALES Y S ISTEMAS 271 La figura 9.4 nos da las gráficas de los perfiles de concentraciones para los componentes A, B, y C. Nótese que en todo momento t: CA(0) + CB(0) + CC(0) = CA(t) + CB(t) + CC(t) que establece el principio de conservación de la energía. 9.2 Aplicaciones en Señales y Sistemas Los sistemas en Ingeniería frecuentemente se modelan por medio de una ecuación diferencial o de manera equivalente por una función de transferencia, de donde podemos obtener mucha información del sistema. Por ejemplo se puede cambiar la representación a variable de estado, se puede averiguar su estabilidad y su respuesta a un escalón o a un impulso así como su respuesta a la frecuencia. En esta sección describiremos algunas de estas aplicaciones. 9.2.1 Sistemas de segundo orden Consideremos la función de transferencia: 2 N(s) = n 2 2 s + 2n s + n Donde n y son la frecuencia natural y el coeficiente de amortiguamiento, respectivamente. Esta función de transferencia tiene aplicaciones en control y en filtrado analógico. EJEMPLO 9.5 Comportamiento de la función de transferencia de segundo orden Deseamos saber como es la respuesta de N(s) para n= 2 y = 10. Para estos valores, N(s) se describe como: N(s) = 4 2 s + 40 s + 4 Se puede obtener una gráfica de la magnitud y la fase con la instrucción bode la cual requiere como argumentos los coeficientes de los polinomios del numerador y denominador en orden descendente. Para nuestra función: 272 9. A PLICACIONES EN LA I NGENIERÍA num = [ 4 ] den = [ 1 40 4 ] Entonces con sólo escribir: bode ( num , den ) Obtenemos las gráficas de Bode de la figura 9.5. Note que las gráficas de Bode de N( s ) son gráficas de la magnitud y la fase de N( j ) contra la frecuencia . Figura 9.5 Gráficas de Bode. Ahora deseamos ver el comportamiento de la función pero para distintos valores del factor de amortiguamiento . Esto lo podemos hacer con for de la siguiente manera: % Este es el archivo Ejemplo9_5.m clc clear close all num = [1]; zeta = [ 0.1 0.2 0.3 0.4 ]; for i = 1:4; den=[1 2*zeta( i ) 1]; bode(num,den); hold on end hold off 9.2 A PLICACIONES EN S EÑALES Y S ISTEMAS 273 El resultado se muestra en la figura 9.6. Figura 9.6 EJEMPLO 9.6 Gráficas de Bode para distintos valores de . Respuesta al impulso y al escalón Para un sistema con función de transferencia N(s), la respuesta al escalón se puede obtener con el comando step cuyo argumento es la definición del sistema. Para N(s) dada por: N(s) = 1 2 s + s+1 la respuesta al impulso la obtenemos con: % Este es el archivo Ejemplo9_6a.m % calcula la respuesta al escalón % wn = 1 , zeta = 0.5. num=[1]; zeta = 0.5; den=[1 zeta 1]; step( num, den ) xlabel(‘tiempo’) ylabel(‘Respuesta al escalon’) 274 9. A PLICACIONES EN LA I NGENIERÍA con lo que se obtiene la figura 9.7. Figura 9.7 Respuesta al escalón. De manera similar a las gráficas de Bode, obtenemos la respuesta al escalón para los distintos valores de . El siguiente archivo-m nos da la figura 9.8, % Este es el archivo Ejemplo9_6b.m % calcula la respuesta al escalón para % distintos valores de zeta. clc clear close all num=[1]; for zeta=0.4:-0.1:0.1; den=[1 2*zeta 1]; t=(0:.1: 19.9); step(num,den,t); hold on; end xlabel(‘tiempo’) ylabel(‘Respuesta al escalon’) legend ( ‘zeta = 0.4’ , ‘zeta = 0.3’ ,’zeta = 0.2' ,... ‘zeta = 0.1’ ) hold off 9.2 A PLICACIONES EN S EÑALES Y S ISTEMAS Figura 9.8 275 Respuesta al escalón para distintos valores de . Una variación la podemos encontrar si las curvas de la figura 9.8 las dibujamos en una figura tridimensional. Esto lo podemos hacer usando el siguiente archivo-m y el resultado se muestra en la figura 9.9. % Este es el archivo Ejemplo9_6c.m % calcula la respuesta al escalón. clc clear close all num=[1]; i=1; y=zeros(200,3); for del=0.4:-0.1:0.1; den=[1 2*del 1]; t=(0:.1: 19.9); y(:,i)=step(num,den,t); i=i+1; end mesh(fliplr(y)) xlabel(‘zeta’) ylabel(‘tiempo’) zlabel(‘Respuesta al escalon’) 276 9. A PLICACIONES EN LA I NGENIERÍA Figura 9.9 Respuesta al escalón para diferentes valores de . Figura 9.10 Respuesta al impulso. Con solo cambiar impulse por step obtenemos la respuesta al impulso para la función de transferencia, la cual se muestra en la figura 9.10. El archivo-m que realiza esto es: % Este es el archivo Ejemplo9_6d.m % calcula la respuesta al impulso % wn = 1 , zeta = 1. clear clc close all num=[1]; zeta = 1; den=[1 zeta 1]; impulse( num, den ) xlabel(‘tiempo’) ylabel(‘Respuesta al impulso’) 9.2 A PLICACIONES EN S EÑALES Y S ISTEMAS EJEMPLO 9.7 277 Variables de estado, polos y ceros Una representación de un sistema, además de su representación con una función de transferencia, es con variables de estado. MATLAB tiene el comando tf2ss para convertir una representación de función de transferencia (tf) a variables de estado (ss). Consideremos la función de transferencia: 2 N(s) = s +8 s+2 3 2 s + 10 s + 20 s + 26 que en MATLAB la representamos como: num = [ 1 8 2 ] den = [ 1 10 20 26 ]; la representación en variables de estado se obtiene con: [ A, B, C, D ] = tf2ss ( num, den ) La representación en variables de estado es de la forma ẋ = Ax + Bu y = Cx + Du donde x, u, y son vectores de las variables de estado, de entradas y de salidas, respectivamente. A, B C, D son matrices que contienen la información del sistema. Si solamente hay una entrada, las matrices B y D se reducen a escalares. En forma desarrollada las ecuaciones de estado son x˙ 1 a 11 x˙ 2 a 21 M = . x˙ n1 . ˙ a n1 xn a 12 ........ ........ ........ ........ y 1 c 11 y 2 = c 21 . . y n c k 1 . . . . ........ a 1n x 1 b11........b1m u1 ........ a 2n x 2 b 21.........b 2m u2 . . ........ . . + . ........ . . . ........ a nn x n bn1.........bnm um . c 1n x 1 d11 . . x 2 . + . . . . . c kn x n dk 1 . . . . . d1m u1 . . . . . . . dkm um El caso más común es cuando sólo hay una entrada y una salida: 278 9. A PLICACIONES EN LA I NGENIERÍA x˙ 1 a 11 x˙ 2 = . . . x˙ n a n1 . a 1n x 1 b1 . . x 2 b 2 + u(t) . . . . . a nn x n bn . . . . x1 x2 . . c n ] + d u(t ) . x n y(t ) = [c 1 Para el sistema representado por la ecuación diferencial: 3 d y( t ) dt 3 2 +4 d y dt 2 +3 dy + 5y = 10 u(t ) dt como es una ecuación de tercer orden, existen tres variables: x 1 = y, x 2 = y˙ , x 3 = y˙˙ Entonces podemos escribir para esta ecuación diferencial ˙˙˙ y = x˙ 3 = 10u 4 x 3 3x 2 5x 1 con lo que finalmente x˙ 1 = x 2 x˙ 2 = x 3 x˙ 3 = 5x 1 3x 2 4 x 3 + 10u Además, y = x1 En forma matricial: x˙ 1 0 1 0 x 1 0 x˙ 2 = 0 0 1 x 2 + 0 u x˙ 5 3 4 x 10 3 3 x1 y(t) = 1 0 0 x 2 x 3 [ ] 9.2 A PLICACIONES EN S EÑALES Y S ISTEMAS 279 que se puede escribir como ẋ = Ax + Bu T u=c x donde 0 1 0 0 1 A = 0 0 1 , B = 0 , c = 0 5 3 4 10 0 Consideremos la función de transferencia 2 N(s) = s + 8s + 2 3 2 s + 10s + 20s + 26 que en MATLAB la representamos como num = [ 1 8 2 ]; den = [ 1 10 20 26 ]; La representación en variables de estado se obtiene con el comando tf2ss (transfer function to state variable) [ A, B, C, D ] = tf2ss( num, den ) El resultado es A= -10 -20 -26 1 0 0 0 1 0 B= 1 0 0 C= 1 D= 0 8 2 280 9. A PLICACIONES EN LA I NGENIERÍA Podemos regresar a la representación de función de transferencia usando el comando ss2tf ( state variable to transfer function) [ num, den ] = ss2tf( A, B, C, D ) que nos regresa los coeficientes de la función de transferencia num = 0 1.0000 8.0000 2.0000 den = 1.0000 10.0000 20.0000 26.0000 También podemos obtener la representación en términos de polos y ceros de la función de transferencia con [ z , p ] = ss2tf( A, B, C, D ) donde z nos da el vector con los ceros y p el vector con los polos. En este caso [ z , p ] = ss2tf( A, B, C, D ) para obtener z= 0 1.0000 8.0000 2.0000 p= 1.0000 10.0000 20.0000 26.0000 EJEMPLO 9.8 Solución de la ecuación matricial de variables de estado MATLAB permite resolver la ecuación diferencial ẋ = Ax + Bu y = Cx + Du por medio de la instrucción lsim con el formato [ y, x ] = lsim [ A , B, C, D, t ] Por ejemplo para el sistema 9.2 A PLICACIONES EN S EÑALES Y S ISTEMAS 281 0 1 1 1 0 A=0 0 1 , B = 1 , C = 1 , D = 0 6 11 6 11 0 si se desea indicar condiciones iniciales entonces simplemente agregamos el vector de condiciones iniciales x0 al final de la instrucción lsim (“elesim”) como en [ y, x ] = lsim [ A, B, C, D, t, x0 ] Podemos obtener la solución para x( t ), y( t ) en el caso de un escalón unitario de entrada con condiciones iniciales cero y con condiciones iniciales distintas de cero, x0 = [ 1 0 -0.5 ], con el siguiente archivo-m: % Este es el archivo Ejemplo9_8.m % Resuelve las ecuaciones de estado. A = [ 0 1 0 ; 0 0 1 ; -6 -11 -6 ]; B = [ 1 ; 1 ; 1 ]; C = [ 1 1 0 ]; D = 0; t = [ 0 : 0.05 : 4 ]; U = ones ( 1 , length ( t )); [ y, x ] = lsim( A, B, C, D, U, t ); subplot ( 2, 1, 1 ) plot ( t, x, t, y ) xlabel( ‘ Tiempo ( seg) - Con. inic = 0’ ) ylabel ( ‘ Variables de estado’ ) legend ( ‘x1’, ‘x2’, ‘x3’, ‘y’ ) title ( ‘ Solucion numerica de las ecs. de variables de estado’ ) % solución con condiciones iniciales x0 = [ 1 0 -0.5 ]’; [ y, x ] = lsim( A, B, C, D, U, t , x0 ); subplot ( 2, 1, 2 ) plot ( t, x, t, y ) xlabel( ‘ Tiempo ( seg) - Cond. inic = x0’ ) ylabel ( ‘ Variables de estado’ ) legend ( ‘x1’, ‘x2’, ‘x3’, ‘y’ ) Las soluciones x y la salida y se grafican en la figura 9.11. 282 9. A PLICACIONES EN LA I NGENIERÍA Figura 9.11 EJEMPLO 9.9 Variable de estado del sistema del Ejemplo 9.8. Magnitud de una función en el plano complejo Consideremos la función de transferencia 2 N(s) = s +3 2 s + s +1 Esta función tiene dos polos localizados en 1 3 p12, = ± j 2 2 y dos ceros sobre el eje j en z 12, = ±j 3 La magnitud N( j) la podemos graficar de manera tridimensional en el plano complejo s con s = + j. Para lograr esto primero debemos obtener una rejilla para los valores de y para después obtener las partes real e imaginaria del numerador y denominador de la función. Finalmente, la magnitud de N se grafica con la instrucción mesh. El siguiente archivo-m realiza esto y el resultado se muestra en la figura 9.12. En esta figura se observa cómo en las frecuencias de los polos la magnitud tiende a crecer hasta valores muy grandes y también que en los ceros la magnitud vale cero. 9.2 A PLICACIONES EN S EÑALES Y S ISTEMAS 283 El archivo completo es % Este es el archivo Ejemplo9_9.m % Grafica la magnitud tridimensional de una % función N(s). clear clc close all % La variable compleja es sigma+j*omega. % s = sigma, w = omega. w = linspace(-5,5,50);% variable omega s = linspace(-5,5,50);% variable sigma [S,W] = meshgrid(s,w); red=S.^2-W.^2+S+1;% parte real del denominador. im2=2*S.*W+W; % parte imaginaria del denominador. den=red+j*im2; % denominador. ren=S.^2-W.^2+3; % parte real del numerador. imn=-2*S.*W; % parte imaginaria del numerador. num=ren+j*imn; % numerador N=abs(num)./abs(den); % magnitud de la función de transferencia. mesh( s, w, N ) ylabel( ‘omega’ ) xlabel( ‘sigma’ ) zlabel( ‘magnitud’ ) Figura 9.12 Magnitud de N(s). 284 9. A PLICACIONES EN LA I NGENIERÍA EJEMPLO 9.10 Sensitividades de una función de transferencia El estudio de la sensitividad es de vital importancia al seleccionar un circuito para realizar alguna función de filtrado. Para un circuito pasivo RLC se tiene la siguiente función de transferencia R L N(s) = R 1 2 s +s + L LC La sensitividad de una función F con respecto a x está definida por: F Sx = x F F x de modo que la sensitividad de N con respecto a R, L y C es N( s ) = R N(s) N(s) R N( s ) = L N(s) N(s) L N( s ) = C N(s) N(s) C SR SL SC Entonces podemos calcular la sensitividad con: syms R, L, C, s sens = ( R/ N ) * diff ( N, R ); La sustitución de R, L y C la podemos realizar con el comando subs que cambia la variable simbólica por un valor numérico con el formato sens_a = subs( sens, [ L, C, R ], [ 0.05, 0.05, 0.1 ]) Para graficarlas contra la frecuencia definimos un vector de frecuencias y sustituimos s por j* , obtenemos el valor absoluto y las graficamos. El archivo-m completo se muestra a continuación: % Este es el archivo Ejemplo9_10.m % Se calculan las sensitividades para % la función de transferencia de un circuito RLC. 9.2 A PLICACIONES EN S EÑALES Y S ISTEMAS 285 syms R L C s N = 50*(R/L)/( s^2 + s*R/L + 1/L/C ); NR = diff( N, R ); sens = ( R/N )*NR; w = [ eps : 0.1 : 30 ]; sens_a = subs( sens, [ L, C, R ], [ 0.05, 0.05, 0.1 ]); fprintf(‘ Sensitividad con respecto a R \’) pretty ( sens_a ) sens_b = subs ( sens_a, s, j*w ); NL = diff( N, L ); sens = ( L/N )*NL; sens_a = subs( sens, [ L, C, R ], [ 0.05, 0.05, 0.1 ]); fprintf(‘ Sensitividad con respecto a L \’) pretty ( sens_a ) sens_L = subs ( sens_a, s, j*w ); NC = diff( N, C ); sens = ( C/N )*NC; sens_a = subs( sens, [ L, C, R ], [ 0.05, 0.05, 0.1 ]); fprintf(‘ Sensitividad con respecto a C \’) pretty ( sens_a ) sens_C = subs ( sens_a, s, j*w ); NN=subs( N, [L,C,R], [ 0.05, 0.05, 0.1 ]) nnn=subs(NN,s,j*w); plot ( w, abs ( sens_b), w, abs ( sens_L), w, abs ( sens_C), w, abs(nnn) ) legend( ‘ Sens c.r a R ‘, ‘ Sens c.r a L ‘, ‘ Sens c.r a C ‘, ‘ Magnitud de N’ ) xlabel( ‘ frecuencia w (rad/seg) ‘ ) ylabel( ‘ sensitividades y magnitud de N’) Las sensitividades calculadas aparecen en la ventana de trabajo de MATLAB y son: Sensitividad con respecto a R (1 1000 s + 1 500 s + 2 5 2000 2 2 2 s +2s+400 (s +2s+400) 2 1000 s 286 9. A PLICACIONES EN LA I NGENIERÍA Sensitividad con respecto a L 40 s 8000 (1 2000 s + 1 1000 s + 1 5 100 2 2 2 2 (s +2s+400) (s +2s+400) 2 2000 Sensitividad con respecto a C 400 2 s +2s+400 Las gráficas de Bode de estas sensitividades y de la magnitud se muestran en la figura 9.13. Figura 9.13 Sensitividades y magnitud de un filtro pasivo RLC (la magnitud de N se ha escalado por 50). 9.2 A PLICACIONES EN S EÑALES Y S ISTEMAS EJEMPLO 9.11 287 Transformada de Laplace y de Fourier La transformada de Laplace de f(t) se define como L{f (t )} = F(s) = f(t)e dt st 0 donde f(t) es una función continua por secciones y está definida para todo tiempo t ! 0 es la variable compleja definida por s = + j . Por otro lado la transformada inversa es: f (t ) = 1 2j + j j st F(s)e ds MATLAB nos permite evaluar la transformada de Laplace directa e inversa usando los comandos laplace e ilaplace, respectivamente. Por ejemplo para las funciones f1(t ) = t 2 y f2 (t ) = e las transformadas de Laplace las obtenemos con: >> syms t a w >> f1 = t^2; >> f2 = exp( -a*t ); >> F1 = laplace( f1 ) >> F2 = laplace( f2 ) lo que nos da F1 = 2/s^3 F2 = 1/(s+a) Para las transformadas inversas de Laplace a t 288 9. A PLICACIONES EN LA I NGENIERÍA >> g1 = ilaplace( F1 ) >> g2 = ilaplace( F2 ) g1 = t^2 g2 = exp(-a*t) que son las funciones f1 y f2 definidas al principio. Una de las propiedades de la transformada de Laplace dice que si las condiciones iniciales son cero df (t ) L = sF(s) dt Entonces para la derivada de f1 su transformada de Laplace se obtiene con >> DF = laplace( diff( f1 ) ) DF = 2/s^2 que es la transformada de f1 dividida entre s, como se esperaba. De manera similar, la transformada de Fourier y su transformada inversa están definidas por: F{x (t )} = X() = x(t)e dt jt y 1 x (t ) = F {X()} = 1 2 X()e d jt Para evaluarlas en MATLAB usamos fourier e ifourier. Por ejemplo, para f1 definida anteriormente. >> F1 = fourier( f1 ) >> g1 = ifourier( F1 ) 9.2 A PLICACIONES EN S EÑALES Y S ISTEMAS 289 nos calcula la transformada directa F1 e inversa g1 de f1 como F1 = -2*pi*dirac(2,w) g1 = x^2 EJEMPLO 9.12 Transformada-z La transformada-z está definida para señales discretas x(n) por Z{x(n)} = C(z) = x(n)z n n=0 La transformada-z inversa es 1 X(n) = Z {X( z )} = 1 2j X(z)z dz n1 C En MATLAB se calculan con los comandos ztrans e iztrans, respectivamente. Por ejemplo para x( n) = a n >> syms a n >> x = a^n; >> X = ztrans( x ) >> y = iztrans( X ) con lo que obtenemos X= z/a/(z/a-1) y= a^n 290 9. A PLICACIONES EN LA I NGENIERÍA 9.3 Aplicaciones en Procesado Digital de Señales EJEMPLO 9.13 Convolución lineal La convolución lineal de dos señales discretas x1(n), x2(n) de duración finita está definida por y(n) = x (k )x (n k ) 1 2 k = MATLAB realiza una convolución usando el comando conv( x1, x2 ). Si x1 = [ 1 2 3 4 5] x2 = [ 4 3 2 1 ] entonces la convolución de x1 y x2 es x3 = conv (x1, x2) >> x1 = [ 1 2 3 4 5]; >> x2 = [ 4 3 2 1 ]; >> x3 = conv ( x1 , x2 ); >> long_x3 = length ( x1 ) + length ( x2 ) - 1; >> stem ( x3 ) >> xlabel ( ‘Tiempo n’ ) >> ylabel( ‘x’ ) Figura 9.14 Secuencia x3 resultante de la convolución de x1 y x2. 9.3 A PLICACIONES EN P ROCESADO D IGITAL DE S EÑALES 291 que nos da x3 como x3 = 4 11 20 30 40 26 14 5 y su gráfica está dada en la figura 9.14. EJEMPLO 9.14 Transformada discreta de Fourier La transformada discreta de Fourier de una señal x(n) de longitud N se define por N1 X(k ) = j2 kn N k = 0, 1,...., N x (n)e n=0 La transformada inversa es N1 1 x (n) = N j 2 k m N X( k ) e m = 0, 1,...., N K =0 Las instrucciones fft e ifft realizan estas operaciones en MATLAB. Por ejemplo: para la secuencia de longitud N1= 10 # % %1 X 1(n) = $ %0 % & 0"n<5 5"n" 9 con el siguiente archivo graficamos la secuencia x1( n ), calculamos su transformada discreta de Fourier y la graficamos. La secuencia x1 y la transformada de Fourier se muestran en la figura 9.15. % Este es el archivo Ejemplo9_14a.m % Calcula la transformada discreta de Fourier % de una secuencia y la grafica. clear clc close all x1 = [ 1 1 1 1 1 0 0 0 0 0 ]; 292 9. A PLICACIONES EN LA I NGENIERÍA subplot ( 2, 1, 1 ) stem( x1 ) X1 = fft ( x1 ); k=[0:1:9] subplot ( 2, 1, 2 ) stem ( k, X1 ) Figura 9.15 Secuencia x1 y su transformada discreta de Fourier. Figura 9.16 Convolución circular. Los ejes se han cambiado con el editor de ejes con Edit➔Axes properties. 9.3 A PLICACIONES EN P ROCESADO D IGITAL DE S EÑALES 293 La convolución circular se obtiene multiplicando la transformada discreta de Fourier de 2 secuencias. Por ejemplo, si x1=[1 2 3 4] y x2=[4 3 2 1] su convolución circular se muestra en la figura 9.16 y se obtiene con el siguiente archivo-m: % Este es el archivo Ejemplo9_14b.m % Calcula la convolución circular de dos secuencias x1 y x2 % por medio de la transformada discreta de Fourier. % close all clc clear x1 = [ 1 2 3 4 ]; x2 = [ 4 3 2 1 ]; X1 = fft( x1 ); X2 = fft( x2 ); y = ifft( x1.*x2 ); subplot( 3, 1, 1 ) stem ( X1 ) subplot( 3, 1, 2 ) stem ( X2 ) subplot( 3, 1, 3 ) stem ( y ) La convolución lineal se obtiene usando la convolución circular pero extendiendo la longitud de las secuencias a N1+N2-1. Entonces para estas mismas secuencias: % Este es el archivo Ejemplo9_14c.m % Calcula la convolución circular de dos secuencias x1 y x2 % por medio de la transformada discreta de Fourier. % close all clear clc x1=[1 2 3 4]; x2=[4 3 2 1]; subplot( 2, 2, 1 ) stem ( x1 ) xlabel( ‘n’ ) ylabel( ‘x1’ ) subplot( 2, 2, 2 ) stem ( x2 ) xlabel( ‘n’ ) 294 9. A PLICACIONES EN LA I NGENIERÍA ylabel( ‘x2’ ) longitud = length(x1)+length(x2)-1; X1=fft(x1,longitud) X2=fft(x2, longitud) Y=X1.*X2 y=ifft(Y, longitud ) subplot( 2, 2, 3 ) stem( y ) ylabel( ‘y por FFT’ ) xlabel( ‘n’ ) y1= conv( x1, x2 ) subplot( 2, 2, 4 ) stem( y1 ) xlabel( ‘n’ ) ylabel( ‘y por convolucion’ ) El resultado se observa en la figura 9.17. Figura 9.17 Convolución realizada por dos métodos. 9.3 A PLICACIONES EN P ROCESADO D IGITAL DE S EÑALES EJEMPLO 9.15 295 Respuesta en frecuencia Para obtener y graficar la respuesta en frecuencia de una función de transferencia N(z) usamos freqz. Los argumentos son los coeficientes de los polinomios del numerador y denominador de N(z). Por ejemplo para 2 N( z ) = z + 2z + 1 2 z 0.75z + .25 podemos usar freqz como >> num = [1 2 1]; >> den = [1 -0.75 0.25 ]; >> w = [ 0 : 0.1 : pi/2 ]; >> freqz (num , den , w ) Con esto se obtiene la figura 9.18. Figura 9.18 Respuesta en frecuencia. 296 9. A PLICACIONES EN LA I NGENIERÍA Con la instrucción filter (disponible en el paquete de Signal Procesing) podemos filtrar una señal. Por ejemplo para % Este es el archivo Ejemplo9_15.m % Filtra una señal x( n ) clc clear close all num = [1 2 1]; den = [1 -0.75 0.25 ]; w = [ 0 : 0.1 : pi/2 ]; m=[0:1:10]; x1 = cos ( 10*m ); x2 = cos ( 100*m ); x3 = cos ( 1000*m ); x = x1 + x2 + x3; y = filter( num, den , x ); subplot( 2, 1, 1 ) stem( x ) xlabel( ‘ n’ ) ylabel( ‘x(n)’ ) subplot( 2, 1, 2 ) stem ( y ) xlabel( ‘ n’ ) ylabel( ‘y(n)’ ) Figura 9.19 Filtrado de una señal x(n) para producir y(n). 9.4 A PLICACIONES EN C ONTROL 297 9.4 Aplicaciones en Control En esta seción presentamos algunas aplicaciones de MATLAB en sistemas de control. MATLAB cuenta para esto con un toolbox de control. EJEMPLO 9.16 Estabilidad de un sistema de retroalimentación MATLAB cuenta con el paquete CONTROL TOOLBOX que permite realizar una gran cantidad de funciones para sistemas retroalimentados. Por ejemplo, consideremos el diagrama de la figura 9.20 Figura 9.20 Diagrama de Bloques de una planta con retroalimentación. La planta se define en MATLAB con: nump = [1]; denp = [1 1 2 1]; planta = tf(nump,denp) con lo que MATLAB nos da como salida Transfer function: 1 s ' 3+ s ' 2 + 2 s + 1 Si la ganancia del sistema es K=1, el sistema con retroalimentación negativa se define con sistema = feedback(planta,[1]) con lo que obtenemos la función de transferencia del sistema como 298 9. A PLICACIONES EN LA I NGENIERÍA 1 s ' 3+ s ' 2 + 2 s + 2 Para verificar la estabilidad del sistema obtenemos los polos con polos = pole(sistema) para obtener polos = 0.0000 + 1.4142i 0.0000 - 1.4142i -1.0000 Vemos que este sistema tiene un polo en -1 y un par de polos sobre el eje j en +1.4142i y por lo tanto es inestable. Podemos averiguar más sobre la estabilidad de este sistema obteniendo su root locus, que es una gráfica del lugar geométrico de los polos del sistema contra la ganancia K. El root locus lo podemos calcular con rlocus( planta ) con lo que obtenemos la figura 9.21. Usando el cursor y presionándolo dos veces sobre un punto cercano al eje j vemos que para un valor de K<1 el sistema es estable pero para K>1 el sistema es inestable. Figura 9.21 Root locus de un sistema retroalimentado. 9.4 A PLICACIONES EN C ONTROL EJEMPLO 9.17 299 Comparación de métodos de compensación Consideremos la planta Gp (s) = 1 s(s + 1)(s + 4) El objetivo es comparar los diferentes métodos de control para optimizar alguno de los parámetros de la respuesta tales como el tiempo de subida, el tiempo de establecimiento, sobretiro, etc. Suponiendo que el tiempo de establecimiento es el importante podemos comparar tres métodos distintos: controlador proporcional, adelanto de fase y PID. Primeramente verificamos la respuesta de la planta con retroalimentación unitaria y sin compensador. Esto lo hacemos con el siguiente archivo-m: % Este es el archivo Ejemplo9_17a.m % Calcula la respuesta al escalón para % una planta usando retroalimentación unitaria % y con compensación proporcional. nump = [ 1 ]; demp = [ 1 5 4 0 ]; % Definimos la planta planta = tf ( nump , demp ); % Definimos el sistema sist = feedback (planta , [ 1 ] ); %checamos los polos pole ( sist ) %checamos la respuesta al escalón t = [ 0 : 0.1 : 40 ]; step ( sist , t ) con lo que obtenemos la figura 9.22 donde vemos que el tiempo de subida es Tr = 7.41 seg y que el tiempo de establecimiento es Ts * 8.67 seg y que no hay sobretiro. Ahora vamos a usar el controlador proporcional con ganancia K como se muestra en la figura 9.23 300 9. A PLICACIONES EN LA I NGENIERÍA Figura 9.22 Respuesta al escalón sin controlador. 1 G(s)= s(s+4)(s+1) + K Figura 9.23 Planta con controlador proporcional. Figura 9.24 Root locus de sistema con controlador proporcional. 9.4 A PLICACIONES EN C ONTROL 301 Si realizamos una análisis de root locus con rlocus(nump,demp) obtenemos la gráfica de la figura 9.24 donde vemos que para K = 20 se obtienen los polos sobre el eje j y para K > 20 el sistema se vuelve inestable. La función de transferencia se puede obtener con sist = feedback ( K*planta , [ 1 ] ); Definimos el vector de ganancia con K en el rango de estabilidad como: K=[ 0 : 2 : 20 ]; Ahora con este archivo-m calculamos la respuesta al escalón del sistema con compensador proporcional. % Este es el archivo Ejemplo9_17b.m % Calcula la respuesta al escalón para % una planta con controlador proporcional. clear clc close all nump = [ 1 ]; denp = [ 1 5 4 0 ]; planta = tf( nump, denp ); t = [ 0 : 0.1 : 30 ]; K=[ 0 : 2 : 20 ]; for i = 1: length(K) ; sist = feedback ( K ( i )*planta , [ 1 ] ); step ( sist , t ) hold on end hold off Figura 9.25 Respuesta al escalón para ganancias K entre 1 y 20. 302 9. A PLICACIONES EN LA I NGENIERÍA Al correr este programa obtenemos la figura 9.25. Ahí vemos que para valores de K cercanos a 20 se obtiene el mejor tiempo de subida pero el tiempo de establecimiento es peor al igual que el sobretiro. Entonces repetimos el análisis pero para valores de K entre 1 y 4, que se realiza con el archivo Ejemplo9_17c. Obtenemos la gráfica de la figura 9.26. Ahí vemos que para K = 2, se obtiene Ts * 7.8 seg y Tr * 3.6 seg mientras que para K = 3 se obtiene Ts * 6.46 y Tr * 2.7 seg. % Este es el archivo Ejemplo9_17c.m % Calcula la respuesta al escalón para % una planta usando retroalimentación unitaria % y con compensación proporcional. clc clear close all nump = [ 1 ]; denp = [ 1 5 4 0 ]; planta = tf( nump, denp ); k = [ 1: 1 :4 ]; for i = 1 : 4; sist = feedback( k(i)*planta, [1] ); step( sist ) hold on end legend( ‘ K=1’, ‘K=2’, ‘K=3’, ‘K=4’ ) hold off grid on Ahora probamos un controlador proporcional-derivativo (PD) cuya función de transferencia es GC (s) = K P + K ds = K P s + Kd KP de modo que la función de transferencia de la planta y controlador en cascada es Kd KP GC (s)GP (s) = s(s + 1)(s + 4) KP s + Con el siguiente archivo-m investigamos su respuesta al impulso para Kp=4, 9.4 A PLICACIONES EN C ONTROL 303 Figura 9.26 Respuesta al escalón para distintos valores de K. % Este es el archivo Ejemplo9_17d.m % Calcula la respuesta al escalón para % una planta % con compensación proporcional derivativa. close all clear clc Kp= 4; KD=[2:1:4] for I = 1:3; nump = [ Kp KD(I)]; denp = [1 5 4 0 ]; planta = tf( nump, denp ); sist = feedback( planta, [1] ); step( sist ) KD(I) hold on end legend(‘KD = 2’, ‘KD = 3’, ‘KD= 4’ ) hold off grid on 304 9. A PLICACIONES EN LA I NGENIERÍA que nos da la figura 9.27 Figura 9.27 Respuesta al escalón para sistema retroalimentado con controlador PD. y que para KD = 4 nos da una Tr=1.9 seg y Ts= 2.25 seg, además de no tener sobretiro. EJEMPLO 9.18 Control del Telescopio espacial Hubble Un modelo del telescopio espacial Hubble que se encuentra en órbita alrededor de la tierra, junto con un sistema posicionador se muestra en la figura 9.28 Figura 9.28 Modelo del telescopio espacial Hubble. 9.4 A PLICACIONES EN C ONTROL 305 El objetivo es encontrar valores de K1 y K tal que el sobretiro de una entrada escalón r(t) es menor o igual al 5 %, que el error se minimiza cuando r(t) es una rampa y que el efecto de un escalón de perturbación también se reduce. El sistema tiene dos entradas, R(s) y P(s), con lo que: Y(s) = KG(s) G(s) R(s) + P(s) 1+ KG(s) 1+ KG(s) El error E(s) está dado por: E(s) = 1 G(s) R(s) P(s) 1+ KG(s) 1+ KG(s) Primero buscamos satisfacer el requisito del sobretiro de 5%. Para esto sólo tomamos en cuenta el sistema de la entrada a la salida para una entrada de escalón de amplitud A como: Y(s) K G(s) K K = = = 2 R(s) 1+ K G(s) s(s + K 1 ) + K s + K 1s + K Para un sobretiro de 5 % se necesita seleccionar = 0.7. Para una rampa r(t)= Bt, el error de estado estacionario está dado por: R e ee = lim s0 B B = s K G(s) K / K 1 Y para una perturbación de escalón unitario: R e ee = lim s0 1 1 = s (s + K ) + K K Para que el error debido a la perturbación se pueda reducir necesitamos aumentar k. También para reducir el error de estado estacionario cuando la entrada es una rampa se necesita aumentar k / k1. Además se requiere = 0.7. La ecuación característica es: 2 2 2 2 s + 2ns + n = s + K 1s + K = s + 2 ( 0.7)ns + K De modo que n = K y K1= (0.7) n, de donde K 1 = 1.4 K . Por lo tanto: 306 9. A PLICACIONES EN LA I NGENIERÍA K K K K = = = K 1 1.4 K 1.4 2 Si K = 36, K 1 = 1.4 6 = 8.4 y K/K1 = 36/8.4 = 4.28 y si K = 100, K1= 1.4, la respuesta al escalón para r(t) y para la perturbación se muestra en la figura 9.62. % Este es el archivo Ejemplo9_18.m % Se evalúa el comportamiento del telescopio Hubble. clear clc close all % Primero se calcula la planta. K = 100; K1 = 14; nump = [ 1 ]; denp = [ 1 K1 0 ]; % función de transferencia desde r(t) planta = tf( nump, denp ) % función de transferencia desde r(t) sistema = feedback ( K*planta, [ 1 ] ) % perturbación % función de transferencia desde la perturbación perturbacion = feedback ( planta, [ K ] ) step ( sistema ) hold on step ( perturbacion ) hold off Figura 9.29 Respuesta del sistema del telescopio Hubble. 9.4 A PLICACIONES EN C ONTROL EJEMPLO 9.19 307 Control del ángulo de inclinación de una aeronave* Se desea controlar el ángulo de inclinación de una aeronave como se muestra en la figura 9.30a. a) b) Figura 9.30 Sistema de control del ángulo de inclinación de una aeronave. a) Definición del ángulo de inclinación, b) Sistema de control. La figura 9.30b muestra el lazo de alimentación unitario del control de ángulo de un Jet, donde para la planta Gp (s) = (s + 6)(s + 15) s(s + 3 12j)(s + 3 + 12j) y para el sistema del alerón Galerón (s) = 4000 (s + 8) se desea diseñar un compensador que cumpla con estas especificaciones: a) Constante de error de velocidad Kv >= 130. b) Sobretiro Mp < 15% c) Tiempo del primer máximo Tp < 0.7s Para hacer uso de otras funciones de MATLAB se resolverá este problema utilizando variables de estado. Se define el sistema en términos de los polos, ceros y ganancia tomando en cascada las expresiones Gp y Galerón Z = [ -6 -15 ]; P = [ -8 -3+12i -3-12i K = 4000; * 0 ]; Este problema fue resuelto y programado por el Ing. Antonio Arízaga, estudiante de Maestría en Electrónica en la Universidad de las Américas, Puebla. 308 9. A PLICACIONES EN LA I NGENIERÍA Se transforma a variables de estado [ A, B, C, D ] = zp2ss( Z’, P’, K ) Dados Tp y Mp se encuentra el sistema de segundo orden que cumple con estos requerimientos. Tp =.5; Mp =.15; % sobretiro si = ( -log( Mp ) )/( sqrt( ( pi^2 ) + ( log( Mp ) )^2) ); wd = pi/tp; wn = wd/( sqrt( 1- ( si^2 ) ) ) [ NUM, DEN ] = ORD2( wn, si ) Se obtienen las raíces del denominador. r = roots( DEN ) El sistema es de cuarto orden por lo que se adicionan 2 polos más a las raíces del denominador los cuales serán 6 y 15 para cancelar los ceros del sistema y dejarlo de segundo orden polos = [ r(1) r(2) -15 -6 ] Definimos k como el vector de las ganancias de la retroalimentación de estados. k = acker( A, B, polos ) Hacemos la retroalimentación de estados Anueva = A -B*K El nuevo sistema queda definido como sys2 = ss( Anueva, B, C, D ) T = tf( sys2 ) Se cancelan los términos comunes. T = minreal( T ) Se verifica la respuesta al escalón step ( sys2 ) 9.4 A PLICACIONES EN C ONTROL 309 El error de estado estacionario es muy grande por lo que se hace necesario el uso de un integrador. La respuesta el escalón se eleva hasta 74. Para hacerla unitaria cambiamos por una ganancia k1 = 0.0135 lo que deja el sistema como sys2= sys2*k1 step(sys2) El archivo-m que realiza esto es % Este es el archivo Ejemplo9_19.m % Controla el ángulo para mantener horizontal un avión. % clear close all Z = [ -6 -15 ]; P = [ -8 -3+12i -3-12i 0 ]; K = 4000; [ A, B, C, D ] = zp2ss( Z’, P’, K ) Tp =.5; Mp =.15; % sobretiro si = ( -log( Mp ) )/( sqrt( ( pi^2 ) + ( log( Mp ) )^2) ); wd = pi/Tp; wn = wd/( sqrt( 1- ( si^2 ) ) ) [ NUM, DEN ] = ORD2( wn, si ) r = roots( DEN ) polos = [ r(1) r(2) -15 -6 ] k = acker( A, B, polos ) Anueva = A - B*k sys2 = ss( Anueva, B, C, D ) T = tf( sys2 ) T = minreal( T ) step ( sys2 ) k1 = 0.0135 sys2 = sys2*k1 step( sys2, 2.5) 310 9. A PLICACIONES EN LA I NGENIERÍA La respuesta al escalón se muestra en la figura 9.31 donde vemos que el primer máximo ocurre en 0.5 seg y el sobretiro es de 1.527-1.0023 = 15.04 %. Figura 9.31 Respuesta al escalón del sistema. 9.5 Aplicaciones en Electrónica EJEMPLO 9.20 Sumador digital (Full adder) La versatilidad de MATLAB se hace patente al manejar variables Booleanas definidas por MATLAB como lógicas. Una variable se vuelve lógica con sólo asignarle uno de los dos posibles valores True o False. Las variables lógicas pueden ser vectores o matrices. Las operaciones básicas con variables lógicas pueden ser NAND, OR y XOR, las cuales se realizan con & para nand, para nor, y xor para xor, respectivamente. Deseamos ahora realizar un sumador completo (full adder) usando dos medios sumadores (half adder). El circuito que realiza esto se muestra en la figura 9.32a y la realización de un medio sumador se muestra en la figura 9.32b. Un medio sumador se puede realizar por la siguiente función: 9.5 A PLICACIONES EN E LECTRÓNICA 311 function [ s c ] = medio_sum ( a, b ) % s es el bit de la suma y c es el carry resultante. % las entradas son los bits a y b. s = xor ( a , b ); c = a & b; La interconexión de los medios sumadores y la compuerta or se realiza con el siguiente archivo-m y la figura 9.33 muestra las formas de onda de salida. % Este es el Archivo Ejemplo9_20.m % Realiza un sumador completo a partir de medios sumadores. close all clc clear x = [0 0 0 0 0 0 true true true 0]; % entrada x. y = [ 0 0 0 true true 0 0 0 true true ]; % entrada y carry_en = [ 0 0 0 true true true 0 0 0 true ]; % carry de entrada. t=[0:1:9]; % vector de tiempos. [ s1 c1 ] = medio_sum ( x , y ); % Resultados del primer medio sumador. [ ss c2 ] = medio_sum ( carry_en , s1 );% Resultados del segundo medio % sumador. carry_sal = c2|c1; % carry de salida. subplot(5, 1, 1) plot(t, x ) axis([0 10 -1 2]) xlabel ( ‘entrada x’ ) subplot(5, 1, 2) plot(t, y ) axis([0 10 -1 2]) xlabel ( ‘entrada y’ ) subplot(5, 1, 3) plot(t, carry_en ) axis([0 10 -1 2]) xlabel ( ‘carry de entrada’ ) subplot(5, 1, 4) plot(t, ss ) xlabel ( ‘suma’ ) axis([0 10 -1 2]) subplot(5, 1, 5) plot(t, carry_sal ) xlabel ( ‘carry de salida’ ) axis([0 10 -1 2]) 312 9. A PLICACIONES EN LA I NGENIERÍA Ss C MS S1 A B Cs MS C1 a) A S B C b) Figura 9.32 Sumador completo. a) Diagrama de bloques, b) Medio sumador. Figura 9.33 Resultados de sumar las señales x, y y carry_en. 9.5 A PLICACIONES EN E LECTRÓNICA EJEMPLO 9.21 313 Análisis de MonteCarlo para un transistor en configuración de emisor común Consideremos el circuito de la figura 9.34. Para este circuito el punto de operación se obtiene de la siguiente manera: del lazo colector-emisor VCC = (RC + RE ) IC + VCE del lazo base-emisor VBB = RBIB + VBE + RBIB V cc 12 v RC 22 k + RB + VBB 4v Figura 9.34 _ 12 k . -=75 2N2222 RE 16 k Transistor en configuración de emisor común. Si suponemos que IC = IE, IE = - IB y VBE = 0.7 V, entonces de la segunda ecuación, ICQ = VBB VBE 4 0.7 4 0.7 3.3 = * = = 0.206 mA RB 12 K 16 K 16 K + RE + 16 K 75 De la primera ecuación, VCEQ = VCC (RC + RE ) ICQ = 4.4 V Ahora deseamos realizar un análisis de MonteCarlo. En este tipo de análisis los componentes del circuito varían aleatoriamente en una base estadística y el circuito se analiza con estos valores. Se generan conjuntos aleatorios de los parámetros y se construye el comportamiento estadístico del circuito. Por ejemplo, para un resistor el valor aleatorio se puede generar con: 314 9. A PLICACIONES EN LA I NGENIERÍA R = Rnom [ 1 + 2 / ( aleatorio – 0.5 ) ] Donde Rnom es el valor nominal de R y el ancho de la distribución es 2 / Rnom. La función rand genera números aleatorios uniformemente distribuidos entre 0 y 1. Supongamos que la tolerancia sobre VCC es de 5%, los resistores tienen tolerancias del 10% y - tiene tolerancia del 50%, todos sobre su valor nominal. VBE y VBB se mantienen fijos en sus valores nominales. Cada componente rige su comportamiento por las ecuaciones siguientes: VCC = 12 ( 1 + 0.1 rand – 0.5 ) R1 = 18000 ( 1 + 0.2 rand – 0.5 ) RC = 22000 ( 1 + 0.2 rand – 0.5 ) RE = 16000 ( 1 + 0.2 rand – 0.5 ) RB = 12000 ( 1 + 0.2 rand – 0.5 ) - = 75 ( 1 + rand – 0.5 ) El siguiente archivo–m calcula los puntos Q correspondientes a cada conjunto de valores y los grafica, % Este es el archivo Ejemplo9_21.m % Realiza un análisis de MonteCarlo % cuando algunos elementos varian de su valor nominal. clear clc close all VCC=12*(1+0.005*(rand(2000,1)-0.5)); RC=22e3*(1+0.05*(rand(2000,1)-0.5)); RE=16e3*(1+0.05*(rand(2000,1)-0.5)); RB=12e3*(1+0.05*(rand(2000,1)-0.5)); beta=75*(1+0.1*(rand(2000,1)-0.5)); VBB=4;VBE=0.7; for i=1:2000; ICQ(i)=(VBB-VBE)/(RB(i)/beta(i)+RE(i)); VCEQ(i)=VCC(i)-(RC(i)+RE(i))*ICQ(i); end a=[ICQ,VCEQ]; hist(ICQ) figure hist(VCEQ) 9.5 A PLICACIONES EN E LECTRÓNICA Figura 9.35 Variación de ICQ. Figura 9.36 Variación de VCEQ. 315 316 9. A PLICACIONES EN LA I NGENIERÍA En la figura 9.35 vemos que casi todos los resultados de ICQ estan muy cerca de 0.2mA mientras que en la figura 9.36 vemos que la mayoría de los análisis resultan en un valor de VCEQ alrededor de 4.2 volts. Las figuras 9.35 y 9.36 pueden variar ligeramente en otras máquinas ya que se usan números aleatorios. EJEMPLO 9.22 Cálculo de funciones trigonométricas usando el algoritmo CORDIC* La técnica de CORDIC (COrdinate Rotation DIgital Computer) es un algoritmo diseñado para realizarse en hardware binario y que solamente usa operaciones básicas como son sumas y corrimientos. Utiliza unidades de memoria y tablas de datos (Look Up Tables) previamente calculadas. Este algoritmo es capaz de calcular varias funciones incluyendo las trigonométricas, hiperbólicas, raíces y funciones logarítmicas, entre otras. Algoritmo General. Para entender este algoritmo, se describe el funcionamiento utilizando la figura 9.37, B y 2 A Y1 2 1 0 x2 Figura 9.37 * X1 Ángulos en el sistema CORDIC. Este ejemplo fue programado por el Ing. Daniel Ortega, estudiante de la Maestría en Electrónica de la Universidad de las Américas, Puebla. 9.5 A PLICACIONES EN E LECTRÓNICA 317 La diagonal OA está a un ángulo inicial de 1 que por simplicidad se elige igual a cero, la línea OB es la línea OA, pero con una rotación contraria a las manecillas del reloj de grados para llegar a un ángulo de 2, que es el ángulo de interés del cual obtendremos el seno y el coseno. Para el algoritmo CORDIC, esta rotación de 1 a 2 se hace en un número definido de pequeñas rotaciones cuyos ángulos se eligen de una manera conveniente, de forma que al sumar cada incremento de X y Y de cada pequeña rotación se obtendrá el cos 2 y el sen 2 respectivamente, claro, si se eligió 1 = 0. Siguiendo con el análisis matemático: dada cada rotación, la nueva coordenada X2,Y2 está relacionada con las coordenadas anteriores X1, Y1 en la forma siguiente: X2 = X1 * cos - Y1 * sin Y2 = X1 * sin + Y1 * cos De este par de ecuaciones que definen la transformación por rotación se deriva el algoritmo CORDIC. Las ecuaciones anteriores pueden reescribirse de la manera siguiente: X2 = cos * [ X1 - Y1 * tan ] Y2 = cos * [ X1 * tan + Y1 ] donde es el ángulo con el que estaremos rotando el vector inicial hasta llegar al ángulo de interés. Estos incrementos se eligen de tal forma que el valor tan es una potencia fraccional de 2, esto es, el valor de tan y el ángulo cambiará de la siguiente manera tan = {1/1 1/2 1/4 1/8 1/16 1/32 } = {45 26.56 14.03 7.12 3.57 1.78 } De esta manera se ha remplazado la multiplicación de tan por el uso de una rápida y sencilla operación de corrimiento. Estos valores son guardados en una pequeña memoria ROM o Look Up Table. Por otro lado el valor de cos que multiplicará a cada incremento, se reduce a una multiplicación final por un factor que tendrá el valor de la multiplicación de los cosenos, por ejemplo, para 5 iteraciones, se tendrá un factor de: cos(45)*cos(26.56)*cos(14.03)*cos(7.12)*cos(3.57)*cos(1.78) = 0.607352 Mas aún, para evitar la multiplicación de este valor al resultado final, se puede inicializar X con este valor, en lugar de 1. Finalmente haciendo esta consideración, sustituyendo tan por 2-1 en las ecuaciones de rotación, el algoritmo se puede representar por las siguientes ecuaciones: 318 9. A PLICACIONES EN LA I NGENIERÍA X(i+1)= X (i)-m*Y(i)*d(i)* 2-1 Y(i+1)=Y(i)-X(i)*d(i)* 2-1 Z(i+1)= Z(i)-d(i)*E(i) donde #% + sgn [Z( i )] d(i) = $ &% sgn [Z( i )] E(i) = arctan( i ) para modo de rotación para modo vectorial para seno y coseno y m depende también del tipo de operación que se quiere realizar, m = 1 para funciones trigonométricas, m = -1 para funciones hiperbólicas, o m = 0 para funciones aritméticas. El algoritmo CORDIC brevemente descrito aquí se ha realizado en SIMULINK y se muestra en la figura 9.38. El valor del ángulo se da en el bloque 1/z con la leyenda doble pulsación; aquí se ha dado el valor inicial de 60°, como se muestra en la figura 9.39, para obtener la respuesta en los bloques de seno y coseno. Figura 9.38 Sistema que realiza el algoritmo CORDIC para cálculo de seno y coseno. 9.6 A PLICACIONES EN I NGENIERÍA DE A LIMENTOS 319 Figura 9.39 Ventana para indicar el ángulo. 9.6 Aplicaciones en Ingeniería de Alimentos EJEMPLO 9.23 Interpolación de datos experimentales del proceso de freído de donas En el proceso de freído de donas a 180˚ se recabaron datos experimentales del proceso de transferencia de masa (Vélez y Sosa-Morales, 2003). En particular aquí consideramos el total de aceite ganado en las donas durante el proceso. Los datos experimentales se muestran en la Tabla 9.3. Los datos de la tabla se van a ajustar a una curva. Los autores reportan como la mejor aproximación a estos datos la ecuación OG = 1.313 + 10.160t - 0.001t2 Al realizar un ajuste de curvas en MATLAB podemos buscar distintos grados de los polinomios y observar que tan fino es el ajuste. El siguiente archivo-m realiza el ajuste de las curvas para polinomios de distintos grados. % Este es el archivo Ejemplo9_23.m % Realiza el ajuste de curvas para los datos del aceite % ganado durante el freido de donas a 180 grados. % Se usan grados 2 3 y 4. t=[0 15 30 45 60 75 90 105 120]; gain=[ 0 5 6 6.2 7.2 6.8 6.7 7.9 6.1]; stem(t,gain) hold on p2 = polyfit(t,gain,2) p3 = polyfit(t,gain,3) p4 = polyfit(t,gain,4) pp2= polyval(p2,t); 320 9. A PLICACIONES EN LA I NGENIERÍA pp3= polyval(p3,t); pp4= polyval(p4,t); plot(t,pp2,t,pp3,t,pp4) hold off legend( ‘datos’, ‘n=2’, ‘n=3’, ‘n=4’ ) xlabel( ‘Tiempo de freido -seg’ ) ylabel( ‘Aceite ganado (%) ‘ ) La salida en MATLAB al correr el archivo es: p2 = -0.0010 0.1576 1.3509 p3 = 0.0000 -0.0033 0.2604 p4 = -0.0000 0.0001 -0.0114 0.6354 0.4506 0.0857 Esto indica que los polinomios que se obtienen son: OG = 1, 3509 + 0.1576t 0, 004t 2 OG = 0.6354 + 0.2604t 0.0033t 2 n= 2 2 O = 0.0857 + 0.4506t 0.0114t + 0.0001t n= 3 3 n=4 Observaciones: 1) el caso para n = 2 es muy parecido al de la Ref.1; 2) aunque se pidió el resultado para un polinomio de grado 3, MATLAB sólo entrega un polinomio de segundo grado pero con distintos coeficientes y mejor ajuste para n = 3; 3) para n = 4 se obtiene un polinomio de grado 3 para el cual el ajuste es mejor como se observa en la figura 9.40. Figura 9.40 Datos experimentales y polinomios de ajuste. 9.6 A PLICACIONES EN I NGENIERÍA DE A LIMENTOS Tabla 9-3 EJEMPLO 9.24 321 Aceite ganado en el proceso de freído a 180o Tiempo de Aceite ganado freído (seg) % 0 0 15 5 30 6 45 6.2 60 7.2 75 6.8 90 6.7 105 7.9 120 6.1 Ley de Fick Cuando se agrega una gota de tinta en un vaso con agua se efectúa un proceso de difusión. Este y otros fenómenos están gobernados por las leyes de Fick. Si la difusión es en estado estable, la primera ley de Fick establece que el perfil de la concentración C(x) y el flujo de la difusión J, que es la masa transportada por unidad de área por unidad de tiempo están relacionadas por J = D dC dx Primera Ley de Fick donde D es el coeficiente de difusión. En esta ecuación suponemos que la difusión es en la dirección x. Si la difusión no es en estado estable, entonces la difusión está gobernada por la segunda ley de Fick, 2 C C = D 2 t x Segunda Ley de Fick donde C = C( x, t ) Una solución para esta ecuación es: 2 2 D Cx C0 6 1 = 2 2 exp n 2 Cs C0 n=1 n r 322 9. A PLICACIONES EN LA I NGENIERÍA donde Cs es la concentración superficial del material que se va a difundir, Co es la concentración inicial, Cx es la concentración a una distancia x de la superficie, D es el coeficiente de difusión, n es el número de términos que tomamos en la serie y r es la distancia de la difusión. Otra solución está dada por funciones error como Cx C0 x = 1 erf Cs C0 2 D t donde erf es la función error. La ley de Fick es usada para cálculos de contenido de humedad durante el proceso de secado en el periodo de deshidratación decreciente (Soriano y Vélez, 2003). En particular, se desea saber el contenido de humedad en el betabel después de ser sometido a un secado durante un tiempo t. El betabel se encuentra en forma de esferas de 2.5 cm de diámetro y las condiciones de operación del secador son: temperatura de 60° C, humedad de equilibrio de 0.066 y la inicial de 0.25 kgagua/kgss. La solución de la ecuación de Fick para este caso está dada por 2 2 D X Xe 6 1 = exp n 2 X i X e 2 n=1 n2 r donde D es la difusividad que para el betabel es de 710-10 m2/s. El siguiente archivo-m calcula las gráficas del contenido de humedad durante los primeros 60 segundos. La figura 9.41 muestra el resultado cuando se toman desde un solo término de la serie hasta 13 términos. De la figura 9.41 podemos apreciar que a partir del quinto término de la serie las curvas de humedad son casi iguales. % Este es el archivo Ejemplo9_24.m % Calcula el comportamiento, según la % ley de Fick, del secado de betabel. clear clc close all y=zeros(11,3601); Xi = 0.25; Xe = 0.066; x1 = (6/pi^2); t = [0:1:3600]; D = 7e-10; r = 1.25e-2; x = 0; 9.6 A PLICACIONES EN I NGENIERÍA DE A LIMENTOS 323 for n = 1:13; x = x+x1*(1/n^2)*exp(-n^2*D*pi^2*t/r^2); X = x*(Xi-Xe)+ Xe; y(n,:) = X; end plot ( t/60, y(1:2:13,:)) legend ( ‘n=1’,’n=3',’n=5',’n=7',’n=9',’n=11', ‘n=13’ ) ylabel( ‘Curvas de secado’ ) xlabel( ‘tiempo-minutos’ ) Figura 9.41 Curvas de secado para distinto número de términos de la serie. EJEMPLO 9.25 Transferencia de calor* Se requiere determinar la temperatura de puré de chícharo contenido en un recipiente cilíndrico que se calienta a cierta temperatura. El punto donde se desea calcular está una distancia r del eje del cilindro. Los recipientes cilíndricos de dimensiones finitas se modelan mediante las intersecciones de planos y cilindros infinitos, como se muestra en la figura 9.42. * Este ejemplo fue propuesto por el Dr. Jorge Welti Chanes, profesor del Departamento de Ingeniería Química y Alimentos de la Universidad de las Américas-Puebla. 324 9. A PLICACIONES EN LA I NGENIERÍA Figura 9.42 Intersección de planos paralelos y cilindro infinito. Para determinar la temperatura de un recipiente cilíndrico se puede proceder de la siguiente manera: primero se calcula la temperatura residual de un cilindro infinito de radio rm, la cual está dada por Ta T 2 cilindro = Ta Tb infinito rm m=1 J0 Bn r K 2 exp Bn rm 0Cprm2 2 kB B 1+ 2 n n J1(Bn ) 2 h rm rm donde Bn son las soluciones de mJ0 (B ) = BJ1 (B ). J0 y J1 son las funciones de Bessel de orden cero y uno, respectivamente. Después se calcula la temperatura residual de un volumen acotado por dos planos infinitos paralelos. En este caso Ta T 2 planos = Ta Tb infinitos rm paralelos n=1 r sen (Bn ) cos Bn K rd 2 exp Bn Bn + sen (Bn ) cos (Bn ) 0Cprd 2 donde la distancia entre los planos es 2rd y Bn son las soluciones de m cot B = B. La temperatura residual del cilindro finito está dada entonces por: Ta T T T T T = a × a planos cilindro cilindro Ta Tb finito Ta Tb infinito Ta Tb infinitos paralelos 9.6 A PLICACIONES EN I NGENIERÍA DE A LIMENTOS 325 Los parámetros son el coeficiente de transferencia de calor del vapor ho, la conductividad térmica del puré K, el calor específico del puré Cp, la densidad 0, la temperatura ambiente Ta y la temperatura del vapor Tv, dados por ho = 670 Btu 2 h × pie × °F Btu K = 0.48 libra × °F libras 0 = 68 3 pie Ta = 86 °F Tv = 240 °F El radio del cilindro es de 0.112 pies y la altura es de 0.167 pies. Las ecuaciones dadas antes se programan en el siguiente archivo-m: % Este es el archivo Ejemplo9_25.m % Este archivo calcula la temperatura en el eje de un cilindro de radio % rcm conteniendo puré de chícharo y calentandose a una temperatura % de Tcal grados Fahrenheit, la temperatura ambiente es Ta, % el tiempo de calentamiento es teta_cal y el come up time es teta_come_up clear close all clc b1(1) = fsolve(@funcion,1); b1(2) = fsolve(@funcion,5); b1(3) = fsolve(@funcion,10); b(1) = fsolve(@funcionbessel,1); b(2) = fsolve(@funcionbessel,5); b(3) = fsolve(@funcionbessel,10); rm = 0.167; % radio del stub rmc = 0.112;% radio del cilindro %r = 0.0; %distancia del eje del cilindro r = [0 : rmc/25 :rmc ]; 326 9. A PLICACIONES EN LA I NGENIERÍA K = 0.48; %conductividad térmica del slab ro = 68; % densidad Cp = 0.91;% calor específico del puré h = 670; %coeficiente de transferencia del vapor teta_cal = 20; % minutos teta_come_up = 5; teta = (teta_cal + 0.42*teta_come_up)/60; teta1 = [(0.42*teta_come_up)/60 : (teta-(0.42*teta_come_up)/60)/25 : teta ]; Ta = 86;% temperatura ambiente Tcal = 240;%temperatura del vapor jj = [1:3]; T = 0; Tc = 0; % CÁLCULOS PARA r VARIABLE DESDE EL CENTRO DEL CILINDRO % HASTA LA SUPERFICIE. % cálculos para el stub for kk = 1:length(r); T = 0; Ts = 0; for n= 1 :length(jj) ; Ts = 2*sin(b1(n))*cos(b1(n)*r(kk)/rm)/ (b1(n)+sin(b1(n))*cos(b1(n))); Ts = Ts*exp(-b1(n)^2*K*teta/(ro*Cp*rm^2)); T = T + Ts; %pause end TR(kk) = T; end %for ij = 1: %nn = n/rmc; % cálculos para el cilindro infinito for j = 1:length(r); Tc = 0; for n = 1:length(jj); 9.6 A PLICACIONES EN I NGENIERÍA DE A LIMENTOS Tcs = 2*besselj(0,b(n)*r(j)/rmc); Tcs = Tcs*exp((-b(n)^2)*K*teta/(ro*Cp*rmc^2)); Tcs = Tcs/((1+K^2*b(n)^2/ (h^2*rmc^2))*b(n)*besselj(1,b(n))/rmc); Tcs = Tcs/rmc; Tc = Tc + Tcs; end TCR(j) = Tc; end Ttotal = TR.*TCR; %format bank TT = Tcal-Ttotal*( Tcal-Ta ); plot(r,TT) xlabel(‘radio’) % CÁLCULOS PARA teta VARIABLE DESDE EL TIEMPO DE % COME UP HASTA EL TIEMPO TETA. % cálculos para el stub r1=0.03; for kk = 1:length(teta1); T1 = 0; Ts = 0; for n= 1 :length(jj) ; Ts = 2*sin(b1(n))*cos(b1(n)*r1/rm)/ (b1(n)+sin(b1(n))*cos(b1(n))); Ts = Ts*exp(-b1(n)^2*K*teta1(kk)/(ro*Cp*rm^2)); T1 = T1 + Ts; %pause end TR1(kk) = T1; end %for ij = 1: %nn = n/rmc; % cálculos para el cilindro infinito for j = 1:length(teta1); Tc1 = 0; for n = 1:length(jj); 327 328 9. A PLICACIONES EN LA I NGENIERÍA Tcs = 2*besselj(0,b(n)*r1/rmc); Tcs = Tcs*exp((-b(n)^2)*K*teta1(j)/(ro*Cp*rmc^2)); Tcs = Tcs/((1+K^2*b(n)^2/ (h^2*rmc^2))*b(n)*besselj(1,b(n))/rmc); Tcs = Tcs/rmc; Tc1 = Tc1 + Tcs; end TCR1(j) = Tc1; end Ttotal1 = TR1.*TCR1; %format bank TT1 = Tcal-Ttotal1*( Tcal-Ta ); figure plot(teta1*60,TT1) xlabel(‘tiempo’) % CÁLCULOS PARA teta Y r VARIABLES DESDE EL CENTRO DEL CILINDRO % HASTA LA SUPERFICIE Y DESDE EL TIEMPO DE % COME UP HASTA EL TIEMPO TETA. % cálculos para el stub for kkk= 1:length(r); for kk = 1:length(teta1); T1 = 0; Ts = 0; for n= 1 :length(jj) ; Ts = 2*sin(b1(n))*cos(b1(n)*r(kkk)/rm)/ (b1(n)+sin(b1(n))*cos(b1(n))); Ts = Ts*exp(-b1(n)^2*K*teta1(kk)/(ro*Cp*rm^2)); T1 = T1 + Ts; %pause end TR2(kk,kkk) = T1; end %for ij = 1: %nn = n/rmc; 9.6 A PLICACIONES EN I NGENIERÍA DE A LIMENTOS 329 % cálculos para el cilindro infinito for j = 1:length(teta1); Tc1 = 0; for n = 1:length(jj); Tcs = 2*besselj(0,b(n)*r(kkk)/rmc); Tcs = Tcs*exp((-b(n)^2)*K*teta1(j)/(ro*Cp*rmc^2)); Tcs = Tcs/((1+K^2*b(n)^2/ (h^2*rmc^2))*b(n)*besselj(1,b(n))/rmc); Tcs = Tcs/rmc; Tc1 = Tc1 + Tcs; end TCR2(j,kkk) = Tc1; end Ttotal2 = TR2.*TCR2; %format bank TT2 = Tcal-Ttotal2*( Tcal-Ta ); end figure mesh(teta1*60,r,TT2) xlabel(‘tiempo’) ylabel(‘radio’) Este archivo hace uso de las funciones funcion.m y funcionbessel.m que se encuentran en archivos separados: % Este es el archivo funcion.m function f=funcion(n); R = 250; M=3000; % capital acumulado deseado. p=4; % número de pagos por año. %np=2*p; % total de pagos en el plazo indicado. i=0.28; % interés anual. m=232; rm = 0.167; % radio del stub K = 0.48; %conductividad térmica del slab h = 670; %coeficiente de transferencia del vapor m=h*rm/K; f=m*cot(n)-n; %f=n-acot(n/m) 330 9. A PLICACIONES EN LA I NGENIERÍA % Este es el archivo funcionbessel.m function f=funcionbessel(n) R = 250; M=3000; % capital acumulado deseado. p=4; % número de pagos por año. %np=2*p; % total de pagos en el plazo indicado. i=0.28; % interés anual. m=232; rmc = 0.112; % radio del stub K = 0.48; %conductividad térmica del slab h = 670; %coeficiente de transferencia del vapor m=h*rmc/K; f=m*besselj(0,n)-n*besselj(1,n); %f=n-acot(n/m) Los resultados se muestran en las figuras 9.43, 9.44 y 9.45. La figura 9.43 muestra cómo varía la temperatura como función de la distancia radial a partir del eje del cilindro, después de calentar durante 43 minutos más el tiempo de precalentamiento de 5 minutos. La figura 9.44 muestra la variación de la temperatura del eje del cilindro con respecto al tiempo. El tiempo inicial de la gráfica es el tiempo de precalentamiento. La figura 9.45 muestra una gráfica tridimensional donde los ejes del plano horizontal son el tiempo de calentamiento y la distancia del eje del cilindro, mientras que el eje vertical muestra la temperatura. Figura 9.43 Gráfica de la temperatura con respecto a la distancia del eje del cilindro. 9.7 A PLICACIONES EN I NGENIERÍA I NDUSTRIAL 331 Figura 9.44 Gráfica de la temperatura del eje del cilindro con respecto al tiempo de calentamiento, a partir del tiempo de precalentamiento. Figura 9.45 Gráfica de la temperatura con respecto a la distancia del eje del cilindro y al tiempo. 9.7 Aplicaciones en la Ingeniería Industrial Estos Ejemplos de Ingeniería Industrial requieren tener instalado el paquete de optimización (Optimization toolbox). EJEMPLO 9.26 Optimización de Costos En una planta tratadora de agua uno de los procesos más importantes es la remoción de la turbiedad (materia suspendida) la cual se lleva a cabo agregando sustancias químicas que provocan el aglutinamiento de los sólidos suspendidos para formar partículas más grandes que se retiran por sedimentación. Las partículas que restan después de la sedimentación se extraen por filtración. Por lo general si se aumenta la dosis de químicos ocurre más aglutinamiento y hay mayor remoción de partículas por sedimentación. Esto significa que el filtro no tendrá que limpiarse por retrolavado con tanta frecuencia. Es decir entre más sustancias químicas se usen, menos retrolavado y menos agua se necesitarán. Se desea saber además cuál es la cantidad óptima de químicos para optimizar costos. 332 9. A PLICACIONES EN LA I NGENIERÍA Tabla 9-4 Datos experimentales Químicos (mg/l) Turbiedad 1 31 2 3 4.5 7.5 13 20 27 28 19 14 9 8 5 8 La turbiedad y la cantidad de químicos obtenidos experimentalmente se relacionan en la Tabla 9.4. Se aplica interpolación polinomial con la instrucción polyfit para n = 2. >> Q = [ 1 2 3 4.5 7.5 13 20 27 ]; >> T = [ 31 28 19 14 9 8 5 8 ]; >> P = polyfit( Q, T, 2 ) con lo que MATLAB produce: P= 0.0856 -3.0894 30.5223 que corresponde al polinomio T = 0.0856 Q2 - 3.0894 Q + 30.5223 La tasa de agua de retrolavado B en m3/1000 m3 se describe por la siguiente ecuación B = 0.5 + 1.7 T Sustituyendo la ecuación obtenida para la turbiedad en esta ecuación y multiplicada por el costo del agua que es de $0.05 /m3 obtenemos el costo del agua de retrolavado CB en $/1000 m3 dada por CB = 0.0073 Q2 - 0.2626 Q + 2.5694 Si el costo del químico de coagulación es Cc = 0.75 Q El costo total de la planta es CT = C B + CC 9.7 A PLICACIONES EN I NGENIERÍA I NDUSTRIAL 333 Graficando estas ecuaciones en MATLAB con el siguiente archivo-m vemos que el costo es mínimo para Q = 412 como se muestra en la figura 9.46. % Este es el archivo Ejemplo9_26.m % Calcula el costo óptimo de químicos para una planta % de tratamiento de agua. clear close all clc Q = [ 1 2 3 4.5 7.5 13 20 27]; T = [ 35 28 19 14 9 5 2 1 ]; a = polyfit( Q, T , 3 ) q = [1 : .1 :27]; aa=polyval(a,q); Cb= -0.5 + 1.7*aa; Cc = 0.75*q; CT = Cb + Cc; plot( q, CT, q, Cb, q, Cc) grid on legend( ‘CT’, ‘CB’, ‘Cc’ ) xlabel( ‘Químicos’ ) Figura 9.46 Curva de costo total, de dosis de coagulante y agua de retrolavado. 334 9. A PLICACIONES EN LA I NGENIERÍA EJEMPLO 9.27 Minimización de Costos En muchos problemas propios de negocios el objetivo es minimizar costos en lugar de incrementar la producción. Considérese la producción de tres distintos productos llamados Lucero, Luna y Sol. Estos productos se pueden fabricar en dos plantas: Planta A y Planta B. Para el siguiente año se tiene proyectado vender 5000 Luceros, 300 Lunas y 240 Soles. El departamento de contabilidad estima que los costos de producción diarios son $ 5000 para Planta A y $7000 para la Planta B. Sea: x1 = Número de productos en la Planta A x2 = Número de productos en la Planta B Además la producción diaria máxima en cada planta es Tabla 9-5 Producción en cada planta Producto Planta A Planta B Lucero 100 140 Luna 10 6 Sol 4 8 Debe de notarse que se deben producir 268 unidades diarias en total. Entonces se desea minimizar el costo C dado por la expresión: C = 5000x1 + 7000x2 sujeto a las restricciones: 100x 1 + 140x 2 ! 5000 10x 1 + 6 x 2 ! 300 4 x 1 + 8x 2 ! 240 x1 ! 0 x2 ! 0 ( Lucero ) ( Luna ) ( Sol ) MATLAB permite resolver este tipo de problemas usando el toolbox de optimización, para lo cual el conjunto de desigualdades 100 x1 140 x 2 " 5000 10 x1 6 x 2 " 300 4 x1 8 x 2 " 240 x1 " 0 x2 " 0 9.7 A PLICACIONES EN I NGENIERÍA I NDUSTRIAL r 335 r se plantea en forma matricial, Ax " b : 100 10 4 1 0 5000 140 6 x1 300 1 x " 240 8 2 0 0 0 1 La función a minimizar C debe escribirse como si fuera una función de MATLAB. Para este ejemplo se tiene function C = costo(x) C = 5000*x(1) + 7000*x(2); El archivo-m para minimizar esta función es % Este es el archivo Ejemplo9_27.m % Minimiza el costo de producir artículos en dos plantas. close all clear clc x0 = [ 1 ; 1 ]; % Valores iniciales de la solución. options = optimset(‘LargeScale’,’off’,’MaxIter’,200); warning off optim:fmincon:SwitchingToMediumScale lb=[ 1 ; 1 ]; ub=[ 114 ; 154 ]; A = [ -100 -140 ; -10 -6 ; -4 -8 ]; b = [ -5000 ; -300 ; -240 ]; x = fmincon( @costo, x0, A, b, [], [], lb, ub ) Los datos obtenidos en la ventana de trabajo de MATLAB son: x= 17.0811 23.5135 que corresponden a x1 = 17 y x2 = 24. 336 9. A PLICACIONES EN LA I NGENIERÍA EJEMPLO 9.28 Programación Meta En la programación meta no se busca maximizar o minimizar una función objetivo sino más bien minimizar las desviaciones entre las metas deseadas y los resultados reales de acuerdo a las prioridades asignadas. En otras palabras se busca minimizar Z= w (d + d ) i+ i i sujeto a las condiciones a x + d d = b i i i i+ 2 i i x j, di , di+ ! 0 2 j Ahora se supondrá que una planta desea producir dos tipos de patines de dos ruedas ( Tipo A ) y de cuatro ruedas ( Tipo B ). La utilidad en el tipo B es de $25.00 mientras que la utilidad del tipo A es de $15.00 Los tiempos unitarios de ensamble y acabado se muestran en la Tabla 9.6. Tabla 9-6 Horas requeridas por equipo Patines Ensamble Acabado Utilidad Unitaria Tipo A 1 1 15 Tipo B 3 1 25 60 40 Horas Hombre por día/departamento Si se desea optimizar este procedimiento se observa que se debe maximizar Z = 15 x1 + 25 x 2 sujeto a : x 1 + 3x 2 " 60 x 1 + x 2 " 40 ( Ensamble ) ( Acabado ) Esto se puede realizar en MATLAB minimizando la expresión -Z . Lo primero que debe hacerse es definir Z como una función de MATLAB 9.7 A PLICACIONES EN I NGENIERÍA I NDUSTRIAL 337 function f = objfun(x) f = -15*x(1) - 25*x(2); El archivo–m para optimizar es: % Este es el Ejemplo9_28A.m % Optimiza una función. clear clc close all x0 = [ 1 ; 1 ]; % Valor inicial options = optimset(‘LargeScale’,’off’); lb=[ 0 ; 0 ]; ub=[ 50 ; 50 ]; A=[1 3 ; 1 1 ]; b=[ 60 ; 40 ]; [x, fval] = fmincon(@objfun,x0,A,b,[],[],lb,ub) Después de correr este archivo obtenemos x= 30.0000 10.0000 fval = -700 lo que nos indica que la utilidad total es de $700.00 y se deben producir 30 patines de dos ruedas y 10 de cuatro ruedas. Si se desea en cambio tener una utilidad mínima de 600 para poder realizar cambio en la producción se tiene entonces un problema de programación meta. Entonces se agregan dos variables de desviación d1- = logro por debajo de la utilidad meta. d1+ = logro por encima de la utilidad meta. La utilidad meta es: 15x 1 + 25x 2 + di di+ = 600 Entonces se debe minimizar 338 9. A PLICACIONES EN LA I NGENIERÍA Z = d1 + d1+ sujeto a ( horas ensamble ) x 1 + 3 x 2 " 60 ( horas acabado ) x 1 + x 2 " 40 15 x 1 + 25 x 2 + d1 d1+ = 600 ( Utilidad neta ) x 1, x 2 , d1 , d1+ ! 0 La siguiente función evalúa Z. function f = objfunB(x) f = x(3)+ x(4); El siguiente archivo–m calcula x1 y x2: % Este es el archivo Ejemplo9_28B.m % Realiza programación meta. clear clc close all x0 = [ 1 ; 1 ; 1 ; 1 ]; % Valor inicial options = optimset(‘LargeScale’,’off’); lb=[1;0; 1;1]; ub=[50;50;50;50]; A=[1 3 0 0; 1 1 0 0 ;-1 0 0 0;0 -1 0 0 ; 0 0 -1 0; 0 0 0 -1]; b=[ 60 ; 40 ; 0 ; 0 ; 0; 0 ]; Ae=[ 15 25 -1 1 ;0 0 0 0; 0 0 0 0;0 0 0 0; 0 0 0 0;0 0 0 0]; be=[600;0;0;0;0;0]; x = fmincon(@objfunB,x0,A,b,Ae,be,lb,ub) MATLAB nos da la solución óptima, x= 15.0000 15.0000 1.0000 1.0000 Un método gráfico lo podemos realizar con el siguiente archivo-m que nos da la gráfica de la figura 9.47 correspondiente a los departamentos de ensamble y acabado y la utilidad meta. 9.7 A PLICACIONES EN I NGENIERÍA I NDUSTRIAL 339 % Este es el archivo Ejemplo9_28C.m % Resuelve gráficamente el problema de programación meta. clear clc close all xx1 = [ 0 : 5 : 60 ]; xx2 = 60/3-xx1/3; xx3 = 40-xx1; xx4 = 600/25-xx1*15/25; plot( xx1, xx2, xx1, xx3, xx1, xx4,’-.’ ) xlabel( ‘Patines de dos ruedas - x1’ ) ylabel( ‘Patines de cuatro ruedas - x2’ ) legend( ‘Restricción ensamble’,’Restricción acabado’,’Meta de utilidad’) Vemos que la solución hallada por este método gráfico coincide con la óptima. Nótese que 15*x(1)+ 25*x(2) = 600 satisface la meta de utilidad. Figura 9.47 Método gráfico para resolver el sistema de programación meta. 340 9. A PLICACIONES EN LA I NGENIERÍA 9.8 Aplicaciones en Ingeniería Civil EJEMPLO 9.29 Deformación de una viga Consideremos una viga horizontal de L =20 m de longitud apoyada en los extremos. Si la viga tiene una carga uniformemente distribuida de w =100 Kg/m, encontrar la ecuación que describe la viga al deformarse. Consideremos que el extremo izquierdo es el origen y el eje x como se muestra en la figura 9.48. P X O (x,y) Figura 9.48 Viga sostenida en los extremos. En el origen se tiene un empuje vertical hacia arriba de w.L = 10020 Kg. Para un punto P cualquiera sobre la viga con coordenadas ( x, y ) se tiene una carga en el punto medio del segmento OP dada por w.x. El momento M está dado por 2 E 1 I1 d y dx 2 = wLx wx 1 1 2 x = wLx wx 2 2 donde E es el módulo de elasticidad e I es el momento de inercia de una sección transversal. Esta ecuación diferencial se puede resolver en MATLAB simplemente integrando dos veces con respecto a x desde x = 0 hasta x = 20. Para integrar podemos usar la instrucción int. Entonces, para realizar estas integraciones primero reescribimos la ecuación diferencial como 2 d y dx = 2 2 wLx wx 1 x 1 x = w Lx E1I E1I 2 2 E 1 I 9.8 A PLICACIONES EN I NGENIERÍA C IVIL 341 En MATLAB esto lo declaramos con d2y = w*(L*x-x^2/2)/(E*I) La primera integral la obtenemos con dy = int( d2y ) y la segunda integral con y = int( dy ) Luego calculamos las dos constantes de integración y sustituimos los valores de las constantes. Hemos escogido E =1000, I =100, w =100, L = 10. El archivo-m completo es el siguiente % Este es el archivo Ejemplo9_29.m % Este problema integra la ecuación de los momentos. % E es el módulo de elasticidad. % I es el momento de inercia. clc clear close all syms x E I w L % Definición de la ecuación diferencial, d2y = w*(L*x-x^2/2)/(E*I); % Cálculo de la primera integral, dy = int( d2y ) % Cálculo de la segunda integral, y = int( dy ) % Cálculo de las constantes de integración: % y = 0 en x = 0; y = 0 en x = 20. C2 = 0; C1 = -w*L^3/3/(E*I); y = y + C1*x; fprintf ( ‘ La solución es y =’ ) pretty( y ) x1 = [ 0:1:20 ]; % Substitución de valores normalizados de E e I. % Substitución de w =100, L=10. y1 = subs( y, [ E, I, w, L], [ 1000, 100, 100, 10 ] ); 342 9. A PLICACIONES EN LA I NGENIERÍA y2 = subs( y1, ‘x’, x1 );% Substitución de x por el vector x1. % Desviación máxima hacia abajo en el centro de la viga. ymx = 5*w*L^4/( 24*E*I ); ymax = subs( ymx, [ E, I, w, L], [ 1000, 100, 100, 10 ]) plot ( x1, y2 ) Al correr este archivo-m obtenemos: La solución es y = 3 4 3 w (1/6 L x - 1/24 x ) wL x --------------------------- -1/3 --------EI EI ymax = 2.0833 También se produce la gráfica de la deformación de la viga la cual se muestra en la figura 9.49, donde se aprecia la deformación máxima de la viga. Figura 9.49 Deformación de la viga. 9.8 A PLICACIONES EN I NGENIERÍA C IVIL 343 EJEMPLO 9.30 Análisis estructural matricial de una armadura* La armadura mostrada en la figura 9.50 está sujeta a las fuerzas mostradas. Se desea calcular: a) Los desplazamientos nodales, b) Las fuerzas axiales en las barras, c) Las reacciones en los apoyos. Figura 9.50 Estructura que se desea estudiar. Las barras se numeran como se muestra en la figura 9.50. También se indica su longitud y área. Los vectores de cargas aplicadas Pa, de reacciones R y de desplazamientos D son # 0 3 # 03 # 0 3 % % % % % % %10% % 0% %10% #{P}1 3 %8 % % 0% %8 % % % % % % % % % %{P}2 % % 0 % % 0% % 0 % a 4+$ 4 = $ 4=$ 4 {P} = P + {R} = $ %{P}3 % % 0 % % 0% % 0 % %{P} % % 0 % %R % %R % & 45 % % % 3y % % 3y % % 0 % %R4 x % %R4 x % % % % % % % & 0 5 &R4 y 5 &R4 y 5 { } * Este Ejemplo fue propuesto por el Dr. Raúl Serrano Lizaola, Jefe del Departamento de Ingeniería Civil de la Universidad de las Américas-Puebla. 344 9. A PLICACIONES EN LA I NGENIERÍA #u1 3 % % % v1 % %u % % 2% %v2 % D=$ 4 %u3 % %0 % % % %0 % % % &0 5 Tabla 9.7 Datos para formar la matriz de rigidez global de las barras cos 2 sen cos sen cos Barra entre nodos: Area de la barra Largo L Ángulo entre barras cos sen EA L 1-2 2A 4 0° 1 0 EA 2 1 0 0 0 1-3 4A 3 270° 0 -1 4EA 3 0 0 0 1 1-4 A 5 4/5 -3/5 EA 5 16 / 25 12 / 25 12 / 25 9 / 25 2-3 A 5 -4/5 -3/5 EA 5 16 / 25 12 / 25 9 / 25 12 / 25 2-4 4A 3 270° 0 -1 4EA 3 0 0 0 1 3-4 2A 4 0° 1 0 EA 2 1 0 0 0 2 sen La matriz de rigidez global se obtiene a partir de los datos de la Tabla 9.7. Primero se obtienen las submatrices k i j dadas por EA 375 0 750 0 0 EA 0 0 [k 11](13 ) = [k 33 ](13 ) = [k 13 ](13 ) = [k 31](13 ) = 4750 0 250 EA 16 12 [k 11](14 ) = [k 44 ](14 ) = [k 14 ](14 ) = [k 41](14 ) = 6750 12 9 EA 16 12 [k 22 ](23 ) = [k 33 ](23 ) = [k 23 ](23 ) = [k 32 ](23 ) = 6750 12 9 EA 0 0 [k 22 ](24 ) = [k 44 ](24 ) = [k 24 ](24 ) = [k 42 ](24 ) = 4750 0 250 EA 375 0 [k 33 ](34 ) = [k 44 ](34 ) = [k 34 ](34 ) = [k 43 ](34 ) = 750 0 0 [k ] 11 (12 ) = [k 22 ](12 ) = [k 12 ](12 ) = [k 21](12 ) = 9.8 A PLICACIONES EN I NGENIERÍA C IVIL 345 Con lo que la matriz de rigidez estructural es [K12 ] [K13 ] [K14 ] [K11] [K ] [K] = 21 [K ] 31 [K 41] [K 22 ] [K 23 ] [K 24 ] [K 32 ] [K 33 ] [K 34 ] [K 42 ] [K 43 ] [K 44 ] donde [K ] = [k ] ;[k ] = [k ] ij ij ij ji (ij) (i) [K ] = [k ] + k 11 [K ] = [k ] + k 22 [K ] = [k ] + k 33 [K ] = [k ] + k 44 11 22 33 44 11 22 33 44 (12) (12) (13) (14) [ ] + k 11 [ ] + k 22 [ ] + k 33 [ ] + k 44 (13) (23) (23) (24) [ ] (14) = EA 471 72 750 72 1054 [ ] = EA 471 72 750 72 1054 [ ] = EA 471 72 750 72 1054 [ ] = EA 471 72 750 72 1054 (24) (34) (34) La relación de rigidez estructural está dada por {P} = [K]{D} . Entonces, #0 3 471 72 375 96 0 0 0 72 # u1 3 % % % % %10% 1000 72 54 0 0 0 % V1 % 72 1054 %8 % %u % 375 0 471 72 96 72 0 0 % % % 2% %0 % EA 0 54 1000 % V2 % 0 72 1054 72 0 $ 4= ×$ 4 96 72 375 0 471 72 0 %0 % 750 0 %u3 % %R % % % 1000 72 54 0 72 1054 0 0 % 3y % %0% %R4 x % %0% 96 0 0 375 0 471 72 72 % % % % 54 0 1000 0 0 72 1054 & 0 5 72 &R4 y 5 La matriz de rigidez estructural reducida es {Pc } = [K *]{Dd } donde: 346 9. A PLICACIONES EN LA I NGENIERÍA 0 0 471 72 375 72 1054 0 0 0 EA [K *] = 375 0 471 72 96 × 750 0 0 72 1054 72 0 0 96 72 471 Para el cálculo de los desplazamientos, éstos se obtienen de {Dd } = [K *] 1{Pc } . Esto es #u1 3 0.0488 0.2142 0.0205 0.0011 % % 1.8065 0.1627 0.0089 %v1 % 0.3862 % % 750 0.0135 0.0583 0.0068 0 $u2 4 = %v % EA 0.0355 0.0032 0.0004 0.0010 % 2% 0.02861 0.0114 %&u3 %5 0.0013 0.0001 0.0040 # 03 % % 0.0318 %10% % % 0.0013 $ 84 0.0001 % 0% % % 0.0024 %& 0%5 #u 3 #36.3003 % 1% % % % v1 % % 9.595% % % % 1% $u2 4 = $43.7504 % % % EA % % 2.405% %v2 % %& 8.550%5 %&u3 %5 El cálculo de las reacciones se hace con #36.3003 % % #R3 y 3 0 1000 72 54 72 % 9.595% % % % % % EA 1% $R4 x 4 = $43.7504 72 0 0 375 96 EA % % % % 750 54 0 1000 0 % 72 % 2.405% &R4 y % 5 % 5 & 8.550% Con lo que se obtiene #R 3 #16.03 3y % % % % % % $R 4 x 4 = $ 8.04 tons % % % % % &R 4 y % 5 &6.05 El cálculo de las fuerzas axiales en las barras se realiza por F(ij ) = EA [(uj ui )cos + ( v j vi )sen] L 9.8 A PLICACIONES EN I NGENIERÍA C IVIL 347 Las reacciones y las fuerzas axiales calculadas se muestran en la figura 9.51. La armadura deformada, trazada de manera cualitativa se muestra en la figura 9.52. Figura 9.51 Figura 9.52 Reacciones y fuerzas axiales en la armadura. Configuración deformada de la armadura. El archivo-m que realiza estos cálculos se muestra a continuación: 348 9. A PLICACIONES EN LA I NGENIERÍA % Este es el archivo Ejemplo9_30.m % Calcula los desplazamientos en una armadura. PR = zeros( 8, 1 ); clear all syms A % p es el vector de cargas aplicadas p(1) = 0; p(2) = -10; p(3) = -8; p(4) = 0; p(5) = 0; p(6) = 0; p(7) = 0; p(8) = 0; % r es el vector de reacciones r( 1 ) = 0; r( 2 ) = 0; r( 3 ) = 0; r( 4 ) = 0; r( 5 ) = 0; r( 6 ) = 1; r( 7 ) = 1; r( 8 ) = 1; % creación del vector de índices para el cálculo % de la matriz de rigidez estructural reducida. rind( 1, 8 )=zeros; for ir = 1:8; if r( ir ) == 0; rind( ir ) = 1; % cuando no está sujeto el nodo % entonce se tiene rind(i)=0. end end % d es el vector de desplazamientos d(1)=0; % componente x en el nodo 1 d(2)=0; % componente y en el nodo 1 d(3)=0; % componente x en el nodo 2 d(4)=0; % componente y en el nodo 2 d(5)=0; % componente x en el nodo 3 d(6)=10; % componente y en el nodo 3 d(7)=10; % componente x en el nodo 4 d(8)=10; % componente y en el nodo 4 9.8 A PLICACIONES EN I NGENIERÍA C IVIL for i=1:8; if r(i)~=0% si la reacción es distinta de cero % hacer el desplazamiento % correspondiente igual a cero d(i)=0; end end p1=p’;% se hace vector columna r1=r’;% se hace vector columna d=d’;% se hace vector columna PR=p1+r1;% Vector PR suma de cargas apl. y reacciones. % Cálculo del Vector de areas a(j). a(1)=2*A; a(2)=4*A; a(3)=A; a(4)=A; a(5)=4*A; a(6)=2*A; % Cálculo de las longitudes. L(1)=4; L(2)=3; L(3)=sqrt(L(1)^2+L(2)^2); L(4)=L(3); L(5)=L(2); L(6)=L(1); L=L’; % Se hace vector columna. % Componentes de la Matriz de rigidez global. m12=[1 0;0 0]*a(1)/L(1); m13=[0 0;0 1]*a(2)/L(2); m14=[(L(1)/L(3))^2 -(L(1)/L(3))*(L(5)/L(3));... -(L(5)/L(3))*(L(1)/L(3)) (L(5)/L(3))^2]*a(3)/L(3); m23=[(L(1)/L(3))^2 (L(5)/L(3))*(L(1)/L(3));... (L(5)/L(3))*(L(1)/L(3)) (L(5)/L(3))^2]*a(4)/L(4); m24=[0 0;0 1]*a(5)/L(5); m34=[1 0;0 0]*a(6)/L(6); % Cálculo de las submatrices de rigidez estructural. K11 = m12+m13+m14; K22 = m12+m23+m24; K33 = m13+m23+m34; K44 = m14+m24+m34; 349 350 9. A PLICACIONES EN LA I NGENIERÍA K12 = -m12; K13 = -m13; K14 = -m14; K23 = -m23; K24 = -m24; K34 = -m34; % Matriz de rigidez estructural K = [ K11 K12 K13 K14;... K12 K22 K23 K24;... K13 K23 K33 K34;... K14 K24 K34 K44]; % Matriz de rigidez estructural reducida. j=0; for i = 1:8; j = j + 1; if rind( i ) == 1; Kest( : , j ) = K( : , i ); end end j=0; for i = 1:8; j = j + 1; if rind( i ) == 1; Kest2( j , : ) = Kest( i , : ); end end Kest2 %Kestrella = K(1:5,1:5) PP = p(1:5)’; d = Kest2\PP Reacciones = K( 6:8,1:5 )*d for i = length( d ) + 1 :8 d( i ) = 0; end teta2 = atan(L(5)/L(1)); format( ‘short’ ) f12 = double((a(1)/L(1))*(d(3)-d(1) )); fprintf( ‘ f12 = %6.5g\n’, double(f12) ) 9.8 A PLICACIONES EN I NGENIERÍA C IVIL 351 f14 = (a(3)/L(3))*((d(7)-d(1))*cos(-teta2) + (d(8)-d(2))*sin(-teta2)); f13 = (a(2)/L(2))*(-(d(6)-d(2))); f23 = (a(4)/L(4))*((d(5)-d(3))*cos(pi+teta2) + (d(6)-d(4))*sin(pi+teta2)); f24 = (a(5)/L(5))*(-(d(8)-d(4))); f34 = (a(6)/L(6))*(d(7)-d(5)) ; fprintf( ‘ f14 = %6.5g\n’, double(f14) ) fprintf( ‘ f13 = %6.5g\n’, double(f13) ) fprintf( ‘ f23 = %6.5g\n’, double(f23) ) fprintf( ‘ f24 = %6.5g\n’, double(f24) ) fprintf( ‘ f34 = %6.5g\n’, double(f34) ) Después de correr este archivo MATLAB proporciona los siguientes datos: Matriz de rigidez estructural reducida 157 A 250 12 A 125 1 A 2 0 0 12 A 125 527 A 375 0 0 0 1 A 2 0 0 0 0 0 157 A 250 12 A 125 16 A 125 12 A 125 527 A 375 12 A 125 Desplazamientos 19021 1/ A 524 1257 1/ A 131 175 4 1/ A 315 1/ A 131 1120 1/ A 131 16 A 125 12 A 125 157 A 250 352 9. A PLICACIONES EN LA I NGENIERÍA Reacciones = 16 8 -6 Fuerzas axiales en las barras f12 = -3.7252 f14 = 4.6565 f13 = -12.794 f23 = -5.3435 f24 = 3.2061 f34 = 4.2748 EJEMPLO 9.31 Reacciones en un soporte Consideremos el soporte de la figura 9.53. Para calcular las reacciones usaremos equilibrio de fuerzas. La carga aplicada es q0. q0 L2=2L1 L1 Figura 9.53 Soporte del Ejemplo 9.30. 9.8 A PLICACIONES EN I NGENIERÍA C IVIL 353 q0 F 45o Rc Ray RAX Figura 9.54 Reacciones en el soporte. q0 F Rc cos 45 Rc sen 45 RAy R Ax L1 Figura 9.55 L2 L2 Descomposición de reacciones. En el punto A el único movimiento es un cambio en el ángulo y existen reacciones en el punto A. En el punto C puede haber un movimiento que cambiaría las coordenadas (x,y) del punto C, además de existir una reacción RC como se muestra en la figura 9.54. En el punto B existe una fuerza F. En la figura 9.55 se muestran todas las fuerzas y reacciones presentes en el soporte. La ecuación de equilibrio para el punto A es M = 0 = Fh (2q L )(L ) + R h cos +R 0 2 e 1 C 354 9. A PLICACIONES EN LA I NGENIERÍA además h = L2 tan 2. Para el punto C, las ecuaciones para las componentes (x, y) de RC son F = F R cos + R F = 0 = R + R sen q L x c y Ay 1 c Ax 1 0 2 Usando la instrucción solve en MATLAB podemos encontrar las soluciones. Esto se muestra en el siguiente archivo-m, % Este es el archivo Ejemplo9_31.m % Calcula el desplazamiento de una estructura. clc clear close all syms L F q0 teta1 teta2 fi R rAx rax RAx RAy rAy L2 fprintf( ‘Reacción en el punto C ‘ ) r = solve( -F*L*tan(teta2)-( 2*q0*L*L2 )... + R*cos(teta1)*L*tan(teta2)+ R*sin(teta1)*3*L, R ); simplify ( r ); expand( ans ); pretty( ans ) r1 = subs( r, teta2, pi/3 ); r3 = subs( r1, teta1, pi/4 ); r2 = subs( r3, L2, 2*L ); simplify( r2 ); expand( ans ); fprintf( ‘Reacción en el punto C para teta1 = 60 y teta2 = 45 y L2=2*L’ ) pretty( ans ) rAx = solve( F-r2*cos(teta1)+rax, rax ); simplify( rAx ); fprintf( ‘Componente x de la reacción en el punto A ‘ ) pretty( ans ) RAx = subs( rAx, teta1, pi/4 ); expand( RAx); simplify( ans); fprintf( ‘Componente x de la reacción en el punto A para teta1 = 60 y teta2... = 45’ ) pretty( ans) 9.8 A PLICACIONES EN I NGENIERÍA C IVIL 355 ray = solve( rAy + r2*sin(teta1)-q0*L2, rAy ); ray1 = subs( ray, teta1, pi/4 ); RAy = subs( ray1, L2, 2*L ); simplify( RAy ); expand( ans ); fprintf( ‘Componente y de la reacción en el punto A para teta1 = 60 y teta2... = 45’ ) pretty( ans ) La salida que proporciona MATLAB es la siguiente: Reacción en el punto C F sin(teta 2) cos(teta1) sin(teta2) + 3 sin(teta1) cos(teta2) +2 q0 L2 cos * teta 2) cos(teta1) sin(teta 2) + 3 sin(teta1) cos(teta 2) Reacción en el punto C para teta1 = 60 y teta2 = 45 y L2=2*L 1/2 1/2 1/2 F3 2 2 q0 L ------------- + 4 ---------1/2 1/2 3 +3 3 +3 Componente x de la reacción en el punto A 1/2 1/2 1/2 1/2 -F 3 -3 F + 2 cos (teta1) F 3 + 4 2 cos (teta1) q0 L ----------------------------------------------------------------------------------1/2 3 +3 Componente x de la reacción en el punto A para teta1 = 60 y teta2 = 45 -3 F + 4 q0 L ------------------1/2 3 +3 Componente y de la reacción en el punto A para teta1 = 60 y teta2 = 45 356 9. A PLICACIONES EN LA I NGENIERÍA 1/2 1/2 q0 L 3 q0 L 3 F 3 2 ----------- + 2 -------- - ------1/2 1/2 1/2 3 +3 3 +3 3 +3 Podemos observar que los datos son las expresiones para RAx y RAy. De aquí concluimos que el movimiento del punto C será hacia un lado o el otro dependiendo de la magnitud de F. 9.9 Aplicaciones en Ingeniería Mecánica EJEMPLO 9.32 Sistema amortiguado sometido a un movimiento armónico en la base En ocasiones la base de un sistema masa resorte amortiguador se encuentra sometido a un movimiento armónico. En la figura 9.56 se muestra el sistema y el movimiento armónico y(t) al que se encuentra sometido. La figura 9.57 muestra el efecto del resorte y amortiguador sobre la masa. Figura 9.56 Sistema masa-resorte-amortiguador excitado en la base. Figura 9.57 Efecto del resorte y amortiguador sobre la masa. La ecuación del movimiento es entonces: m x˙˙ + c ( x˙ f˙( t ) ) + k ( x f ( t ) ) = 0 9.9 A PLICACIONES EN I NGENIERÍA M ECÁNICA 357 Como f(t) = F sen(t) la ecuación anterior puede escribirse como: mx˙˙ + cx˙ + k x = k y + cy˙ donde y f(t) Para resolver en MATLAB este problema escribimos la ecuación diferencial como un sistema de ecuaciones, sabiendo que f ( t ) = F sen ( t ) ˙f ( t ) = F cos ( t ) Entonces, x1 = x x 2 = x˙ = x˙ 1 k c c k x˙ 2 = ˙˙x = x x˙ + ˙f ( t ) + f ( t ) m m m m k c cF kF cos ( t ) + = x1 x 2 + sen ( t ) m m m m o bien, #x˙ 1 = x 2 % $ k c cF kF cos ( t ) + sen ( t ) %x˙ 2 = x1 x 2 + & m m m m El sistema de ecuaciones lo podemos programar en una función como: function xpunto=ec_dif(t,x) global k w m wn F c xpunto(1) = x(2); xpunto (2 ) = -(c/m)*x(2)-(k/m)*x(1)+(c*F/m)*cos(w*t)+(F*k/m)*sin(w*t); xpunto = xpunto’; El archivo-m para resolver el sistema de ecuaciones diferenciales para m = 120 Kg y para m = 500 Kg es el siguiente: %Este es el archivo Ejemplo9_32.m. % Calcula la trayectoria, y las coordenadas de posición % tiempo de 0 a 15 segundos 358 9. A PLICACIONES EN LA I NGENIERÍA close all clear clc global k w m wn F c tiempo = linspace ( 0, 100, 100 ); % condiciones iniciales x0 = [ 0 0 ]’; w=5.81778;m=120; k=40e1;wn=sqrt(k/m);F=0.1;c=wn*m; % llamado de la subrutina para resolver % el sistema de ecuaciones diferenciales [ t , x ] = ode23 ( ‘ec_dif’, tiempo , x0 ); % Gráfica de la altura vs. tiempo subplot(2,2,1) plot( t , x ( : , 2 ) ) grid on xlabel ( ‘tiempo’) ylabel ( ‘Altura’) legend ( ‘ m = 120 Kg ‘ ) subplot(2,2,2) plot( t , x ( : , 1) ) xlabel ( ‘tiempo’) ylabel ( ‘Velocidad’) grid on m=500;k=40e1;wn=sqrt(k/m);c=wn*m; [ t , x ] = ode23 ( ‘ec_dif’, tiempo , x0 ); subplot(2,2,3) plot( t , x ( : , 2 ) ) legend( ‘ m = 500 Kg’) grid on xlabel ( ‘tiempo’) ylabel ( ‘Altura’) subplot(2,2,4) plot( t , x ( : , 1) ) xlabel ( ‘tiempo’) ylabel ( ‘Velocidad’) grid on 9.9 A PLICACIONES EN I NGENIERÍA M ECÁNICA 359 Las gráficas de salida se muestran en la figura 9.58. Las dos gráficas de arriba son la distancia que se mueve la base y la velocidad que tiene cuando la masa es de 150 Kg. Las dos gráficas de abajo corresponden al análisis cuando la masa es de 500 Kg. De aquí podemos observar que la fuerza F se amortigua en mayor medida si la masa es muy grande ya que sólo alcanza a desplazarse apenas la tercera parte, aproximadamente, comparado con el caso de la masa de 150 Kg en cuyo caso sufre un desplazamiento mayor. Figura 9.58 Gráficas de desplazamiento y velocidad de la base. EJEMPLO 9.33 Respuesta de una estructura a un impacto Para probar la estructura de la figura 9.59 le aplicamos un impacto con un martillo. El impacto del martillo es un impulso F6(t). Si suponemos que el sistema es subamortiguado, la ecuación diferencial que rige a este sistema es: m ˙˙x + c x + kx˙ = 0 Las condiciones iniciales las podemos determinar sabiendo que x=x=0 si t < 0. Pero en t = 0+ aplicamos el impulse unitario. Como el momentum (cantidad de movimiento) se conserva, debemos tener que: 360 9. A PLICACIONES EN LA I NGENIERÍA + + impulso = F6(t ) = mx˙ (0 ) + mx˙ (0 ) = mx˙ (0 ) por lo que F x˙ (0) = m El desplazamiento en t = 0+ se mantiene en el mismo valor que t = 0-. Es decir, + x( 0 ) = x( 0 ) = 0 La ecuación diferencial se puede escribir como un sistema de ecuaciones diferenciales lineales como: x1 = x # %x˙ 1 = x 2 % $ % k c % x˙ 2 = x1 x 2 & m m Esto se puede programar en una función. Para este caso consideremos los siguientes datos: m = 5 Kg, K = 2000 N/m, C = 10 N s /m y F = 10 N. La función ec_dif es entonces function xpunto=ec_dif( t, x ) global m k c f xpunto(1) = x(2); xpunto (2 ) = -(c/m)*x(2)-(k/m)*x(1); xpunto = xpunto’; El archivo m que grafica el desplazamiento x(t) = x1(t) es: %Este es el archivo Ejemplo9_33.m % Calcula el desplazamiento y la velocidad de una estructura % sometida a un impulso. clear clc close all global m k c f % tiempo de 0 a 7 segundos tiempo = linspace ( 0, 7, 1000 ); 9.9 A PLICACIONES EN I NGENIERÍA M ECÁNICA 361 % condiciones iniciales x1=0, x2=F/m. x0 = [ 0 .2 ]’; % Datos m=5; k=2e3; c=10; % llamado de la subrutina para resolver % el sistema de ecuaciones diferenciales [ t , x ] = ode23 ( ‘ec_dif’, tiempo , x0 ); % Gráfica del desplazamiento vs. tiempo subplot(1,3,1) plot( t , x ( : , 1 ) ) grid on xlabel ( ‘tiempo’) ylabel ( ‘Desplazamiento’) % Gráfica de la velocidad subplot(1,3,2) plot( t , x ( : , 2) ) grid on xlabel ( ‘tiempo’) ylabel ( ‘Velocidad’) % Gráfica de la trayectoria subplot(1,3,3) plot ( x (:,1), x(:,2)) xlabel ( ‘Desplazamiento’) ylabel ( ‘Velocidad’) grid on La figura 9.60 muestra el resultado. Se observa que para los valores considerados en el ejemplo la estructura presenta un movimiento oscilatorio amortiguado. Figura 9.59 Estructura sometida a un impulso. 362 9. A PLICACIONES EN LA I NGENIERÍA Figura 9.60 Gráficas del desplazamiento, velocidad y trayectoria de la estructura sometida a un impulso. EJEMPLO 9.34 Carbonización de acero Una barra de acero se va a carbonizar a 927° C, calcular el tiempo necesario para aumentar el contenido de carbono a 40% a una profundidad de 0.5 mm debajo de la superficie. Supóngase que el contenido de carbono en la superficie es de 0.9% y que el acero tiene un contenido nominal de 0.2% Además D = 1.28 10-11 m2/s Usando la solución de la segunda ley de Fick se tiene que x = .5 10-3 , Cs = 0.9 10-2, Co = 0.2 10-2 , Cx = 0.4 10-2. De la solución se tiene que: 0.4 0.2 = 1 erf 0.9 0.2 11 2 1.28 10 t 0.5 10 Esta ecuación puede resolverse en MATLAB con % Este es el archivo Ejemplo9_34.m close all clear clc syms t % Datos de entrada: x = 0.5e-3; Cs = 0.9e-2; Cx = 0.4e-2; Co = 0.2e-2; -3 9.9 A PLICACIONES EN I NGENIERÍA M ECÁNICA 363 D = 1.28e-11; % Cálculo de H: H = (Cx-Co)/(Cs-Co); % Cálculo del tiempo usando solve: tiempo = solve ( 1-H-erf(0.5e-3/(2*sqrt (1.28e-11*t)))); tiempo_seg = double(tiempo) tiempo_min=tiempo_seg/60 tiempo_horas = tiempo_seg/3600 El resultado que obtenemos en la ventana de trabajo de MATLAB es tiempo_seg = 8.5685e+003 tiempo_min = 142.8090 tiempo_horas = 2.3802 EJEMPLO 9.35 Transferencia de calor en sólidos La segunda Ley de Fick también se puede aplicar a transferencia de calor en sólidos. En este ejemplo deseamos calcular la difusión de calor de una pared gruesa a una profundidad de 1 cm después de 1 min. La temperatura inicial es 2°C y la superficial está siendo expuesta a 20° C. Supóngase un coeficiente térmico de difusión de k = 0.0024 cm2/s. De la solución a la segunda ley de Fick se tiene: Tx To x = 1 erf Ts To 2 k t Sustituyendo en la solución To =2, Ts = 20, x = 1 cm, t = 1 min = 60 seg y resolviendo para Tx se obtiene Tx = 20 18 erf 7 2 2.4 × 10 × 60 1× 10 2 364 9. A PLICACIONES EN LA I NGENIERÍA En MATLAB esto lo damos como: Tx = 20-18*erf( 1e-2/( 2*sqrt( 2.4e-7*60 ) ) ) con lo que obtenemos: Tx = 3.1233 EJEMPLO 9.36 Trabajo en frío Cuando un metal se trabaja en frío se produce una densidad de dislocación que endurece el material a temperatura ambiente. Además se reduce la ductibilidad, aumenta la dureza, se reduce la resistencia a la corrosión , ente otras desventajas. El porcentaje de trabajo en frío es un índice de la deformación plástica y se define por: A A f %TF = 0 × 100 A0 donde A0 y Af son las áreas inicial y final respectivamente. Por ejemplo para que el espesor de una hoja de aluminio se reduzca de 2 mm a 0.4 mm, utilizando la ecuación anterior 2 0.4 %TF = × 100 = 80% 2 El siguiente archivo calcula TF % Este es el archivo Ejemplo9_36.m % Calcula el porcentaje de trabajo en frío. close all clc clear % Datos iniciales L0 = 2:0.1:5; % Vector de espesores. LF = 0.4; % Espesor final. syms TF x % Cálculo del vector de trabajo en frío. for i = 1:length(L0); TF( i ) = ( solve( x -( L0( i )-LF )/L0(i)) )*100; 9.9 A PLICACIONES EN I NGENIERÍA M ECÁNICA 365 end TFF = double(TF), % Conversión de variable numérica a simbólica. plot ( L0 , TFF ); xlabel( ‘ Espesor inicial’ ) ylabel( ‘ Porcentaje de Trabajo en frío (%)’ ) Nótese que para L0 = 2 el porcentaje de trabajo en frío es 80%. La figura 9.61 nos da una gráfica del porcentaje de trabajo en frio. Figura 9.61 Curva de porcentajes de trabajo en frío. EJEMPLO 9.37 Vibración en una banda transportadora* Se desea analizar el comportamiento de una carga de masa m colocada sobre una banda transportadora que tiene una velocidad V0. Esta carga está asociada a un sistema resorte-amortiguador como se muestra en la figura 9.62a. a) b) Figura 9.62 Sistema de banda transportadora. a) Esquema completo. b) Diagrama de cuerpo libre. * Este problema fue propuesto por el Dr. Tadeusz Majewski, profesor del Departamento de Ingeniería Mecánica de la Universidad de las Américas, Puebla. 366 9. A PLICACIONES EN LA I NGENIERÍA Existe una fuerza de fricción dada por [ F = μN 1 bv + cv 3 ] donde v es la velocidad de deslizamiento v = (v 0 x˙ ) De esta manera la fuerza de rozamiento está dada por [ F = μN 1 b (v 0 x˙ ) + c (v 0 x˙ ) 3 ] Ahora bien, la carga libre tiene las fuerzas y reacciones asociadas como se muestra en la figura 9.62b, donde S=k x R = nx˙ y N = mg De esta manera la ecuación de la carga es mx˙˙ = F S R = F k x nx˙ que se reescribe como [ 3 mx˙˙ + nx˙ + k x = μN 1 b (v 0 x˙ ) + c (v 0 x˙ ) ] Esta ecuación diferencial de segundo orden se puede escribir como un sistema de ecuaciones diferenciales lineales. Para hacer esto escribimos x1 = x con lo que x1 = x x 2 = x˙ 1 = x # x˙ 1 = x 2 %% $ k n %˙ 3 %&x 2 = x1 x 2 + μN [1 b (v 0 x 2 ) + c (v 0 x 2 ) ] m m 9.9 A PLICACIONES EN I NGENIERÍA M ECÁNICA 367 Este sistema de ecuaciones se programa en una función ec_dif como function xpunto=ec_dif(t,x) global n k mu N b vo c m xpunto(1) = x(2); xpunto (2 ) = -(n/m)*x(2)-(k/m)*x(1)+(mu*N/m)*(1-b*(vo-x(2))+ c*(vo-x(2))^3); xpunto = xpunto’; Los datos del problema son b = 0.3, c = 0.1 que junto con b dan un valor de VC1 = b/3c = 1 m/s, m = 1 Kg, g = 9.8 m/s2, m = 0.6, k = 1600 N/m, n = 0.1 Kg/s. Realizamos tres simulaciones: 1) V0 = 0.5 m/s < VC1 = 1 m/s, 2) V0 = 1.0 m/s = VC1, 3) V0 = 1.5 m/s > VC1. Los resultados graficados en las figuras 9.63 a 65 muestran cómo sólo para el tercer caso el sistema es estable y amortiguado por completo, pero en los tres casos aparecen vibraciones autoexcitadas. El archivo-m correspondiente es el siguiente: % Este es el archivo Ejemplo9_37.m. % Calcula el desplazamiento, la velocidad y la % trayectoria velocidad vs.desplazamiento de una % carga en una banda transportadora % mostrando la vibración autoexcitada. close all clear clc global n k mu N b vo c m tiempo = linspace ( 0, 8, 10000 ); % condiciones iniciales x0 = [ 0 0 ]’; % datos b = 0.3; m=1; k=1.6e3; n=0.1; c=0.1; vo = 1.5; mu = 0.6; N=9.8; % llamado de la subrutina para resolver % el sistema de ecuaciones diferenciales [ t , x ] = ode23 ( ‘ec_dif’, tiempo , x0 ); 368 9. A PLICACIONES EN LA I NGENIERÍA % Gráfica de la posición vs. tiempo plot( t , x ( : , 1 ) ) grid on xlabel ( ‘tiempo’) ylabel ( ‘Posición’) legend ( ‘ vo = 1.5’ ) % Gráfica de la trayectoria figure plot ( x (:,1), x(:,2)) axis (‘square’) grid on a) b) Figura 9.63 Caso para Vo = 0.5 < 1. a) Posición de la masa. b) Trayectoria de las variables velocidad contra desplazamiento. a) b) Figura 9.64 Caso para Vo = 1. a) Posición de la masa. b) Trayectoria de las variables velocidad contra desplazamiento. 9.9 A PLICACIONES EN I NGENIERÍA M ECÁNICA a) 369 b) Figura 9.65 Caso para Vo = 1.5 > 1. a) Posición de la masa. b) Trayectoria de las variables velocidad contra desplazamiento. Referencias [1] J. Vélez-Ruiz y M.E Sosa Morales, Heat and mass transfer during the frying process of donuts, en Transport Phenomena in Food Processing, Eds. J. Welti-Chanes, J. Vélez-Ruiz y G. Barbosa, CRC Press Inc., Boca Ratón, Fl, 2003, pp. 429-444. [2] L. Blank y A. Tasquin, Ingeniería Económica, 5ª Ed. Mc Graw Hill Interamericana, México DF, 2004-09-03. [3] H. Moskowitz y G. P. Wright Investigación de operaciones, Prentice-Hall Hispanoamericana, S.A., México DF, 1982. [4] A. Soriano y J. Vélez, Evaluación de las propiedades físicas de los alimentos usando un programa de computadora, Información Tecnológica, Vol. 14, No. 4, pp. 23–28, La Serena, Chile, 2003. Aplicaciones en Física La relación entre la física y la matemática es muy directa ya que la mayor parte de los fenómenos físicos se pueden describir mediante ecuaciones matemáticas. Por esta razón, MATLAB es la herramienta perfecta para representar tales comportamientos. En este capítulo presentamos algunos ejemplos representativos. EJEMPLO 10.1 Tiro parabólico El tiro parabólico es un ejemplo muy didáctico y lo podemos encontrar en casi todos los textos de física intermedia y superior. El problema consiste en el lanzamiento de un proyectil de masa m con velocidad inicial v0 haciendo un ángulo con el eje horizontal, como se muestra en la figura 10.1. Ignorando la resistencia del aire, al dispararse el proyectil este queda sometido solamente a la fuerza de la gravedad que actúa en la dirección –y, mientras que en la dirección x no actúa ninguna fuerza. Lo que el lanzador se pregunta es a) ¿Cuál será la máxima distancia que recorrerá el proyectil? b) ¿Cuál será la máxima altura que alcance el proyectil? c) ¿Cuál será la trayectoria que sigue este proyectil? Figura 10.1 Esquema del tiro parabólico. Las ecuaciones de movimiento del proyectil son mx˙˙ = 0 ˙˙ = mg my donde t es el tiempo, ( x, y ) son las coordenadas de la posición del proyectil al tiempo t y g es la aceleración de la gravedad. Para resolver estas ecuaciones en MATLAB es necesario escribirlas como un sistema de ecuaciones diferenciales de primer orden. Si 373 374 10. A PLICACIONES EN F ÍSICA x 1( t ) = x ( t ) x2 ( t ) = y ( t ) x˙ 1( t ) = x˙ ( t ) = x 3 ( t ) x˙ 2 ( t ) = y˙ ( t ) = x 4 ( t ) coordenada x coordenada y componente x de la velocidad componente y de la velocidad entonces x˙ 1( t ) = x 3 ( t ) x˙ 2 ( t ) = x 4 ( t ) x˙ 3 ( t ) = x˙˙ ( t ) = 0 x˙ 4 ( t ) = y˙˙ ( t ) = - g Estas ecuaciones las podemos programar en una función como function xpunto = tiro_parabolico( t , x ) g = 9.8 ; % valor de la aceleración de la gravedad %Inicializar el vector de derivadas xpunto = zeros( 4, 1); xpunto (1) = x (3); xpunto (2) = x (4); xpunto ( 3) = 0; xpunto ( 4) = -9.8; y las podemos resolver con el siguiente archivo-m, % Archivo Ejemplo10_1.m % Este archivo resuelve las ecuaciones del movimiento del tiro parabólico %y grafica la trayectoria, y las coordenadas de posición v0=100;% velocidad inicial g = 9.8; % aceleración de la gravedad teta = pi/6; %ángulo de disparo de 30˚ % tiempo de 0 a 15 segundos tiempo = linspace ( 0, 10.21, 100 ); % condiciones iniciales x0 = [ 0 0 v0*cos( pi/6 ) v0*sin( pi/6 ) ]’; % llamado de la subrutina para resolver % el sistema de ecuaciones diferenciales [ t , x ] = ode23 ( ‘tiro_parabolico’, tiempo , x0 ); 10. A PLICACIONES EN F ÍSICA 375 % Gráfica de la altura vs. tiempo subplot(2,2,1) plot( t , x ( : , 2 ) ) grid on xlabel ( ‘tiempo’) ylabel ( ‘Altura’) legend ( ‘ Altura alcanzada vs. tiempo’ ) % Gráfica de la distancia vs. tiempo subplot(2,2,2) plot( t , x ( : , 1) ) xlabel ( ‘tiempo’) ylabel ( ‘Distancia’) legend ( ‘ Distancia alcanzada vs. tiempo’ ) % Gráfica de la trayectoria subplot(2,2,3) plot ( x (:,1), x(:,2)) grid on xlabel ( ‘Distancia horizontal’) ylabel ( ‘Altura’) legend ( ‘ Trayectoria del proyectil’ ) Después de correr el archivo obtenemos la gráfica de la figura 10.2 donde vemos cómo la altura empieza a aumentar pero finalmente decae hasta cero, la distancia siempre aumenta de forma lineal y la trayectoria es una parábola. Note las abcisas de las tres figuras. En las dos primeras es el tiempo y en la última es la distancia. De la gráfica podemos ver cuál es la altura máxima alcanzada, la que se puede comparar con la obtenida por la ecuación que se obtiene al resolver las ecuaciones de manera simbólica. Se puede demostrar que la altura máxima está dada por 2 h= v 0 sen g mientras que la distancia máxima en la dirección x está dada por 2 2 v sen xmax = 0 2 g 376 10. A PLICACIONES EN F ÍSICA Cambiando el ángulo de disparo y la velocidad inicial podemos ver cómo la altura y la distancia alcanzadas son diferentes. Entre más grande es el ángulo más corta es la distancia y entre más grande es la velocidad inicial más grande es la distancia alcanzada. Figura 10.2 Trayectoria del proyectil. EJEMPLO 10.2 Tiro parabólico considerando la resistencia del aire Consideramos la resistencia del aire en el tiro parabólico del Ejemplo 10.1. La resistencia del aire puede considerarse como una fuerza que se opone al movimiento del proyectil proporcional al cuadrado de la velocidad, la cual se puede modelar como r v r 2 v F = c v r v r donde c es una constante conocida y v es la velocidad. Las ecuaciones del proyectil de masa m son ahora mx˙˙ = 0 + Fx = 0 c x˙ 2 x˙ + y˙ ˙˙ = mg + Fy = mg c y˙ my 2 2 x˙ + y˙ 2 Rescribiéndolas como un sistema de ecuaciones diferenciales lineales se tiene que: 10. A PLICACIONES EN F ÍSICA 377 x˙ 1( t ) = x 3 ( t ) x˙ 2 ( t ) = x 4 ( t ) c ˙ ˙2 ˙2 c 2 2 x˙ 3 ( t ) = x˙˙ ( t ) = x x +y = x3 x3 + x4 m m g c x˙ 4 ( t ) = y˙˙ ( t ) = x 4 x 32 + x 42 m m Este sistema de ecuaciones diferenciales lineales se puede resolver usando cualquiera de las funciones ode23 y ode45, como se explicó en el Cap. 4. Para esto es necesario reescribir nuestro sistema para el Ejemplo 10.1 tomando en cuenta la resistencia del aire. Primero se define la siguiente función: function xpunto = tiro_parabolico_aire( t , x ) g = 9.8 ; % valor de la aceleración de la gravedad c = 0.001 ;% parámetro de la fuerza de resistencia del aire m = 1 ; % masa del proyectil %Inicializar el vector de derivadas xpunto = zeros( 4, 1); xpunto( 1) = x( 3); xpunto( 2) = x( 4); xpunto( 3) = -( c/m)*x( 3)*sqrt( x( 3)^2 + x( 4)^2); xpunto( 4) = - 9.8/m -( c/m)*x( 3)*sqrt( x( 3)^2 + x( 4)^2); El programa para llamar esta función es ahora % Archivo Ejemplo10_2.m % % Este archivo resuelve las ecuaciones % del movimiento del tiro parabólico con resistencia del aire % y grafica la trayectoria, y las coordenadas de posición v0=100;% velocidad inicial g = 9.8; % aceleración de la gravedad teta = pi/6; %ángulo de disparo de 30˚ % tiempo de 0 a 15 segundos tiempo = linspace ( 0, 6.5, 100 ); % condiciones iniciales x0 = [ 0 0 v0*cos( pi/6 ) v0*sin( pi/6 ) ]’; % llamado de la subrutina para resolver % el sistema de ecuaciones diferenciales [ t , x ] = ode23 ( ‘tiro_parabolico_aire’, tiempo , x0 ); 378 10. A PLICACIONES EN F ÍSICA % Gráfica de la altura vs. tiempo subplot(2,2,1) plot( t , x ( : , 2 ) ) grid on xlabel ( ‘tiempo’) ylabel ( ‘Altura’) legend ( ‘ Altura alcanzada vs. tiempo’ ) % Gráfica de la distancia vs. tiempo subplot(2,2,2) plot( t , x ( : , 1) ) xlabel ( ‘tiempo’) ylabel ( ‘Distancia’) legend ( ‘ Distancia alcanzada vs. tiempo’ ) % Gráfica de la trayectoria subplot(2,2,3) plot ( x (:,1), x(:,2)) grid on xlabel ( ‘Distancia horizontal’) ylabel ( ‘Altura’) legend ( ‘ Trayectoria del proyectil’ ) La figura 10.3 nos muestra el resultado. Aquí observamos que tanto la altura como la distancia han disminuido debido a la resistencia del aire. Podemos cambiar el ángulo y la velocidad inicial para apreciar el comportamiento del proyectil. Figura 10.3 Altura, distancia y trayectoria del tiro parabólico con resistencia del aire. 10. A PLICACIONES EN F ÍSICA 379 EJEMPLO 10.3 Péndulo simple Este es uno de los ejemplos más representativos en Física. Consideremos un péndulo de masa m que cuelga de un punto fijo por medio de una vara de longitud L como se muestra en la figura 10.4 y que se mueve en un ambiente viscoso que amortigua la velocidad y con un coeficiente de amortiguamiento de B Kg /m /s. El ángulo es el ángulo que hace la vara con la vertical. La velocidad de la masa entonces está dada por L ˙ y la fuerza tangencial para aumentar el ángulo está dado por: FT = w sen B L ˙ Figura 10.4 Péndulo de masa m. donde w es el peso dado por w = mg, g es la aceleración de la gravedad y las unidades del peso son Kg. Por la segunda ley de Newton FT = m dv = m L ˙˙ dt con lo que la ecuación diferencial que describe el movimiento es: m L ˙˙ + B L ˙ + w sen = 0 Si x(1) = y x(2) = ˙ (velocidad angular) entonces nuestra ecuación diferencial se puede reescribir como un sistema de dos ecuaciones diferenciales lineales como: # x˙ ( 1 ) = x ( 2 ) %% $ % x˙ (2) = B x ( 2 ) w sen [ x ( 1 ) ] %& m mL Estas ecuaciones las describimos en el archivo pendulo.m como: 380 10. A PLICACIONES EN F ÍSICA function xpunto = pendulo ( t, x ) W = 2; % peso del péndulo L = 0.6; % longitud de la vara B = 0.08; % coeficiente de amortiguamiento g = 9.8; % aceleración de la gravedad m = W/g; xpunto = [ x ( 2) -B/m*x( 2 )-W/( m*L )*sin( x (1) ) ]’ ; El script para describir los datos de entrada y de salida es entonces: % archivo Ejemplo10_3.m t0 = 0; % tiempo inicial tf = 10; % tiempo final x0 = [ pi/2 0 ]; % condiciones iniciales [ t, x] = ode45( ‘pendulo’, [ t0, tf], x0); plot ( t, x) legend ( ‘ángulo’ , ‘velocidad angular’) De la gráfica mostrada en la figura 10.5 vemos. que debido al amortiguamiento, el ángulo de oscilación y la velocidad angular empiezan a disminuir. Figura 10.5 Posición angular x(1) y velocidad angular x(2) del péndulo. 10. A PLICACIONES EN F ÍSICA EJEMPLO 10.4 381 Sistema masa-resorte-amortiguador Consideremos el sistema mecánico formado por una masa m que pende de un resorte y un amortiguador como se muestra en la figura 10.6. La constante del resorte es K y el coeficiente de amortiguamiento es B. La ley de Newton nos da la ecuación diferencial: 2 m d x dt 2 +B dx dt + Kx = f( t ) Figura 10.6 Sistema masa-resorteamortiguador. Para formar un sistema de ecuaciones diferenciales lineales a partir de esta ecuación, hacemos: x1(t) = x(t) x 2 (t ) = dx dx 1 ˙ = = x 1( t ) dt dt Entonces, # x˙ 1( t ) = x 2 ( t ) %% $ 1 % ˙ %& x 2 (t ) = f ( t ) B x 2 ( t ) K x1( t ) m Si m = 1 kg y el sistema está en reposo, aplicamos en t = 0 una fuerza f ( t ) de 5N, con un coeficiente de amortiguamiento de 0.35 N/m/seg y la constante del resorte k = 10 N/m. El sistema de ecuaciones diferenciales lineales se describe en el siguiente archivo-m : function xpunto = ma_re_am( t, x ) f = 5; % fuerza aplicada m = 1 ; % masa B = 0.35 ; % coeficiente de amortiguamiento K = 0.5 ; % constante del resorte xpunto = [ x( 2) (1/m)*( f - B*x(2) - K*x(1) )]’; 382 10. A PLICACIONES EN F ÍSICA Para este sistema podemos escribir el archivo-m como se muestra a continuación: %archivo Ejemplo10_4.m % sistema masa resorte amortiguador t0 = 0; tf = 30 ; x0 = [ 0 0 ]; [ t , x ] = ode45(‘ma_re_am’ , [ t0 , tf ] , x0 ); plot ( t , x ) legend(‘posición’,’velocidad angular’) La figura 10.7 muestra cómo la posición y la velocidad angular disminuyen conforme avanza el tiempo. Figura 10.7 EJEMPLO 10.5 Posición y velocidad angular de la masa m. Descenso de un paracaidista Supongamos que un paracaidista se lanza en caída libre desde un avión en el tiempo t = 0 seg, desde una altura h, y abre su paracaídas al tiempo t0. La dinámica es de la siguiente manera: para t = 0 seg la velocidad inicial es v(0) = vin = 0 y la altura es x(0) = h, en el intervalo de tiempo que va de t = 0 seg a t = t0, el paracaidista va en caída libre con una aceleración g. Entonces la velocidad es v = g t y la altura a la que se encuentra el paracaidista después de t segundos es x ( t ) = h - g t2/2. 10. A PLICACIONES EN F ÍSICA 383 En t = t0 seg se abre el paracaídas. En este momento las condiciones iniciales son, 2 v( t0 ) = g t0 y t x( t0 ) = h g 0 2 Para que el paracaidista no se estrelle en el suelo, se debe abrir el paracaídas en un 2 tiempo t0 tal que x (t0) > 0, es decir, cuando h > gt 0 / 2 o bien t0 < 2h/g. Cuando el paracaídas se abre, la velocidad disminuye debido a que la resistencia del aire se hace evidente con una fuerza de rozamiento proporcional al cuadrado de la velocidad y la ecuación del movimiento es: m dv 2 = mg + kv dt donde m es la masa del paracaidista y k es el coeficiente de rozamiento que depende de la densidad del aire, que es una función de la altura y al nivel del mar tiene un valor de 1.29 kg / m3, y del área transversal del paracaídas. Cuando la fuerza de rozamiento equilibra la fuerza de gravedad, el paracaidista alcanza una velocidad límite ya que la aceleración se hace cero y la ecuación de movimiento se modifica a: 0 = mg + kv 2 de donde vemos que la velocidad final es: vf = mg k Para resolver la ecuación de movimiento la escribimos como: dv k 2 = g + v dt m La función en MATLAB que describe esta ecuación es: function ecuacion = paracaidista ( t, v) ro = 1.29; h = 2000; A = 10; g = 9.8; m = 80; to = 15; ti = 0; k = 0.04*ro*A; ecuacion =- [-g + (k/m)*v.*v]; 384 10. A PLICACIONES EN F ÍSICA El programa principal es: % Archivo Ejemplo10_5.m to=10; t1=linspace(0,to,41); tf=30; t3=linspace(to,tf); g= 9.8; v1= g*t1; %x = h- ( g*t1.^2 )/2; plot ( t1, v1) xlabel( ‘ tiempo ( seg)’ ) ylabel ( ‘ Velocidad en caída libre’ ) axis( [ 0 30 0 100] ) fprintf( ‘ Pulse enter para continuar\n’ ) pause hold on v0= v1(41); [ t, v] = ode45( ‘paracaidista’, [ to, tf ], v0); plot(t,v) ylabel ( ‘ Velocidad total ‘ ) La figura 10.8 muestra cómo en el instante del salto se alcanzó la velocidad máxima y debido a la fricción por el paracaídas se llega a una velocidad final constante. a) b) Figura 10.8 Caída de un paracaidista. a) En caída libre, b) después de abrir el paracaídas. 10. A PLICACIONES EN F ÍSICA EJEMPLO 10.6 385 Cálculo de la órbita de un planeta Para calcular la órbita de un planeta de masa m alrededor del sol, suponemos que éste tiene una masa M tal que M m y que adicionalmente lo consideramos fijo en el espacio. Dado que este planeta obedece a las leyes de Newton, sólo usamos estas ecuaciones para calcular la órbita alrededor del sol. La fuerza F que se ejerce sobre el planeta se debe solamente a la ley de la gravitación universal: F = GMm r 2 Las componentes horizontal y vertical de la fuerza están dadas por: Fx = F x r Fy = F Usando la ley de la gravitación universal se reescriben como: Fx = GMmx Fy = GMmy r r 3 3 La segunda ley de Newton nos dice que: m m d vx Mmx = Fx = G 3 dt r d vy dt Mmy = Fy = G r que se reduce a: d vx dt d vy dt =GM x r =GM 3 y r 3 3 y r 386 10. A PLICACIONES EN F ÍSICA Como solamente estamos interesados en encontrar la trayectoria del planeta alrededor del sol, supondremos que la constante GM = 1 y que la posición inicial es ( x, y ) = ( 0.5, 0) y que la velocidad inicial es: v x ( 0) = 0 v y( 0 ) = 1.63 Las ecuaciones de movimiento se pueden reescribir como v y = x˙ , v y = y˙ , con lo que ˙˙x ( t ) = ˙˙y ( t ) = x ( x +y ) 2 3 /2 2 y (x + y ) 2 2 3 /2 Este sistema de ecuaciones se puede resolver con MATLAB si ponemos las ecuaciones como un sistema de ecuaciones diferenciales lineales. Esto es, si las reescribimos como # x1 = x % % % x = x˙ = x˙ = v ; x˙ = x˙˙ 1 x 2 2 % $ % % x3 = y % % & x 4 = y˙ = x˙ 3 = v y ; x˙ 4 = y˙˙ Con esto el sistema de ecuaciones diferenciales queda como # x˙ 1 = x 2 % % % ˙ x1 % x 2 = 2 2 3 /2 % x1 + x 3 % $ % x˙ = x 4 % 3 % % x3 % x˙ 4 = 2 2 3 /2 % x1 + x 3 & ( ) ( ) Este sistema de ecuaciones se puede describir en MATLAB mediante la función 10. A PLICACIONES EN F ÍSICA 387 function xpunto = xy ( t ,x ) % %Esta función forma el sistema de ecuaciones diferenciales . % xpunto( 1 ) = x( 2 ) ; xpunto( 2 ) = -x( 1 )/( x ( 1 )^2 + x ( 3 )^2 )^( 3/2 ) ; xpunto( 3 ) = x( 4 ) ; xpunto( 4 )= -x( 3 )/( x( 1 )^2 + x( 3 )^2 )^( 3/2 ) ; xpunto = xpunto’; % Lo hacemos el vector columna. El archivo-m para resolver las ecuaciones diferenciales y graficar la trayectoria que sigue un planeta es: %Archivo Ejemplo10_6.m % % Este archivo calcula la trayectoria de un planeta alrededor del sol. % x0 = [ 0.5 , 0 , 0 , 1.63 ] ; x = [ 0 0 0 0] ; [ t , x ] = ode23 ( ‘xy’ , [ 0 , 4 ] , x0 ) ; plot ( x ( : , 1) , x ( : , 3 ) ) grid on text ( -0.010 , 0 , ‘X SOL’ ) El la figura 10.9 se observa la trayectoria que sigue el planeta, la que se ve que es una trayectoria elíptica con el sol en uno de los focos, como lo establece la segunda ley de Kepler. Figura 10.9 Trayectoria de un planeta alrededor del sol. 388 10. A PLICACIONES EN F ÍSICA EJEMPLO 10.7 Órbita de mercurio Las ecuaciones de la órbita de Mercurio visto desde la tierra están dadas por las siguientes ecuaciones paramétricas x( t ) = 93 cos( t ) + 36 cos( 4.15 t ) y( t ) = 93 sen( t ) + 36 sen( 4.15 t ) Estas ecuaciones las podemos graficar con el siguiente archivo % Archivo Ejemplo10_7.m %Este archivo grafica la órbita de mercurio % visto desde la tierra % Intervalo de tiempo t = [ 0 : pi/360 : 2*pi*22/3 ]; x = 93* cos( t ) + 36*cos ( t * 4.15 ); % coordenada x y = 93* sin( t ) + 36*sin ( t * 4.15 ); % coordenada y % para especificar una gráfica cuadrada axis ( ‘square’ ) % graficación de x vs. y plot ( y , x ) axis ( ‘normal’ ) El resultado se muestra en la figura 10.10 Figura 10.10 Órbita de Mercurio. 10. A PLICACIONES EN F ÍSICA 389 EJEMPLO 10.8 Carga eléctrica de una carga puntual El campo eléctrico de una carga puntual Q está dado por: E(r ) = 1 Q 4 / 0 r 2 donde r es la distancia desde el origen al punto donde queremos evaluar el campo eléctrico. Si sólo queremos observar las líneas de campo, podemos normalizar el campo eléctrico con respecto a Q / 4/0 y escribir entonces la ecuación: En (r ) = 1 E(r ) 1 = 2 = 2 2 1/2 Q r (x + y ) 4/0 donde x,y son las coordenadas del punto r. Las componentes de los vectores unitarios entonces están dadas por: xˆ = cos yˆ = sen donde = tan 1 y x De esta manera las componentes Ex, Ey del campo normalizado son: Ex = En xˆ Ey = En ŷ Para graficar el campo eléctrico de las ecuaciones anteriores usamos una instrucción quiver de la siguiente manera: –primero definimos valores de x,y con: [x, y]= meshgrid (-10: 2: 10); –Luego usamos quiver con: quiver( x,y, Ex,Ey) –Indicamos la posición de la carga puntual con: text (0,0,’0’) 390 10. A PLICACIONES EN F ÍSICA El archivo m completo es: % Este es el archivo Ejemplo10_8.m % Este archivo grafica el campo eléctrico de una carga puntual. % Se usan los valores de x,y [ x, y ] = meshgrid (-5:1.25:5); %warning off MATLAB:divideByZero E = 1./(x.^2 + y.^2); %Se definen los vectores unitarios [unitario_x ] = cos ( atan2 (y, x)); [unitario_y ] = sin ( atan2 (y, x)); % Componentes Ex, Ey Ex = E.* unitario_x; Ey = E.* unitario_y; % Se obtiene la gráfica quiver ( x, y, Ex, Ey ) text ( 0, 0, ‘0’ ) xlabel ( ‘Eje x’ ) ylabel ( ‘Eje y’ ) title ( ‘Campo eléctrico de una carga puntual’ ) Figura 10.11 Campo eléctrico de una carga puntual. 10. A PLICACIONES EN F ÍSICA 391 Si la carga es negativa entonces a la ecuación del campo eléctrico se le añade un signo negativo: E = -1. / (x.^2 + y.^2) El resultado para una carga positiva se muestra en la figura 10.11. La magnitud del campo eléctrico lo indica el tamaño de las flechas y entre más lejos estemos de la carga más pequeño será el campo eléctrico. EJEMPLO 10.9 Campo magnético de un alambre con corriente directa Consideremos un alambre longitudinal que lleva una corriente I. Este alambre produce un campo magnético dado por: r μ r r B = 0 2 I xr 2r donde la x denota producto vectorial. Como sabemos, las líneas de campo forman círculos concéntricos centrados en el alambre como se muestra en la figura 10.12. r Si el alambre sale del plano del papel, las líneas del campo B estarían sobre la hoja, es decir solo tendríamos componente z de la corriente: r r r r I = Ik y el producto vectorial de I y r es r r r r r r i j k r r B = I × r = 0 0 I =I ( y i + x j ) x y 0 Figura 10.12 Líneas de campo en un alambre con corriente I. 392 10. A PLICACIONES EN F ÍSICA con lo que el campo está dado por r r r μ I B = 0 2 ( y i + x j ) 2r rr donde i , j son los vectores unitarios en las direcciones x,y respectivamente, y (x,y) r son las coordenadas del radio vector r . Para graficar el campo magnético en MATLAB entonces primero definimos los valores de x,y con: [x,y]=meshgrid(-20:4:20); r luego calculamos los valores de las componentes del vector B , las cuales normalizamos a μ0I / 2. Entonces Bx y By están dadas por: Bx = y. / (x.^2 + y.^2); By = x. / (x.^2 + y.^2); Finalmente graficamos con quiver como: quiver(x, y, Bx, By) El archivo final se muestra a continuación: % Archivo Ejemplo10_9.m % Este archivo grafica las líneas del campo magnético % producidas por la corriente I que circula por un alambre % longitudinal que sale del plano de la pantalla. % Valores de x,y [x, y] = meshgrid (-20 : 4 : 20); % Componentes del vector del campo magnético B. % La componente B2=0 Bx = -y ./ (x.^2 + y.^2); By = x. / (x.^2 + y.^2); % Se obtiene la gráfica. quiver(x, y, Bx, By) text( 0, 0, ‘0’) xlabel(‘Eje x’) ylabel(‘Eje y’) title(‘Campo magnético producido por una corriente I’) 10. A PLICACIONES EN F ÍSICA 393 La figura 10.13 muestra las líneas del campo magnético creado por la corriente que circula por el alambre visto de frente con la corriente saliendo del plano del papel. Figura 10.13 Campo magnético producido por un alambre que lleva una corriente I. EJEMPLO 10.10 Momento magnético La energía potencial magnética de un sistema paramagnético donde M es la magnetización en un campo H, está dada por [ 1 ] M = NgμBJB J (a ) donde BJ(a) es la función de Brillouin, definida por 1 1 1 1 a B J (a ) = J + coth J + a coth 2 2 2 2 J donde J toma valores discretos, a está dada por a= gμBH kT μB es el magnetón de Bohr y tiene un valor de 0.927x10-27 erg, g es el factor de Landé y es igual a 2 y N es el número de iones magnéticos. Para graficar tanto la función de Brillouin como la magnetización usamos el siguiente archivo-m: 394 10. A PLICACIONES EN F ÍSICA % Este es el archivo Ejemplo10_10.m % Calcula la funcion de Brillouin y la magnetización. a=[ eps : 0.1 : 4 ]; J=[ 1/2 3/2 5/2 7/2 ]; %figure for d = 1:4 B = 2*J(d)*((J(d)+.5)*coth((J(d)+.5)*a)-(.5*coth(.5*a)))*1/J(d); B( 1 )=0; plot( a, B ); hold on end hold off Title( ‘Función de Brillouin’ ) ylabel( ‘BJ(a)’ ) xlabel( ‘a’ ) legend( ‘J = 1/2’, ‘J = 3/2’, ‘J = 5/2’, ‘J = 7/2’ ) J=[ 3/2 5/2 7/2 ]; figure for d = 1:3 M = 2*J(d)*((J(d)+.5)*coth((J(d)+.5)*a)-(.5*coth(.5*a)))*1/J(d); M( 1 )=0; plot( a, M ); hold on end hold off Title( ‘Función de Magnetización por dipolo magnético’ ) ylabel( ‘M/NuB’ ) xlabel( ‘H/T, 10^4 Oe/Kelvin’ ) legend( ‘J = 3/2’, ‘J = 5/2’, ‘J = 7/2’ ) Figura 10.14 Función de Brillouin. 10. A PLICACIONES EN F ÍSICA 395 Una gráfica de BJ(a) para distintos valores de J se muestran en la figura 10.14. Una gráfica de M/NμB vs. H/T se muestra en la figura 10.15 para valores de J que corresponden al Gadolino. Figura 10.15 Magnetización por dipolo magnético vs. H/T. EJEMPLO 10.11 Patrón de difracción Una pantalla con dos rendijas sobre la cual incide un frente de onda como en la figura 10.16, produce un patrón de difracción sobre una pantalla. Si el ancho de las rendijas es a separadas una distancia d y la longitud de onda es , el patrón de difracción que se produce está dado por: I( ) = Im (cos - ) sen7 7 d sen 7= 2 2 donde: -= a sen El siguiente archivo-m sirve para graficar el patrón de difracción, 396 10. A PLICACIONES EN F ÍSICA % Este es el archivo Ejemplo10_11.m % Grafica los patrones de difracción para % un par de rendijas. teta = [ -pi/8 :0.001 : pi/8 ]; lambda = 1; d = 50*lambda; a = [ lambda 5*lambda 7*lambda 10*lambda ]; for i = 1:4; beta = pi*d*sin( teta )/lambda; alfa = pi*a(i)*sin ( teta )/lambda; I = cos( beta ).^2.*( sin(alfa)./alfa ).^2; subplot( 2,2,i) plot ( teta, I ) xlabel( ‘teta’ ) ylabel( ‘Intensidad’ ) if i == 1; legend( ‘a = 1’) elseif i == 2; legend( ‘a = 5’) elseif i == 3; legend( ‘a = 7’) elseif i == 4; legend( ‘a = 10’) end end Figura 10.16 Esquema para producir difracción Si graficamos la ecuación para la intensidad I( ) vemos que el patrón de difracción se puede graficar. La figura 10.17 muestra tres patrones de difracción para el caso de a = , a = 5 y a = 10 . Vemos que conforme se aumenta el ancho de la rendija entonces se vuelve muy dominante el factor (sen7/7)2, conocido como factor de difracción. 10. A PLICACIONES EN F ÍSICA Figura 10.17 397 Patrones de difracción a) a = , b) a = 5 , y c) a = 10 . EJEMPLO 10.12 Sistema masa-resorte-amortiguador en SIMULINK En el ejemplo 10.4 ya resolvimos este sistema que da lugar a una ecuación diferencial. La ecuación resultante la escribimos como un sistema de dos ecuaciones simultáneas lineales. En este caso usaremos SIMULINK para resolver el problema. Para este propósito usamos la ecuación diferencial del sistema: 2 m d x dt 2 +B dx + k x = f( t ) dt la cual escribimos como: 2 d x 1 dx = f( t ) B k x dt m dt Esta ecuación se puede modelar en SIMULINK como se muestra en la figura 10.18. Los valores de las constantes son iguales a los del Ejemplo 10.4 y son m = 1 kg, k = 10 N/m, B = 0.1 N/m/seg y la fuerza aplicada es de 5 N y se aplica solamente en t = 0, es decir, es un impulso de valor 5 N. 398 10. A PLICACIONES EN F ÍSICA Figura 10.18 Sistema masa-resorte-amortiguador modelado en SIMULINK. Al correr la simulación de nuestro modelo obtenemos la figura 10.19 que es una gráfica similar a la figura 10.7. Figura 10.19 Respuesta del sistema masa-resorte-amortiguador en Simulink. Referencias [1] M.W. Zemansky, Heat and Thermodynamics, Mc Graw-Hill, Book Co., New York, 1968 pp. 450-453. Aplicaciones en Contaduría y Finanzas Las finanzas, al igual que las ingenierías, hacen uso extenso de matemáticas. Por lo tanto MATLAB es apropiado para realizar funciones en contaduría y finanzas. En este capítulo presentamos algunos ejemplos que muestran la posibilidad de usar MATLAB para realizar cálculos matemáticos en dichas áreas. Empezamos con ejemplos que se programan o ejecutan directamente en MATLAB. La segunda parte de este capítulo muestra el uso de algunas funciones del paquete financiero de MATLAB denominado Financial Toolbox. Con esto el lector se puede dar una idea del potencial de MATLAB para usarse en contabilidad y finanzas. En este capítulo usaremos la siguiente convención: en negritas lo que el usuario escribe en la ventana de trabajo de MATLAB y en letra normal lo que MATLAB calcula. EJEMPLO 11.1 Interés simple y compuesto El interés se define como la manifestación del valor del dinero en el tiempo. El interés se calcula, exclusivamente a partir del capital o principal, de la siguiente manera para n periodos: Interés simple = (capital)(n)(% Tasa de Interés) El interés compuesto se calcula sobre el capital más el monto total del interés en todos los periodos anteriores, por lo tanto el interés compuesto es un interés sobre el interés, y se calcula con la siguiente expresión. Interés compuesto = ( capital + total de interés acumulado )( % Tasa de Interés ) =(capital ) ( 1 + % Tasa de Interés )n Supongamos ahora que una empresa hace un préstamo de $10,000 a un empleado con una tasa de interés anual de 15%. Calcule la deuda total después de cuatro años. Para el interés simple IS = (10000)*(4)*(.15) 6000 Para el interés compuesto IC = (10000)*(1.15) ^4 1.7490e+004 Para comparar se puede visualizar en una gráfica de barras. 401 402 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS y = [ IS, IC ]; bar ( y ) title( ‘Interés simple e interés compuesto’ ) Con esto se obtiene la gráfica de la figura 11.1. A esta gráfica le hemos añadido texto usando InsertText box en el menú de la figura. Figura 11.1 Comparación del interés simple y el interés compuesto. EJEMPLO 11.2 Valor acumulado El valor acumulado M de un capital que gana intereses simples con una tasa I por periodo al final de N periodos es: M = C ( 1+ N I ) Para un préstamo de $5000.00 con 6% de interés trimestral ¿cuánto se paga en dos años? En dos años se tienen 8 trimestres por lo que N = 8. Además I = 0.06 y C = 5000. Entonces M = 5000 ( 1 + ( 8*0.06 ) ) = 7400 En un año se tienen 4 trimestres por lo que los pagos son por M = 5000 ( 1 + ( 4*0.06 ) ) = 6200 11. A PLICACIONES C ONTADURÍA Y F INANZAS 403 El archivo–m que realiza este cálculo y además proporciona una gráfica del monto acumulado en el transcurso de los N periodos es: % Este es el archivo Ejemplo11_2.m % calcula el valor acumulado M. % Los datos son el capital C, el interés I por periodo y el número de % periodos N. % Entrada de datos: clear C = input(‘ Dame el valor de C ’) N = input ( ‘Dame el número de periodos N ’ ) Ipc = input ( ‘Dame los intereses por periodo I en % ‘ ) I = Ipc/100; i = [ 1 : 1 : N ]; m(i) = C*( 1 + i*I ); fprintf ( ‘El valor acumulado es’ ) M = m(N) plot ( i, m ) xlabel ( ‘Número de periodos’ ) ylabel ( ‘ Valor acumulado’ ) La salida en la ventana de trabajo de MATLAB es: >> Dame el valor de C 5000 C= 5000 >> Dame el número de periodos N 8 N= 8 >> Dame los intereses por periodo I en % 6 Ipc = 6 El valor acumulado es M= 7400 La gráfica del monto acumulado se muestra en la figura 11.2. 404 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS Figura 11.2 Valor acumulado. EJEMPLO 11.3 Valor acumulado e interés simple anual Se desea saber el interés simple anual para que en 16 meses se duplique una inversión. En este caso el capital C se duplica por lo que el monto acumulado será M = 2 C. Usando N = 16 meses la ecuación para el monto acumulado será: 2 C = C ( 1+ 16 I ) de donde I= M/C 1 2 1 = = 0.0625 = 6.25% N 16 Para obtener el interés anual se tiene 6.25% * 12 = 75% El siguiente archivo calcula el interés anual teniendo como datos N, C y M. % Este es el archivo Ejemplo11_3.m % Calcula el valor acumulado dados el monto % acumulado M y el número de meses N. close all clear clc 11. A PLICACIONES C ONTADURÍA Y F INANZAS 405 C = input( ‘Dame el capital inicial\n’); M = input( ‘Dame el monto acumulado\n’); N = input( ‘Dame número de meses\n’); fprintf ( ‘ Interés mensual\n’) Im = ( ( M/C-1 )/N )*100 fprintf ( ‘ Interés anual\n’) Ia = 12*Im Como ejemplo se muestra el caso siguiente: >> Dame el capital inicial 2000 >> Dame el monto acumulado 3000 >> Dame número de meses 18 Interés mensual Im = 2.7778 Interés anual Ia = 33.3333 EJEMPLO 11.4 Anualidades Una anualidad se define como una sucesión de pagos, depósitos o retiros, que se realizan en periodos iguales con interés compuesto. Por otro lado la renta de una anualidad es el pago, depósito o retiro que se hace periódicamente y se denota con R. Aunque existen varios tipos de anualidades no se entrará en más detalles, para el lector que desee profundizar en el tema puede consultar las referencias al final de este capítulo. Se puede demostrar que el monto acumulado M en n años con np depósitos anticipados, donde p es el número de depósitos por año, está dado por: np 1+ i 1 p i M = R 1+ p i p 406 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS Supóngase ahora que al nacer un hijo, los padres desean pagar una renta mensual para tener disponibles $ 6 millones al cumplir el hijo los 7 años de edad. La tasa nominal es de 2%. El que la tasa sea nominal significa que es capitalizable cada mes. Las variables del problema son entonces p np M R i 12 72 6,000,000 2 % = 0.02 periodos por año periodos totales en 7 años monto acumulado en los 7 años pago periódico y es la incógnita interés Debemos entonces resolver para R. Esto lo hacemos así: syms x p =12; np = 72 M = 6e6; i = 0.02; R = solve (M-x*( 1 + i/p )*(((1+ i/p)^(np))-1)/(i/p)); R=double(R) Lo que produce un valor de R R= 7.8372e+004 Es decir, se requiere realizar pagos mensuales de $ 78,372 para ahorrar la cantidad deseada de $ 6,000,000 durante 72 meses. Podemos ahora generar una gráfica donde la cantidad a ahorrar es fija pero el número de meses es variable. Para esto usamos el siguiente archivo-m: % Este es el archivo Ejemplo11_4.m % Calcula el pago mensual para ahorrar % cierta cantidad cuando el número de meses es variable. clear clc close all syms x % Datos p =12; np = 72; M = 6e6; i = 0.02; j = 10:1:100; 11. A PLICACIONES C ONTADURÍA Y F INANZAS 407 for k = 1: length(j); r = solve (M-x*( 1 + i/p )*(((1+ i/p)^(j(k)))-1)/(i/p)); R( k )= double(r); end plot( j, R ) grid on xlabel( ‘número de meses o periodos’ ) ylabel( ‘ pago por periodo’ ) La gráfica resultante se muestra en la figura 11.3. Hemos indicado el caso de 72 periodos que coincide con el resultado previamente calculado. Figura 11.3 Pagos por periodo cuando la cantidad de periodos es variable. EJEMPLO 11.5 Monto acumulado con interés simple El monto acumulado M de np depósitos periódicos con interés simple, está dado por: M = R (np )[1 + (i 2 p )(1 + np )] donde R n p i es el depósito o pago al inicio de cada periodo es el plazo en años es el número de periodos comprendidos en un año es la tasa de interés simple anual. 408 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS Nuestro problema plantea lo siguiente: ¿qué cantidad debe invertir cada semana durante dos años un empleado que pretende acumular $ 5,000 en una cuenta bancaria que le reditúa el 0.8% simple semanal? El plazo es n = 2 años y el monto acumulado M es $ 5 000, como los depósitos son semanales p = 52 y el total de pagos es np = 104. La tasa debe ser anual, por lo tanto i = (52)* 0.008 = 0.416 La incógnita es el depósito semanal y se obtiene despejando R de la igualdad siguiente que resulta de sustituir la ecuación anterior 5000 = R (104 )[1 + (.416 104 )(1 + 104 )] 5000 = R (104 )(1.42 ) 5000 147.68 R = 33.8569 R= Significa que el empleado deberá invertir sólo $33.86 al inicio de cada semana para acumular los 5000 pesos. El siguiente archivo-m calcula esto: % Este es el archivo Ejemplo11_5.m % Este archivo calcula la cantidad que debe % invertirse semanalmente durante % dos años para acumular $5000.00. % La tasa de interés simple es 0.8% semanal. % El plazo es de dos años. close all clear clc format bank n=2; % número de años M=5000; % capital acumulado deseado. p=52; % número de pagos por año. np=2*p; % total de pagos en el plazo indicado. i=0.008*p; % interés anual. R=fsolve(@funcion,1e4) 11. A PLICACIONES C ONTADURÍA Y F INANZAS 409 La función es: function f=funcion(R) n=2; M=5000; p=52; np=2*52; i=0.008*52; f=5000-R*n*p*(1+(i/np)*(1+np)); La ventana de trabajo de MATLAB proporciona el siguiente resultado que coincide con el resultado previo: R= 33.86 EJEMPLO 11.6 Valor futuro con interés simple ¿Durante cuánto tiempo deberá invertir $250 un estudiante al inicio de cada trimestre que pretende acumular $ 3000 para ayudarse con los gastos de su graduación? Suponga que el tipo de interés es del 28% anual. Los valores para reemplazar la ecuación son: M = 3 000.00 R = 250.00 i = .28 p=4 El valor futuro de la inversión El depósito trimestral La tasa de interés anual. los cuatro trimestres en un año. El plazo en años es n que se despeja de la siguiente igualdad 3000=250(n)(4)[1+(0.28/8)(1+4n)] Simplificando aún más se llega a la siguiente ecuación cuadrática 0.14n2+(1.035)n-3=0 de donde se obtienen dos valores para n n1=2.227 y n2=-9.620 410 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS Dado que sólo puede haber solución positiva el resultado es n1.. El siguiente archivo-m calcula y grafica el valor futuro de la inversión como se muestra en la figura 11.4, mientras que en la figura 11.5 se presenta una gráfica de pie con el porcentaje del valor futuro total por trimestre. % Este es el archivo Ejemplo11_6.m % Este archivo calcula la cantidad que debe invertirse semanalmente % durante dos años para acumular $3000.00 % La tasa de interés simple es 0.8% semanal % El plazo es de dos años. close all clc clear R = 250; M=3000; % Valor futuro deseado. p=4; % número de pagos por año. %np=2*p; % total de pagos en el plazo indicado. i=0.28; % interés anual. n=fsolve(@funcion,1e4)%número de años. trimestres=4*n; % número de trimestres ntrimestres=ceil(trimestres) jj=[1:ntrimestres]; %for ii=1:ntrimestres; M=R*jj.*(1+(i/(2*p)).*(1+jj)); %end plot(jj,M) xlabel( ‘trimestres’ ) ylabel( ‘Valor futuro’ ) figure pie(M) title( ‘ % del valor futuro total por trimestre’ ) La función f es: function f=funcion(n) R = 250; M=3000; % capital acumulado deseado. p=4; % número de pagos por año. %np=2*p; % total de pagos en el plazo indicado. i=0.28; % interés anual. f=M-R*n*p*(1+(i/(2*p))*(1+n*4)); 11. A PLICACIONES C ONTADURÍA Y F INANZAS 411 Figura 11.4 Valor futuro. Figura 11.5 Porcentaje del valor futuro por trimestre. EJEMPLO 11.7 Interés compuesto Cuando hablamos de interés compuesto nos referimos al caso donde el interés se añade al capital para generar a su vez intereses. La ecuación básica es: c f = ci (1 + r ) np 1 donde ci r n p cf es el capital inicial es la razón de crecimiento es el número de años es el número de periodos por año es el capital final Como una aplicación del interés compuesto consideremos la producción de cierto artículo que deja utilidades por 10 millones en el año 2000 y se mantienen incrementos del 5% anual. Se desea saber la utilidad en el año 2009. Entonces la razón de crecimiento es r = 0.05. Como 2000 es el primer año, 2009 es el décimo año por lo tanto n = 10, ci = 10,000,000 = 107. Como se considera cada año sin periodos, entonces p = 1. Nuestra ecuación se programa en el siguiente archivo-m: 412 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS % Este es el archivo Ejemplo11_7.m % Calcula el interés compuesto. close all clc clear format bank % datos: Ci = 1e6; % Capital inicial. r = 0.07; % Razón de crecimiento. n = 10; % Número de años. p = 1; % Periodos por año. % Cálculo de la utilidades netas: Cf = Ci*( 1 + r )^( n*p-1 ) n = [ 1:1:10 ]; for k = 1:length( n ); Cf( k ) = Ci*( 1 + r )^( n( k )*p-1 ); end bar ( n, Cf ) xlabel( ‘ Número de años’ ) ylabel( ‘ Utilidades’ ) El resultado en la ventana de trabajo es Cf = 1838459.21 que es la utilidad en el décimo año. También se produce una gráfica donde se observa el comportamiento de las utilidades con respecto al número de años. Figura 11.6 Comportamiento de las utilidades. 11. A PLICACIONES C ONTADURÍA Y F INANZAS 413 EJEMPLO 11.8 Utilidades después de varios años Las utilidades después de varios años se pueden calcular sumando las utilidades de cada año a partir de la aportación inicial del capital tomado como año cero. Se puede demostrar que la función apropiada es 1 (1 + r ) n S = Ci 1 (1 + r ) donde Ci r n es el capital inicial es la razón de crecimiento es el número de años Para el ejercicio anterior se tiene Ci = 10 106, r = 0.05, n = 10. Entonces, n S = Ci 10 1 (1+ r ) 6 1 (1 + 0.05) = 10 × 10 = 8925.36 1 (1+ r ) 1 (1+ 0.05) En MATLAB esto se calcula con Ci= 10e6; r = 0.05; n = 10; S = Ci*( 1-( 1 + r )^n)/( 1- ( 1 + r )) para obtener S= 125778925.36 Esto se puede comparar con el aumento de capital si se usara interés simple donde el aumento de capital es constante en cada año y está dado por Cf (cada año) = 10 e6 (1+r) 414 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS Para los 10 años Cf_total = 10e6 *( 1 + r ) * 10 que produce Cf_total = 105000000.00 EJEMPLO 11.9 Saldos insolutos En operaciones a plazos, el saldo insoluto después del k-ésimo pago está dado por S = (np k + 1) C np donde: S np C es el saldo número total de abonos deuda original Por ejemplo, para saldar una deuda que se va a pagar en 24 mensualidades de $800, después de 8 meses se decide incrementar la mensualidad a $1200. Los intereses son del 42 % simple anual y el enganche fue del 40 % del costo inicial. Se desea saber en cuantos pagos se cancela la deuda y el costo de contado del artículo motivo de la deuda. Primero hallamos el costo de la deuda usando la ecuación S= C I 1+ (1+ np)] np 2p con S = 800, np = 24 pagos mensuales, I = 42 % = 0.42, n = 2 años y p = 12 meses, entonces tenemos que 800 = C 0.42 (1+ 24)] 1+ 24 2 × 12 Aunque es fácil encontrar el valor de C vamos a usar la instrucción solve como 11. A PLICACIONES C ONTADURÍA Y F INANZAS 415 syms C C =solve( 800-( C/24 )*( 1+( 0.42/( 2*12 ) )*(1+24 ) ) ); C = double( C ) % Conversión de variable simbólica a numérica. C= 13356.52 que es el valor del capital. El saldo insoluto después de 8 mensualidades es entonces S = (np k 1)* c / np) que en MATLAB nos da S = ( npk1 )*c/np S= 3339.13 EJEMPLO 11.10 Interés global La tasa de interés global en operaciones a plazos con interés simple está dada por g= i (1+ np) 2p donde g i p n es la tasa de interés global la tasa de interés simple anual es el número de pagos por año es el plazo en años. Ahora se desea investigar qué es más conveniente al comprar un automóvil cuyo costo es de $ 50 000.00 con un interés global de 33% o con interés simple de 22% anual, a pagar en 36 mensualidades. Tomando el interés simple se tiene i = 0.22 tasa de interés simple. p = 12 pagos por año. n=3 número de años. 416 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS Entonces para MATLAB tenemos: i = 0.22; p = 12; n = 3; G = i/(2*p)* (1+n*p) G= 0.3392 Vemos que el interés simple de esta forma es 33.92%, el cual es mayor que el interés global de 33% que se cobre. Entonces por lo tanto es preferible comprar con interés global. EJEMPLO 11.11 Flujo de efectivo Un problema frecuente en finanzas es el cálculo de flujo de efectivo y la manera en que éste varía. La ecuación básica es Flujo neto = Flujo de entrada – Flujo de salida Esto es equivalente a la ecuación diferencial dP( t ) = Flujo de entrada Flujo de salida dt donde P(t) es la cantidad de dinero que cambia con el tiempo. Cuando el dinero está depositado en una cuenta bancaria, en algunos casos el interés se acumula de manera continua y en otros de manera discreta. Por ejemplo, un ahorrador desea invertir una cantidad desconocida de dinero en una cuenta donde el interés se acumula de manera continua. Suponiendo que no se realiza ningún depósito ni retiro durante 5 años, se desea saber qué interés debe ganar anualmente para que la cantidad se duplique en el periodo indicado. Si P es la cantidad depositada inicialmente y r es la tasa de interés, entonces tenemos que dP( t ) = rP dt donde P(0) = P0. Esta ecuación diferencial se puede resolver en MATLAB con el siguiente conjunto de instrucciones: 11. A PLICACIONES C ONTADURÍA Y F INANZAS 417 S = dsolve( ‘DP -r*P = 0’, ‘P(0)=Po’ ) con lo que obtenemos la solución: S= Po*exp( r*t ) Como deseamos r para que la inversión se duplique en 5 años, entonces t = 5, S = 2Po: r = solve( ‘2*Po -Po*exp( r*5 )’ ) lo que nos da el resultado r= 1/5*log( 2 ) el cual convertimos a valor numérico con r=double(r) r= 0.1386 o en tanto por ciento r = double(r)*100 r= 13.8629 lo que equivale a 13.86%. EJEMPLO 11.12 Interés continuo El día que nace Naomi su abuelo ofrece regalarle $ 2,000,000 para sus gastos universitarios cuando cumpla 18 años. Contrata una inversión que paga 6.25 % de interés anual continuo. Sin dar un depósito inicial pero depositando una cantidad fija cada año, se desea saber cuál es el monto del depósito anual para ahorrar la cantidad deseada. 418 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS En este caso r = 0.0625 ( 6.25 % ) y d es el flujo por el depósito en pesos/año. La ecuación diferencial es en este caso dP( t ) = r P+D dt y P(0) = 0. Como en el ejemplo anterior, usamos dsolve para resolver esta ecuación diferencial: S = dsolve( ‘DP -r*P = d’, ‘P(0)=0’ ) que nos da la solución simbólica S= -d/r+exp(r*t)*d/r pretty(S) d / r + exp(r t ) d r Sustituyendo los valores de r, S y t en la solución, calculamos d con, d = solve( ‘1e6 = -d/0.0625+exp(0.0625*18)*d/0.0625 ‘ ) que nos regresa d= 30044.944608783306082858135481384 Para convertir a cantidad numérica, format bank d = double( d ) d= 30044.94 Entonces, el pago anual debe ser de $ 30,044.94. 11. A PLICACIONES C ONTADURÍA Y F INANZAS 419 EJEMPLO 11.13 Interés continuo y discreto Lucero abre una cuenta bancaria con un depósito inicial de $ 2000 con una tasa anual de interés de 5 %. Cada año deposita $ 1000. Se desea saber el saldo después de 10 años si: a) los intereses se capitalizan de manera continua y se hace un solo depósito de $ 1000 por año o b) si el interés se capitaliza cada trimestre y se realizan cuatro depósitos trimestrales de $ 250 cada uno por año. Caso a Los datos son r = 0.05 (el interés de 5%), d = 1000 (depósito anual), Po = 2000 (el depósito inicial). La ecuación diferencial es dP( t ) = r P+D dt que se resuelve con S = dsolve( ‘DP -r*P = d’, ‘P(0)=Po’ ) que nos da la solución: S= -d/r+(d+Po*r)/r*exp(r*t) Para calcular el valor numérico usamos syms Po r t d Total = subs( S, { r, Po, t, d }, { 0.05, 2000, 10, 1000 }) para obtener: Total = 16271.87 Caso b En este caso, se puede demostrar que el balance al final después de n periodos es n qd r qd P(t ) = Po + 1+ r q r 420 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS que en MATLAB se calcula con: % datos Po = 2000; r = 0.05; t = 10; d = 250; n = 40; q = 4; % Calculo del saldo P = ( Po + q*d/r )*( 1 + r/q )^n - q*d/r P= 16159.63 En este ejemplo es mejor hacer depósitos de $ 1000 / año. 11.2 El Paquete Financiero de MATLAB, Financial Toolbox En esta sección presentamos ejemplos con algunas de las más de 100 funciones disponibles en el Financial Toolbox. Sólo se desea mostrar el potencial de MATLAB para cálculos matemáticos en operaciones financieras. EJEMPLO 11.14 Seguros con ingreso fijo Consideremos un bono cupón cero con valor nominal F, madurez de un año y con precio P el día de su emisión. La ganancia o retorno es R donde R= F P La razón de ganancia es F r = R 1= 1 P que se puede escribir como P= F 1+ r 11.2 E L PAQUETE FINANCIERO DE MATLAB. F INANCIAL T OOLB OX 421 Si F y r están fijos, la ecuación anterior se puede interpretar como una fórmula de descuento. En el caso de un flujo de efectivo, es decir, tenemos una serie de pagos periódicos Pt que se realizan en tiempos discretos t = 0, 1, 2,...,n, el valor presente del flujo de efectivo es n VP = (1C+ r) t t t =0 En el caso de que los pagos ocurran con más frecuencia, por ejemplo, si hay m pagos por año, realizados a intervalos regulares, la ecuación anterior se cambia a n VP = (1+ Cr/ m) t k k =0 donde k cambia para cada periodo y n es el número de años por el número de pagos por año. Ahora consideremos el caso de un bono con una serie de cupones asociados Ct, t = 1, 2,..., n. La razón de ganancia de retorno se define como el valor de r que hace el valor presente igual a cero, es decir, n (1+C0) = 0 t t t =0 Con el cambio de variable h = 1/(1+r), la ecuación se transforma en n C h = 0 t t t =0 Para calcular el valor de r resolvemos esta ecuación en MATLAB con roots. Si el flujo de efectivo es [ -100 8 8 8 8 108 ], un procedimiento completo es cf = [ -100 8 8 8 8 108 ]; % flujo de efectivo. cf = fliplr ( cf ); % intercambiar términos de derecha a izquierda. h = roots ( cf ) % Cálculo de las raíces. ro = 1./h-1 con lo que MATLAB nos entrega 422 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS h= -0.8090 + 0.5878i -0.8090 - 0.5878i 0.3090 + 0.9511i 0.3090 - 0.9511i 0.9259 ro = -1.8090 - 0.5878i -1.8090 + 0.5878i -0.6910 - 0.9511i -0.6910 + 0.9511i 0.0800 De las 5 raíces que se obtienen, cuatro son complejas y una es real. La raíz real es la que nos da la razón de ganancia como r = 0.08. Todo esto que hicimos para calcular la razón de ganancia se puede obtener muy fácilmente usando el paquete de Finanzas (Financial toolbox) con la instrucción irr de la siguiente manera: cf = [ -100 8 8 8 8 108 ]; % flujo de efectivo. ro = irr ( cf ) ro = 0.0800 EJEMPLO 11.15 Valor presente La instrucción pvvar calcula el valor presente de una serie con una razón de descuento. Por ejemplo, podemos calcular el valor de un bono a 5 años con valor nominal de 100 y una razón de cupón de 8 % y de 9 %. Para cf = [ 0 8 8 8 8 108 ] se tiene cf = [ 0 8 8 8 8 108 ] ; pvvar ( cf, 0.08 ) % razón de 8 %. para obtener: ans = 100.0000 pvvar ( cf, 0.09 ) % razón de 9 %. 11.2 E L PAQUETE FINANCIERO DE MATLAB. F INANCIAL T OOLB OX 423 para obtener: ans = 96.1103 El flujo de efectivo tiene un cero en la primera posición ya que se recibe el cupón al final del primer año. EJEMPLO 11.16 Calidad del cambio de precio Dada una serie de flujos de efectivo que ocurren en los tiempos t1, t2,..., tn, la duración de la serie se define como D= PV( t 0 )t 0 + PV( t1 )t1 + PV( t 2 )t 2 + ... + PV( tn )tn PV donde PV es el valor presente de la serie y PV(ti) es el valor presente del flujo de efectivo ci que ocurre en el tiempo ti, i =1, 2,..., n. Para el caso de un bono cupón cero que es un flujo de efectivo simple, la duración es simplemente el tiempo de madurez o vencimiento. Cuando consideramos un bono genérico usamos la ganancia como la razón de descuento al calcular los valores presentes para obtener la duración de Macaulay, suponiendo m pagos por año: n mk (1+ c / m) k k D = k =1n (1+ c / m) k k k =1 La derivada del precio con respecto a la ganancia está dada por n ck k ck = k m (1+ / m)k +1 1+ / m) ( k =1 k =1 n dP d = d d Ahora definimos una duración modificada DM=D/(1+ /m) con lo que dP = DMP d 424 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS De este resultado vemos que la duración modificada está relacionada con la pendiente de la curva precio-ganancia. Una mejor aproximación se obtiene con la convexidad C definida por 2 C= 1d P P d2 que para un bono con m cupones por año es n 1 C= P(1+ / m)2 k (mk + 1) (1+ c / m) k 2 k k =1 Usando la duración modificada y la convexidad podemos escribir una aproximación a 6P como 6P * DMP6 + 2 PC (6) 2 Ahora supongamos que tenemos una cadena de cuatro flujos de efectivo ( 10, 10, 10, 10) que ocurren en los tiempos t =1, 2, 3, 4. Podemos calcular el valor presente de esta serie con diferentes ganancias usando la función de MATLAB pvvar como: flujo_efec = [ 10 10 10 10 ]; %Cálculo de valor presente con ganancia 5 %. p1 = pvvar( [ 0, flujo_efec ], 0.05) p1 = 35.4595 %Cálculo de valor presente con ganancia 5.5 %. p2 = pvvar( [ 0, flujo_efec], 0.055) p2 = 35.0515 p2-p1 ans = -0.4080 En este ejemplo hemos añadido un 0 enfrente del flujo de efectivo ya que la función pvvar supone que el primer flujo de efectivo ocurre en el tiempo t = 0. Vemos que aumentar la ganancia por 0.005 da como resultado una caída en el precio de 0.4080. Ahora podemos calcular la duración y la convexidad usando las funciones de MATLAB cfdur y cfconv: 11.2 E L PAQUETE FINANCIERO DE MATLAB. F INANCIAL T OOLB OX 425 flujo_efec = [ 10 10 10 10 ]; [ d1 dm ] = cfdur ( flujo_efec, 0.05) d1 = 2.4391 dm = 2.3229 convexidad = cfconv ( flujo_efec, 0.05 ) convexidad = 8.7397 %Cálculo de valor presente con ganancia 5 %. p1 = pvvar( [ 0, flujo_efec ], 0.05) p1 = 35.4595 Primer_orden = -dm*p1*0.005 Primer_orden = -0.4118 Segundo_orden = -dm*p1*0.005 + 0.5*convexidad*p1*0.005^2 Segundo_orden = -0.4080 Vemos que para cambios pequeños en la ganancia, la aproximación de primer orden es adecuada, pero la aproximación de segundo orden es prácticamente exacta. EJEMPLO 11.17 Bonos con ganancia fija MATLAB tiene instrucciones para proporcionar la fecha y la hora. Para esto se usa datestr(today) y datestr(now) con los que se obtiene: 426 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS datestr(today) ans = 06-Oct-2004 datestr(now) ans = 06-Oct-2004 22:40:01 En el cálculo de ganancias es necesario el uso de estas funciones. Para calcular la ganancia de un bono se puede emplear la función de MATLAB bndprice. El formato de esta función es [Precio, Interés ] = bndprice( Ganancia, Porcentaje, Emisión, Vencimiento ) El Precio es el precio limpio al que se le debe añadir el interés ganado para obtener el precio real ( o sucio). Por ejemplo, para una Ganancia de 8 % y un Porcentaje de 10 %, una fecha de emisión de 10-Agosto-2007 y fecha de vencimiento de 31Diciembre-2020, se dan los datos como: [ Precio, Interes_obtenido ] = bndprice( 0.08, 0.1, ’10-aug-2007’, ‘31-dec-2020’) para obtener en MATLAB: Precio = 116.2366 Interes_obtenido = 1.1141 Precio+ Interes_obtenido ans = 117.3507 Ahora consideremos dar un vector de ganancias definido por 11.2 E L PAQUETE FINANCIERO DE MATLAB. F INANCIAL T OOLB OX 427 ganancia = [0.01 : 0.001 : 0.2 ]; Al repetir el cálculo de bndprice con un porcentaje de 5 % obtenemos un vector de Precio y un vector de interes. Una vez obtenido esto podemos graficar el precio real con ganancia = [0.01 : 0.001 : 0.2 ]; [Precio, interes ] = bndprice( ganancia, 0.05, ’10-aug-2007', ’31-dec-2020' ); plot ( ganancia, Precio + interes ) grid on xlabel (‘Ganancia’ ) ylabel (‘Precio real’ ) lo que produce la gráfica de la figura 11.7. Figura 11.7 Gráfica de precio real vs. Ganancia. Referencias [1] L. Blank y A. Taskin, Ingeniería Económica,Mc Graw Hill Interamericana, México, DF, 2004. [2] J. L. Villalobos, Matemáticas Financieras, Grupo Editorial Iberoamérica, México, DF, 1993. 428 11. A PLICACIONES EN C ONTADURÍA Y F INANZAS [3] P. Brandimarte, Numerical Methods in Finance, J. Wiley & Sons, Nueva York, 2003. [4] M. J. Miranda y P. L. Fackler, Applied Computational Economics and Finance, MIT Press, Cambridge, MA, 2002. [5] A. Belmonte, Personal finance, Modeling and applications, en sitio web: calclab.math. tamu.edu/ ~belmonte/m308/z/L/C3/L33.pdf Apéndice Comandos para operadores lógicos y aritméticos ^ Realiza la exponenciación. & Realiza el AND lógico. ~ Realiza el NOT lógico. | Realiza el OR lógico. * Realiza la multiplicación. En el caso de matrices, éstas necesitan tener las dimensiones adecuadas. .^ Realiza la potenciación de matrices término a término. .* Realiza multiplicación de vectores y matrices término a término. ./ Operación de división de vectores y matrices término a término. / Operación de división. Para matrices es equivalente a multiplicar la primera por la inversa de la segunda. \ División de matrices. Divide a la segunda matriz entre la primera, esto es A\B=B/A XOR Realiza el OR exclusivo lógico. 429 430 A PÉNDICE Comandos para interfases gráficas de usuario GUI’S Ejes coordenados en una GUI. Instrucciones asociadas a una GUI. Botón de elección en una GUI. Cuadro de edición en una GUI. Extensión de una de las partes de la GUI. Marco en una GUI. Interfase Gráfica de Usuario. Herramienta de MATLAB para crear GUIs. Caja de lista en una GUI. Parte del área de diseño donde aparece la lista de componentes que se pueden usar en una GUI. Popup Menu Botón de aparición de menú desplegable en una GUI. Property Inspector Inspector de propiedades de un control de una GUI. Push Button Botón de presión en una GUI. Radio Button Botón radial en una GUI. Slider Barra de deslizamiento de una GUI. Static Text Cuadro de texto estático en una GUI. String Nombre que despliega un control en una GUI. Tag Nombre asociado a un control en el callback de una GUI. Toggle Button Botón de activación/desactivación en una GUI. uicontrol Nombre genérico de las partes o controles de una GUI. Axes callback Checkbox Edit Text fig Frame GUI GUIDE Listbox Palette Comandos de SIMULINK Continuous Create Subsystem Discrete Filter Gain Inport Integrator Math mux Outport Pulse Generator Scope SIMULINK Sine Wave Sinks Biblioteca de operadores analógicos en SIMULINK. Comando para crear un subsistema en SIMULINK. Bloque de filtro discreto en SIMULINK. Bloque de ganancia en SIMULINK. Puerto de entrada de un subsistema en SIMULINK. Bloque integrador en SIMULINK. Biblioteca de operadores matemáticos en SIMULINK. Bloque de SIMULINK para multiplexar señales. Puerto de salida de un subsistema en SIMULINK. Bloque generador de pulsos en SIMULINK. Bloque de SIMULINK para visualizar formas de onda. Herramienta para simular sistemas. Bloque de SIMULINK para generar ondas senoidales. Biblioteca de sumideros en SIMULINK. A PÉNDICE Sources Start Step Stop time Transfer Fcn Unit Delay 431 Biblioteca de fuentes en SIMULINK. Inicia una simulación en SIMULINK. Señal de escalón en SIMULINK. Tiempo final en una simulación en SIMULINK. Bloque de función de transferencia en SIMULINK. Bloque de retardo en SIMULINK. Comandos para la realización de gráficas axis Axis Properties bar bode clabel compass contour contour3 ezplot figure figure(h) fplot freqs freqz gca(h) gcbf gcbo gcf(h) gco grid grid off grid on handle handles.capital hidden off hist hold off Permite especificar valores iniciales y finales de los ejes de una gráfica. Sirve para cambiar los límites de los ejes de una gráfica. Se usa desde el menú Edit de la figura. Permite obtener una gráfica de barras. Realiza las gráficas de Bode (magnitud y fase). Da valores numéricos de altura a una gráfica de contorno. Permite obtener una gráfica de brújula. Permite obtener una gráfica de contornos en dos dimensiones. Permite obtener una gráfica de contornos en tres dimensiones. Sirve para graficar una función simbólica. Comando para abrir una nueva ventana de figura. Comando para abrir una nueva ventana para la figura h. Sirve para graficar una función simbólica en un intervalo determinado. Grafica la respuesta en frecuencia de una función de transferencia analógica. Grafica la respuesta en frecuencia de una función de transferencia discreta. Despliega el identificador de los ejes de la figura h. Proporciona el identificador de la figura del objeto actual. Proporciona el identificador del objeto actual. Despliega el identificador de la figura h. Despliega el identificador del objeto actual. Genera una rejilla en una ventana de gráfica. Le quita la rejilla a una gráfica. Le añade una rejilla a una gráfica. Identificador de un objeto. Identificador del objeto con el nombre capital. Permite hacer transparente una gráfica de malla. Permite obtener una gráfica de tipo histograma. Cancela el hold on. 432 A PÉNDICE hold on impulse legend mesh meshc meshgrid meshz peaks pie plot(x,y) plot3 polar quiver semilogx set(h) shading flat shading interp stairs stem step subplot surf surfl text title view waterfall xlabel ylabel zlabel Permite graficar más de una función en la misma gráfica. Grafica la respuesta al impulso. Identifica cada curva con una cadena en una gráfica. Permite obtener una gráfica tridimensional de malla. Permite obtener una gráfica de malla con contorno. Obtiene una matriz de valores para las coordenadas x, y. Permite obtener una gráfica de malla con contorno y plano cero. Función interna de MATLAB de tres dimensiones. Permite obtener una gráfica de tipo pie. Realiza la gráfica de y vs. x. Permite obtener una gráfica tridimensional. Permite obtener una gráfica de una función en coordenadas polares. Permite obtener una gráfica de contorno con líneas direccionales. Realiza una gráfica semilogarítmica. El eje x está en una escala logarítmica. Cambia las propiedades de la figura h. Elimina las líneas negras en una gráfica de superficie. Suaviza los colores en una gráfica de superficie. Permite obtener una gráfica de tipo escalera. Realiza una gráfica de puntos. Grafica la respuesta al escalón. Comando para desplegar varias gráficas en una misma ventana. Permite obtener una gráfica de superficie. Permite obtener una gráfica de superficie con iluminación. Escribe un texto sobre una gráfica. Genera un título en la ventana de una gráfica. Permite cambiar el ángulo de visualización de una figura. Permite obtener una gráfica de tipo cascada. Permite escribir un enunciado en el eje x de una gráfica. Permite escribir un enunciado en el eje y de una gráfica. Permite escribir un enunciado en el eje z de una gráfica. Comandos para el manejo de matrices cross det(A) diag(A) Calcula el producto cruz o vectorial de dos vectores. Calcula el determinante de la matriz A. Forma un vector con los elementos de la diagonal principal de la matriz A. A PÉNDICE dot eig eye(m,n) eye(n) fliplr gradient inv(A) jordan length linspace(a,b,n) logspace(a,b,n) lu norm norm(A) ones(m,n) ones(n) rank(A) trace(A) transpose(A) zeros(m,n) zeros(n) 433 Calcula el producto punto o escalar de dos vectores. Obtiene los eigenvectores (vectores propios) de una matriz. Matriz de dimensión mn donde todos los elementos de la diagonal principal son la unidad y los demás son cero. Matriz identidad cuadrada de orden n. Invierte el orden de los elementos de un vector de izquierda a derecha. Obtiene el gradiente de una matriz. Calcula la matriz inversa de la matriz A. Convierte una matriz a la forma canónica de Jordan. Calcula la longitud de un vector. Genera un vector con punto inicial a, punto final b y n puntos. Vector de n puntos donde el primer punto es 10 a, el último es 10b, y los n puntos están espaciados logarítmicamente. Obtiene la factorización LU de una matriz. Calcula la norma de una matriz o de un vector. Calcula la norma de la matriz A. Matriz de dimensión mn donde todos los elementos son la unidad. Matriz cuadrada de orden n donde todos los elementos son la unidad. Calcula el rango de la matriz A. Calcula la traza de la matriz A. Suma de los elementos de la diagonal principal. Calcula la transpuesta de la matriz A. Matriz de dimensión mxn donde todos los elementos son cero. Matriz cuadrada de orden n donde todos los elementos son cero. Comandos para cálculos matemáticos acker ceil conj conv Cycle Usa la fórmula de Ackermann para calcular la ganancia de retroalimentación necesaria para colocar los polos en el lugar deseado. Redondea al siguiente entero mayor un número. Obtiene el complejo conjugado de un número complejo Realiza la multiplicación de dos polinomios. Opción dentro de funtool para evaluar distintas operaciones de las funciones dadas. 434 A PÉNDICE deconv diff diff(f,n) double dsolve eval eval expand feedback feval fft filter floor fmincon fourier funtool fzero fzero ifft ifourier ilaplace imag int int(f,a,b) iztrans laplace limit linsolve lsim minreal num2str ode23 Realiza la división de dos polinomios. Calcula la derivada de una expresión simbólica. Evalúa la n-ésima derivada de f. Convierte una variable simbólica a una variable numérica. Resuelve una ecuación diferencial o un sistema de ecuaciones diferenciales de manera simbólica. Sirve para evaluar una función simbólica. Evalúa una expresión. Desarrolla algebraicamente una expresión simbólica. Realiza un sistema de retroalimentación. Evalúa una función simbólica en un valor dado de la variable independiente. Evalúa la transformada rápida de Fourier de una secuencia. Se utiliza para filtrar una señal. Redondea hacia el siguiente entero menor un número. Algoritmo de optimización para obtener el mínimo de una función con restricciones. Evalúa la transformada de Fourier de una función. Función de MATLAB para visualizar el comportamiento de funciones simbólicas. Calcula las raíces de una expresión simbólica. Evalúa los ceros de una función. Evalúa la transformada rápida de Fourier inversa de una secuencia. Evalúa la transformada inversa de Fourier de una función. Evalúa la transformada inversa de Laplace de una función. Obtiene la parte imaginaria de un número complejo Evalúa la integral de una expresión simbólica. Evalúa la integral definida de f entre los límites a y b. Evalúa la transformada-z inversa de una transformada-z. Evalúa la transformada de Laplace de una función. Calcula el límite de una función. Resuelve un sistema de ecuaciones simultáneas expresadas en forma matricial. Simula la respuesta en el tiempo de sistemas lineales e invariantes en el tiempo. Cancela términos comunes en una función de transferencia. Convierte un valor numérico a una cadena de caracteres. Archivo-m interno de MATLAB para resolver numéricamente ecuaciones diferenciales. A PÉNDICE ode45 optimset pole polyfit(x,y,n) polyval(p,x) pretty randn real residue(m,n) residue(r,p,k) rlocus roots round simplify solve spline sqrt ss ss2tf str2double str2num subs sym syms symsum tf tf2ss trapz unreal ztrans 435 Archivo-m interno de MATLAB para resolver numéricamente ecuaciones diferenciales. Parámetros de un proceso de optimización. Calcula los polos de un sistema Obtiene los coeficientes de un polinomio de grado n que pasa por los puntos (x,y). Evalúa un polinomio p en el valor de x. Despliega una expresión algebraica como en el editor de ecuaciones. Genera una secuencia aleatoria de puntos. Obtiene la parte real de un número complejo Realiza el desarrollo en fracciones parciales de un cociente de polinomios m(x) y n(x). El resultado que arroja son los residuos r, los polos p y una constante k. Obtiene los polinomios m(x) y n(x) que tienen el desarrollo en fracciones parciales dados por los residuos r, los polos p y la constante k. Calcula el lugar geométrico de los polos de un sistema. Calcula las raíces de un polinomio. Redondea al entero más cercano. Simplifica una expresión simbólica. Resuelve una ecuación expresada de manera simbólica. Obtiene un spline que se aproxima a los puntos (x,y). Calcula la raíz cuadrada de un número o de una variable simbólica. Obtiene la representación en variables de estado de un sistema. Convierte una representación de variables de estado a función de transferencia. Asigna un valor numérico de doble representación a una cadena de caracteres numéricos. Convierte una cadena de caracteres a un valor numérico. Sustituye una variable simbólica con un valor numérico. Declara una variable como simbólica Declara una variable como simbólica Comando para calcular el límite de una serie. Realiza la función de transferencia. Convierte una función de transferencia a representación de variables de estado. Evalúa una integral numéricamente usando la regla trapezoidal. Permite que una variable real pueda definirse como compleja. Evalúa la transformada-z de una secuencia. 436 A PÉNDICE Comandos para manejo de archivos csv csvwrite fclose feof fopen fread fscanf fwrite sound type wavread Extensión de un archivo cuyos datos están separados por comas. Escritura de datos separados por comas (coma separated values). Permite cerrar un archivo. Fin de archivo (end of file). Permite abrir un archivo. Se usa para leer archivos binarios. Lee caracteres de un renglón de un archivo. Se usa para escribir en archivos binarios. Sirve para ejecutar un archivo de sonido en formato wav. Permite ver el contenido de un archivo-m. Indica que se lea un archivo de sonido en formato wav. Comandos para la ventana de trabajo clc clear clear a close all help Help Navigator mhelp set path Limpia la ventana de trabajo de MATLAB. Borra todas las variables que se hayan definido. Borra la variable a. Cierra todas las ventanas de figuras que estén abiertas. Proporciona la ayuda disponible para las funciones disponibles en MATLAB. Es la ventana de ayuda para todos los tópicos de MATLAB. Se abre con el icono de ayuda. Proporciona la ayuda disponible para las funciones de Maple que se pueden usar desde MATLAB. Permite cambiar el directorio de trabajo de una sesión. Comandos del paquete de finanzas bndprice cfconv cfdur irr vvar Función del paquete financiero de MATLAB para calcular la ganancia de un bono. Función del paquete financiero de MATLAB para calcular la convexidad de una serie. Función del paquete financiero de MATLAB para calcular la duración de una serie. Función del paquete financiero de MATLAB para calcular la razón de ganancia. Función del paquete financiero de MATLAB para calcular el valor presente de una serie con una razón de descuento. A PÉNDICE 437 Comandos para programación elseif for function global if-else-end if-end input nargin nargout output pause return while Permite checar distintas condiciones dentro de un if-end. Se usa para realizar cálculos repetitivos donde sólo cambia un índice. Nombre de archivos-m donde se define una expresión matemática. Permite que una variable esté disponible para cualquier archivom dentro de la sesión. Realiza las instrucciones entre if y else si se cumplen las condiciones después del if y realiza las condiciones después del else si no se cumplen esas condiciones. Realiza las instrucciones entre if y end si se cumplen las condiciones. Instrucción para aceptar datos de entrada. Número de variables de entrada en una función. Número de variables de salida en una función. Instrucción para escribir datos de salida a un archivo o a la ventana de trabajo. Le indica a MATLAB que se detenga y que espere hasta que el usuario le indique que continúe ejecutándose. Permite salir de una función antes de terminar de ejecutar todas sus instrucciones. Repite un conjunto de instrucciones un número indeterminado de veces. Comandos para tiempo y fecha clock cputime date datestr(now) datestr(today) tic toc Proporciona un vector con la fecha y la hora. Indica cuanto tiempo ha estado funcionando MATLAB. Proporciona una cadena con la fecha. Calcula la fecha y hora. Calcula la fecha. Inicia un conteo de tiempo. Finaliza el conteo de tiempo iniciado con tic. Índice A %, 169 abs, 18, 132, 283 acimut, 158 acker, 308 Activación, 211 alphabetical list, 55 and lógico, 170 archivo binario, 197 archivos-m, 167 arreglos de celdas, 106 ASCII, 200 Autoscale, 251 Axes, 211, 230 Axes properties, 140 axis, 140 axis properties, 69 ayuda, 36 Basic Fitting, 72 Plot residuals, 72 Show equations, 72 Tools, 72 Bessel, función, 118 Besselj, 118, 119 Biblioteca de fuentes, 241 binario, 198 bode, 271, 272 botón de presión, 211 C C, 15, 19 cadena, 34 cadenas, 23-25 call by value, 185 callback, 209, 210, 213, 214, 220 carácter, 34 case, 174 categorical list, 55 ceil, 49 celdas, 106 cell arrays, 107 clabel, 157 B Background color, 213 bar plot, 72 bar, 142 barra de deslizamiento, 234 439 440 Í NDICE clc, 263 clear, 20, 263 clock, 79, 80 close, 214, 219 close all, 263 códigos de archivos, 190 comma separated values, 203 command history, 15, 31 window, 15 compass, 145 compensación, 299 complejo conjugado, 48 concatenar, 24 condición inicial, 250 conexión, 244 configuration parameters, 245, 249 conj, 48 continuidad, 113 contour, 155 contour3, 155 control toolbox, 297 conv, 64, 65, 290 convolución, 290 cordic, 316 cos, 18, 22 cputime, 79, 80 Create M-File, 31 subsystem, 254 cross, 97 csv, 203 csvread, 205 csvwrite, 203 current directory, 15, 16 cycle, 51 char, 197, 221 Checkbox, 212 D date, 79, 81 data types, 107 deconv, 65 delete, 163 delimitadores, 201 delimited, 202 derivada, 50, 116, 117, 118 det, 89 diag, 89 diary, 27, 28, 29 diff, 50, 116, 119, 221, 284 distinto de, 170 doble precisión, 34 dot, 96 double, 72, 197 dsolve, 123, 124, 125, 127 E ecuación de Bird, 264 ecuaciones diferenciales, 123, 269 edgecolor, 152 edit text, 211 Edit Text, 212, 216, 225 eig, 103 eigenvalores, 103 eigenvectores, 103 elementary functions, 17, 38 elevación, 158 elfun, 17 elseif, 173 emisor común, 313 Enable, 213 end, 169 end_of_file, 195 end_of_line, 195 entero, 34 eps, 18, 19, 23, 151 espacio de trabajo, 15 estructura de los gráficos, 159 estructuras, 104 eval, 77, 78, 221, 227, 228 EXCEL, intercambio de datos, 201 exp, 18 Í NDICE expand, 49 eye, 90 ezplot, 53, 54 F factorial, 177, 179, 180, 188 factorización LU, 101 fclose, 190, 192, 195 fecal, 77, 78 feedback, 297, 301, 302, 303, 306 feof, 195 fft, 291, 293 Fick, 321 figure, 159 filter, 296 fliplr, 275 floor, 49 flota, 197 fontname, 162 fontsize, 162 FontSize, 22 fopen, 189, 191, 192, 194 for anidado, 177 for, 176 formas de Jordan, 102, 104 format, 19 formato de escritura, 193 FORTRAN, 15, 19 fourier, 288 Fourier transformada, 287 transformada discreta, 291 fplot, 53, 54 fprintf, 33, 34, 35, 173, 192, 285 fracciones parciales, 66 Frame, 211 fread, 197 freqz, 295 fscanf, 195 full adder, 310 funciones, 46 elementales, 17, 38 recursivas, 188 441 function, 75, 179 function, estructura, 169 funtool, 51, 52 fwrite, 197 fzero, 75, 76 G gca, 162 gcbf, 214, 219 gco, 163 get, 232 global, 270 gráfica en tres dimensiones, 148 de barras, 142 de brújula, 145 de contorno, 155 de escalera, 143 de histograma, 144 de malla, 151 de pie, 146 de puntos, 144 de superficie, 153 de superficie con sombreado, 154 gráficas de magnitud y fase, 271 polares, 141 grid, 62 grid on, 136 GUI, 209, 210 GUIDE, 209, 210 H handle, 159, 190 help, 16, 36, 37, 38, 39 contents, 39 index, 39 search, 39, 55, 68 search, favorites, 39 search, go, 39 hidden off, 152 442 Í NDICE hist, 144, 314 historia de los comandos, 15 hold off, 133 on, 133 Hubble, 304 I i, 18 identificador, 159, 190 identificadores de archivos, 190 de ejes, 162 if-else-end, 172 if-end, 169 ifft, 291, 293 ifourier, 288 igual a, 170 ilaplace, 288 imag, 46 impulse, 276 incremento, 21, 176 Inf, 18 Inport, 255 input, 35, 187, 270 inspector de propiedades, 211 int, 50, 119, 124 integración, 119 integral, 50 interfase gráfica, 209 inv, 89 ítem, 63, 290 iztrans, 289 J j, 18 jerarquía de objetos, 163 jordan, 104 L laplace, 287 Laplace, transformada, 287 legend, 22, 134 length, 25, 290 Library Browser, 241 limit, 111, 113, 114 límite lateral, 111, 114 límites, 111 de sucesiones, 112 line plot, 72 linsolve, 100 linspace, 54, 62, 69, 71, 98, 131, 136, 232, 283 Listbox, 212 ln, 18 load, 30 log, 18 log10, 18 logspace, 99, 135 long, 197 lookfor, 41 lower, 25, 27 lsim, 280, 281 lu, 101, 102 llamar por valor, 185 M matriz, 85 determinante, 89 división, 86, 88 fila, 85 inversa, 89 multiplicación, 86, 87 norma, 89 potencias, 88 rango, 89 renglón, 85 resta, 86, 87 submatriz, 86 suma, 86, 87 transpuesta, 89, mayor que o igual a, 170 mdl, 245 menor que, 170 mesh, 23, 151, 275, 282, 283 Í NDICE meshc, 152 meshgrid, 23, 151, 283 mhelp, 58, 61 minreal, 308 modelo de Simulink, 245 MonteCarlo, 313 mux, 241, 243 N NaN, 18, 19 nand, 310 nargin, 188 nargout, 188 navegador de ayuda, 55 no igual a, 170 norm, 89, 95 not, 170 notación exponencial, 34 num2str, 25, 26 números aleatorios, 314 O ODE23, 127 ODE45, 127, 128 ones, 90 opciones de gráficas, 137 open block, 245 operadores de relación, 170 or, 310 exclusivo, 170 lógico, 170 Outport, 255 P parte imaginaria, 46 real, 46 Pascal, 15 pause, 78 pcolor, 156 peaks, 155 pi, 18, 21 pie, 146 plot, 21, 22, 54, 131 plot3, 149 polar, 141 pole, 298 polinomios, 61 poly, 63 polyder, 66 polyfit, 68, 69, 70, 71, 319 polynomial, 68 polyval, 61, 62, 69, 70, 320 Popup Menu, 212 Ports & subsystems, 256 precedencia, 17 precision, 197 pretty, 50, 124, 285 producto cruz, 97 escalar, 96 vectorial, 96 property inspector, 211 propiedades, 212 de un objeto, 162 pseudocolor, 156 punto de observación, 158 fijo, 34 flotante, 34 inicial, 21 Push Button, 211, 216, 218 Q quiver, 157 R Radio Button, 211, 230 rand, 314 rank, 89 reacción química, 261 real, 46 residue, 67 residuo, 67 443 444 Í NDICE respuesta al escalón, 273, 276 al impulso, 273 en frecuencia, 295 return, 186 rlocus, 298, 301 roots, 63 root locus, 298 round, 49 S save, 30 scatter plot, 72 Scope, 241, 245, 247 scripts, 167 segundo grado, ecuación, 181 semilogx, 135 sen, 18, 21, 22 sensitividad, 284 series, 122 sesión, 27 Set Path, 169 set, 162 setstr, 200 shading flat, 154 interp, 154 short, 197 simulation, 245, 249 SIMULINK, 241 sin, 17, 21, 22, 23, 132 Sine wave, 241 sinks, 241 sistemas de segundo orden, 271 Slider, 212 sobretiro, 305 solve, 74, 99, 127 sound, 78, 79 sphere, 153 spline, 71 sqrt, 18, 23 ss, 308 ss2tf, 280 stairs, 143 start, 245 Static Text, 211, 216, 222 status, 190 stem, 144 step, 273, 274 stop time, 245 str2num, 25, 26, 232, 233 strcomp, 25, 26 String, 213 strrep, 25, 26 subgráfica, 147 subplot, 147 subs, 265, 284, 285 Subsistemas, 253, 254, 256 Subsystem, 256 sumador digital, 310 surf, 153 surfl, 154 switch-case, 174 sym, 47, 48 syms, 47, 48, 49, 50, 284 symsum, 122 T Tag, 213, 224, 225, 230 tan, 18 text, 139 tf, 297, 302, 303, 306 tf2ss, 277, 279 tic, 79, 81 title, 22, 134 toc, 79, 81 Toggle Button, 212 trace, 89 transpose, 89 trapz, 267 type, 167 U unidad imaginaria, 18 Í NDICE unreal, 49 upper, 25, 27 view, 158 VisualBasic, 15 V valor final, 21 valores propios, 103 separados por comas, 203 variables, 45 de estado, 277 globales, 185 simbólicas, 47 tamaño, 45 vector, 86 vectores, 91 división, 93 multiplicación, 91 norma, 95 propios, 102, 103 ventana de ayuda, 16 de comandos, 15 del directorio de trabajo, 15 W waterfall, 156 wavread, 78, 79 which, 42 while, 178 whitebg, 139 X xlabel, 22, 134 xor, 170, 310 Y ylabel, 22, 134 Z z, transformada, 289 zeros, 90 zlabel, 153 zp2ss, 308 ztrans, 289 445