Subido por jesus alvarez

MaLaApInFiFi (DaBaLo06)

Anuncio
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: [email protected]
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: [email protected].
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
Descargar