Introducción a MATLAB 7 - personal.us.espersonal.us.es/jcortes/Material/Material_archivos/Material...
Transcript of Introducción a MATLAB 7 - personal.us.espersonal.us.es/jcortes/Material/Material_archivos/Material...
Introducción a
MATLAB 7
José Cortés Parejo – 2012
Departamento de Matemática Aplicada I E.T.S. Ingeniería Informática Universidad de Sevilla
1- Interfaz, Comandos y Funciones 1
1.1 Interfaz 1
Ventanas 2 Utilización de MATLAB como calculadora científica 3
1.2 Comandos, Funciones y Ficheros m 4
Comandos y Funciones del Sistema 4 Ficheros m 5 Comandos help y doc 6
1.3 Entorno MATLAB 7
Directorio activo 7 Directorios/Carpetas auxiliares 8 Ficheros de arranque 9 Guardar y recuperar sesiones 9
2- Escalares, Vectores y Matrices 11
2.1 Operando con números
Formatos numéricos 11 Variables numéricas 11 Variables de entorno 12 Expresiones algebraicas 12 Operadores aritmétricos,relacionales y lógicos 12 Operador “2 puntos” (:) 13 Funciones escalares elementales 14
2.2 Vectores y Matrices 14
Vectores 15 Matrices 17 Submatrices y grupos de elementos 17 Matrices predefinidas 18 Operaciones con Vectores y Matrices 19 Operaciones elemento a elemento 20
2.3 Funciones Vectoriales y Matriciales 21
Productos escalar y vectorial 22 Funciones auxiliares 22 Funciones matemáticas auxiliares 22
2.4 Otros tipos de entidades matemáticas 23
Hipermatrices 23 Polinomios 23 Cadenas de caracteres 24
Indice
3- Programación 26
3.1 Ficheros m 26
Scripts 26 Functions 27 Sub-Funciones 28 Variables Locales y Globales 28 Puntos de ruptura (breakpoints).
3.2 Bucles 29
Bucles for 29 Bucles while 30
3.3 Bifurcaciones 31
Sentencia if/else 31 Sentencia switch/case/otherwise 32 Sentencia switch/otherwise (p. 65).
3.4 Ruptura de la ejecucuón 33
Sentencia break 33 Sentencia continue 33 Sentencia return 34
3.5 Entrada/Salida de datos 34
Entrada/Salida interactiva 35 Funciones fopen/fclose 35 Funciones fprintf/fscanf 36
4- Gráficos 2D/3D 37
4.1 Gráficos vectoriales 2D 37
Definición de una Ventana o Marco 37 Definición de una Ventana virtual 38 Función axis 40 Función hold 40 Función de dibujo plot 42 Especificación del color 43 Relleno de polígonos 44
4.2 Gráficos vectoriales 3D 45
Cámara virtual 45 Funciones de definición de Cámaras 46 Implementación de una Cámara 46 Función de dibujo plot3 47 Funciones de relleno 47 Funciones para representación de Mallas 48
Referencias 49
MATLAB es un entorno de trabajo científico‐técnico que incorpora asimismo potentes funciones gráficas para visualización 2D y 3D. Su nombre deriva de la contracción de las palabras MATrix LABoratory y en efecto, su sistema de trabajo está basado en matrices y vectores, aunque muchas veces no sea evidente esta circunstancia. Existen en el mercado otras aplicaciones similares, como Mathematica o Maple, aunque éstas se especializan más en el cálculo y manipulación simbólica, mientras que MATLAB despliega toda su potencia en el cálculo numérico, disponiendo además de herramientas de cálculo simbólico basadas en Mapple (la llamada Symbolic Math Toolbox). Algunas áreas para las que MATLAB incluye librerías especializadas (Toolboxes o “Cajas de Herramientas”) son:
‐ Resolución de ecuaciones y sistemas de ecuaciones no‐lineales. Optimización. ‐ Algebra lineal. Resolución de sistemas de ecuaciones lineales. Autovalores y autovectores. ‐ Polinomios. Cálculo de raíces. ‐ Interpolación y ajuste por polinomios o funciones Spline. ‐ Derivación e integración numérica. ‐ Resolución de Ecuaciones Diferenciales Ordinarias y en derivadas parciales. ‐ Gráficos 2D y 3D.
A lo anterior se añade la posibilidad de operar simbólicamente, cuando es posible, en estas áreas. El presente tutorial se refiere a la versión 7 (2011), ejecutándose en Windows 7 y en las siguientes secciones se describirá la Interfaz de la aplicación, una introducción a los comandos, funciones y archivos de programa de MATLAB y el sistema de carpetas de trabajo.
1.1 Interfaz
Cuando se inicia MATLAB, la configuración de la pantalla inicial es similar a la que muestra la Figura 1.
Figura 1
1‐Interfaz, Comandos y Funciones
Introducción a MATLAB 7‐José Cortés Parejo 2
Consta de una cabecera similar a la de otras aplicaciones bajo Windows con un menú para manipulación de ficheros, edición, etc. y, debajo, la pantalla aparece subdividida en 3 zonas: la de comandos (Command Window), la correspondiente al espacio de trabajo (Workspace) y la que sigue el historial de comandos ejecutados (Command History).
Ventanas
Existen otras ventanas no mostradas inicialmente y que se utilizan para propósitos específicos. De las tres con las que se inicia la sesión de MATLAB, la ventana Workspace muestra las carpetas y rutas principales que atañen a nuestra aplicación. Por su parte, la ventana Command History contiene una relación de los comandos ya ejecutados y su principal utilidad consiste en posicionar el cursor sobre uno de ellos para recuperarlo y no tener que volver a teclearlo. Con todo, la principal y más útil zona de trabajo será la Command Window o Ventana de Comandos, hasta el punto de que en aplicaciones no demasiados complejas será preferible prescindir de las otras dos (reducen el espacio y son poco útiles). Por otra parte, en el transcurso de una sesión estándar generalmente estaremos trabajando con un fichero de programa (escrito por nosotros) que se mostrará en una ventana independiente para una cómoda edición/debug y posiblemente también generaremos gráficos, que aparecerán en otra ventana. Una configuración recomendable para muchas de nuestras sesiones de trabajo es la que aparece en la Figura 2.
Figura 2
Como puede observarse, la Ventana de Comandos se ha colocado a todo lo largo en la parte inferior de la pantalla. Arriba a la derecha se muestra la salida gráfica de un programa en una ventana de 500x500 pixels y en el hueco restante, arriba a la izquierda, se encuentra el editor de MATLAB con el programa que ha producido el gráfico. Naturalmente, dado que todas la ventanas son las estándares de Windows, pueden redimensionarse, moverse y recolocarse al gusto del usuario.
Introducción a MATLAB 7‐José Cortés Parejo 3
Utilización de MATLAB como calculadora científica
En la Ventana de Comandos aparece siempre, después de un texto introductorio, el símbolo >>, que es el prompt o símbolo del sistema (salvo en la “versión del estudiante”, que incluye la palabra EDU). A continuación de este símbolo es donde se escriben los comandos o instrucciones. Los comandos principales, tanto los propios de MATLAB como los que creemos nosotros, se estudiarán en la siguiente sección. De momento, podemos constatar una carácterística muy útil de MATLAB y es como calculadora de alto nivel. Por ejemplo, podemos teclear a la derecha del prompt una simple operación aritmética:
>> 7+4
y dar a la tecla Return, que a partir de ahora indicaremos con el símbolo , (¡no al signo =, que aparecerá en pantalla como un carácter más pero no hará nada!). La pantalla mostrará, debajo :
ans =
11
La palabra ans (answer) es el nombre de una variable de MATLAB en la que siempre se almacena el resultado del último cálculo, que en este caso es el resultado de la operación 7+4. Desde luego, podríamos haber almacenado nuestro resultado en una variable, con un nombre que en general puede ser cualquier conjunto de caracteres alfanuméricos, siendo el primero un carácter:
>> balance = 7+4
Tras dar , el resultado será:
balance =
11
Para operaciones tan simples como la anterior, no es necesario asignar variables a números; pero MATLAB puede manejar expresiones complicadas incluyendo los operadores +, ‐, *, / y ^ (potenciación), expresiones incluyendo paréntesis anidados y, naturalmente, variables a las que se haya asignado previamente un valor, directamente (como por ejemplo dato1 = 23), o como resultado de una operación. También, como era de esperar, MATLAB dispone de todo tipo de funciones matemáticas, que no tienen por qué calcularse previamente, sino introcucirse directamente en una expresión algebraica de la misma forma en que habituamente escribimos a mano una fórmula. Por ejemplo (nótese el uso de un punto y coma al final de las 2 primeras instrucciones):
>> c1 = 5.34; >> v0 = 2.86;
>> x = c1*exp(-0.5*v0/c1)
Un primer comentario es acerca del punto y coma: dado que para escribir la 2ª instrucción hemos dado a la tecla Return (para pasar a la siguiente línea), en ese momento se ha ejecutado la 1ª instrucción … pero el resultado no ha aparecido en pantalla, y eso es precisamente para lo que sirve el punto y coma. Nótese sin embargo que la instrucción efectivamente sí se ha ejecutado y en memoria existe en ese momento una variable llamada c1 con un valor de 5.34. De nuevo para escribir la 3ª instrucción hemos dado previamente a la tecla Return, lo que ha provocado la ejecución de la 2ª instrucción, sin mostrar el resultado en pantalla.
Introducción a MATLAB 7‐José Cortés Parejo 4
Finalmente, cuando se da Return tras la 3ª instrucción, no sólo se ejecuta sino que ahora sí se muestra el resultado en pantalla (y esto se debe a no haberla terminado con un punto y coma):
x =
14.4631
Vemos también el uso de la función exp( )que calcula la exponencial de su argumento, que no aparece como un valor explícito, sino como una expresión en la que intervienen a su vez variables previamente definidas. Nótese también que MATLAB no proporciona automáticamente los espacios que se muestran antes y después del signo =, ni de los operadores. Estos se han incluido para claridad de la notación.
Para terminar, digamos que esta simple funcionalidad como calculadora de alto nivel, se incrementa notablemente con el uso de variables vectoriales, matriciales y de funciones que se verán más adelante. Como un adelanto:
>> Gastos = [5.35 12.8 7.40 3.20];
>> Total = sum(Gastos);
>> previos = Total – Gastos(4)
Como fácimente se deduce, la 1ª instrucción define una variable vectorial (o simplemente, un vector) con 4 componentes; la 2ª instrucción utiliza una función del sistema que calcula la suma de todos los elementos del vector almacenando el resultado en la variable Total (escalar) y la 3ª instrucción resta del Total, la 4ª entrada del vector Gastos.
1.2 Comandos, Funciones y Ficheros m
MATLAB es un intérprete de comandos; es decir, cuando se escribe en la Ventana de Comandos una instrucción (expresión algebraica o comando), al dar a la tecla Return, ésta se ejecuta inmediatamente. Si existe un error de sintaxis o se produce un error numérico en el cálculo, se detendrá la ejecución y se mostrará un mensaje con una breve descripción del error. En el caso en que el comando o expresión provenga de un progama, el sistema permite, mediante hipertexto, acceder a la línea de programa en la que se ha producido el error.
Comandos y Funciones del sistema
MATLAB dispone de una enorme variedad de comandos para realizar todo tipo de funciones, desde mostrar un fichero de ayuda a otros comandos, navegar a través de las carpetas de Windows, crear un vector o matrix, extraer elementos o sub‐matrices, definir un polinomio y realizar cálculos con él, plantear una ecuación y resolverla, dibujar un gráfico, salvar a fichero datos … En fin, a lo largo de las siguientes secciones se presentarán algunos de los principales comandos que ya vienen preparados de fábrica. Estos comandos son programas que generalmente utilizan a su vez otros comandos y funciones más elementales. En muchos de los casos es posible acceder al código de estos programas, código que no es más que un texto ASCII contenido en un fichero y siguiendo la sintaxis de programación que se explicará en el capítulo 3 (Progamación). Dado que los comandos son en realidad programas, la mayoría de ellos admiten datos de entrada, que pueden considerarse como parámetros u opciones del comando.
Introducción a MATLAB 7‐José Cortés Parejo 5
Algunos ejemplos de comandos son (su explicación detallada se verá en el correspondiente capítulo):
help proporciona información detallada de todos los comandos de MATLAB
help zzzz información del comando cuyo nombre es zzzz
dir muestra los ficheros del directorio actual de trabajo (activo)
cd 'ruta' establece un nuevo directorio actual de trabajo
format zzzz Especifica el tipo de formato numérico para mostrar los datos
fopen( ) Abre un fichero para leer o escribir datos
zeros( ) Crea una matriz de ‘0’ con las dimensiones especificadas. L=length(v) Devuelve el número de elementos del vector v y lo almacena en la variable L
plot( ) Dibuja un punto en una ventana gráfica Una vez ejecutado un comando, puede “recuperarse” (generalmente para volver a ejecutarlo sin
tener que reescribirlo) mediante el uso de las flechas (). También existe la posibilidad de escribir varios comandos en una misma línea separándolos por comas (,) o punto y coma (;). Tras pulsar la tecla se ejecutarán en sucesión y mostrarán sus resultados si se han separado mediante comas o no, si se han separado con punto y coma. Existen además las denominadas funciones intrínsecas, cuyo código está inmerso en el del propio MATLAB y no son por tanto accesibles (por ejemplo, la función exp( ) ya comentada). En el capítulo 2 se describirán las principales funciones de este tipo. Finalmente, el usuario puede crear sus propios comandos o funciones.
Ficheros m
Un fichero “m” no es más que un fichero de texto ASCII que contiene sentencias, instrucciones y comandos de MATLAB. Se caracterizan por llevar la extensión .m. Su principal característica es que cuando en la Ventana de Comandos se escribe el nombre de uno de estos ficheros (sin la extensión .m) y se da a Return, MATLAB ejecuta línea a línea las sentencias o comandos tal y como si se hubieran escrito en sucesión directamente en la Ventana de Comandos. Por tanto, un fichero m es la base de la programación en MATLAB. Pueden ser editados con cualquier editor, aunque es preferible el que incorpora MATLAB, pues no sólo distingue el tipo de comando, función o sentencia, sino que las colorea de forma diferente para hacer más inteligible el código y proporciona automáticamente indentaciones. En la sección 1.1 (Utilización de MATLAB como calculadora científica) vimos un ejemplo con tres sentencias que se ejecutaron sucesivamente en la Ventana de Comandos: >> Gastos = [5.35 12.8 7.40 3.20];
>> Total = sum(Gastos);
>> previos = Total – Gastos(4)
De forma alternativa, podríamos haber creado un fichero de texto, llamado por ejemplo Balance.m con el contenido:
Gastos = [5.35 12.8 7.40 3.20]; Total = sum(Gastos); previos = Total – Gastos(4)
Introducción a MATLAB 7‐José Cortés Parejo 6
Nótese que ahora no se ha puesto el símbolo del sistema “>>” delante de cada sentencia. El prompt >> sólo aparece en la Ventana de Comandos. Si a continuación en la Ventana de Comandos tecleamos el nombre de nuestro programa (sin .m):
>> Balance
y damos , obtendremos: previos =
25.5500 Para terminar este apartado sólo queda por comentar que para crear un fichero .m lo mejor es
hacerlo desde dentro del propio MATLAB. En la cabecera, en el menú File/New Script, se invoca al potente editor/debugger que tiene incorporado. Una vez escrito el programa, basta con guardarlo con Save as y se salvará como fichero .m. NOTA: un fichero m, como ya se ha dicho, contiene sólo texto ASCII y puede en consecuencia generarse y editar con cualquier editor de texto plano. Sin embargo, los editores generalmente añaden .txt como extensión al nombre del fichero. Un fichero .txt puede abrirse con el editor de MATLAB, pero su nombre no será reconocido como un programa al tratar de ejecutarlo en la Ventana de Comandos.
Comandos help y doc
El comando help es tan potente y útil que merece le dediquemos un pequeño apartado. Para un usuario habitual de MATLAB es con seguridad el más frecuentemente utilizado. En su versión más simple no lleva ningún parámetro adicional:
>> help
Su ejecución hace que se muestre en pantalla una larga lista de temas de ayuda, algunos de los cuales se muestran a continuación (se ha seleccionado alrededor de la tercera parte de ellos):
matlab\general - General purpose commands. matlab\ops - Operators and special characters. matlab\elmat - Elementary matrices and matrix manipulation. matlab\elfun - Elementary math functions. matlab\specfun - Specialized math functions. matlab\matfun - Matrix functions - numerical linear algebra. matlab\datafun - Data analysis and Fourier transforms. matlab\polyfun - Interpolation and polynomials. matlab\funfun - Function functions and ODE solvers. matlab\scribe - Annotation and Plot Editing. matlab\graph2d - Two dimensional graphs. matlab\graph3d - Three dimensional graphs. matlab\strfun - Character strings. matlab\imagesci - Image and scientific data input/output. matlab\iofun - File input and output. matlab\codetools - Commands for creating and debugging code matlab\helptools - Help commands. matlab\demos - Examples and demonstrations. matlab\plottools - Graphical User Interface Tools. simulink\dee - Differential Equation Editor curvefit\curvefit - Curve Fitting Toolbox curvefit\splines - Curve Fitting Toolbox -- Spline Functions
Introducción a MATLAB 7‐José Cortés Parejo 7
shared\optimlib - Optimization Toolbox Library images\images - Image Processing Toolbox shared\imageslib - Image Processing Toolbox Library optim\optim - Optimization Toolbox stats\stats - Statistics Toolbox shared\statslib - Statistics Toolbox Library symbolic\symbolic - Symbolic Math Toolbox A cada uno de estos temas puede accederse pinchando con el ratón directamente en su nombre en la 1ª columna o bien escribiendo en la Ventana de Comandos help seguido de dicho nombre.
Por ejemplo, si queremos información sobre las principales funciones matemáticas, podemos pinchar en el 4º de los temas mostrados, matlab\elfun, o escribir en la Ventana de Comandos:
>> help matlab\elfun.
Se mostrará entonces una lista de todos los comandos, operadores, etc. relacionados con el correspondiente tema. Una vez más, pinchando en uno de ellos se obtendrá la información disponible sobre la sintaxis, parámetros, etc. que conciernen al elemento seleccionado.
A menudo el usuario conoce el nombre del comando, pero no recuerda alguna de sus opciones y parámetros. Para obtener ayuda basta con utilizar help seguido del nombre del comando. Por ejemplo, el comando print se utiliza para guardar un gráfico previamente generado en fichero. Esto es conocido por cualquier usuario que trabaje frecuentemente con gráficos, aunque raramente guarde las imágenes, por lo que no necesita recordar su sintaxis y opciones. Basta con escribir:
>> help print
y MATLAB mostrará una completa ayuda sobre el uso del comando print. El comando doc es similar a help, pero es más potente. Permite acceder a una documentación mucho más extensa sobre el tema requerido.
1.3 Entorno MATLAB
Una sesión de trabajo en MATLAB no se desarrolla íntegramente en la Ventana de Comandos. Como ya se ha dicho, el usuario puede crear ficheros m para escribir sus propios programas o utilidades. Estos programas estarán en una o varias carpetas de Windows y cuando pretendamos utilizar uno de estos ficheros como comando tecleando su nombre en la Ventana de Comandos … probablemente MATLAB no encontrará el fichero. También puede ocurrir lo contrario: si guardamos datos o imágenes en un fichero (ya veremos cómo se hace), lo más seguro es que no consigamos averiguar dónde MATLAB los ha guardado. Por tanto, es conveniente organizar nuestro espacio de trabajo y a continuación “decirle” a MATLAB dónde encontrar nuestros ficheros m o dónde leer ficheros de datos o guardar los resultados o las imágenes que generemos.
Directorio activo
El directorio activo es la carpeta de Windows en la que MATLAB busca en primer lugar los comandos, lee ficheros de datos, escribe ficheros o guarda imágenes. Cuando se inicia MATLAB por primera vez tras su instalación el directorio activo es la subcarpeta bin, donde también se encuentra el ejecutable de MATLAB (hasta la versión 6.5 era la carpeta work).
Introducción a MATLAB 7‐José Cortés Parejo 8
Naturalmente no es buena idea mantener en esta misma carpeta nuestros ficheros, imágenes etc., por lo que es conveniente establecer como directorio activo una carpeta que esté “bajo control”. Para eso está el comando cd (change directory), cuyo funcionamiento es similar al comando del mismo nombre en MS‐DOS. Si por ejemplo tenemos una carpeta cuya ruta es c:\estudios\practicas\Matlab, escribiendo en la Ventana de Comandos:
>> cd c:\estudios\practicas\Matlab
automáticamente estableceremos esta carpeta como directorio activo.
NOTA: MATLAB admite las expresiones cd .. (subir un nivel) y cd \ (ir al directorio raíz c:\), tal y como sucedía en MS‐DOS. De hecho, muchos comandos de MS‐DOS pueden utilizarse directamente en la Ventana de Comandos de MATLAB realizando una función similar.
Otros comandos útiles en relación al directorio activo son pwd, que devuelve la ruta completa a
dicho directorio y dir, que muestra las sub‐carpetas y ficheros del directorio activo.
Directorios/Carpetas auxiliares
Si somos un poco organizados, tampoco nos gustará que todo nuestro trabajo, datos, ficheros m o imágenes esté en una misma carpeta (el directorio activo), que en el ejemplo puesto antes era:
c:\estudios\practicas\Matlab
Podemos, a través del navegador de Windows, crear varias sub‐carpetas de la “activa” o incluso tener dispuestas otras carpetas que no sean necesariamente sub‐carpetas del directorio activo. Existe un comando para indicar a MATLAB que busque en estas carpetas aquéllos comandos creados por nosotros (ficheros m) que no encuentre en el directorio activo: addpath Su uso es bastante intuitivo: Si creamos en c:\estudios\practicas\Matlab una subcarpeta llamada Ecuaciones (en la que pretendemos guardar programas creados por nosotros para ejercicios sobre resolución de ecuaciones), podemos decir a MATLAB que la considere como carpeta auxiliar en la que buscar ficheros de programa (.m) que no se encuentren en el directorio activo:
>> addpath c:\estudios\practicas\Matlab\Ecuaciones
En realidad estas carpetas auxiliares no tienen por qué ser sub‐carpetas del directorio activo. Por ejemplo, si tenemos una carpeta cuya ruta es:
c:\MisDoc\Despacho\Contabilidad\Auxiliar
en la que previamente hemos guardado programas (.m) para realizar, digamos, ciertas operaciones contables, gráficos, etc., si queremos que nuestra sesión de MATLAB busque en esa carpeta cuando tecleemos en la Ventana de Comandos el nombre de uno de esos programas:
>> addpath c:\MisDoc\Despacho\Contabilidad\Auxiliar
Si la ruta especificada contiene espacios, toda ella debe estar incluida entre comillas simples. También pueden definirse de una sola vez varias “path” escribiéndolas en sucesión con un espacio de separación. Digamos finalmente que MATLAB dispone de otro comando que sirve para visualizar todas las rutas auxiliares que se han definido: path Se utiliza sin argumentos y simplemente muestra un listado de todas las “paths”.
Introducción a MATLAB 7‐José Cortés Parejo 9
Ficheros de arranque
Existe un fichero de MATLAB especial que se encuentra en ...\MATLAB\toolbox\local llamado matlabrc.m que tiene la particularidad de que se ejecuta automáticamente durante el inicio de un sesión de MATLAB. En este fichero se definen, entre otras cosas, los “paths” a carpetas auxiliares que establece el sistema (no las que definamos nosotros una vez iniciada la sesión), parámetros por defecto, etc. Este fichero no debería editarse si no es para incluir un comado del tipo:
cd c:\estudios\practicas\Matlab
Con esto, durante el proceso de arranque de MATLAB se establecerá nuestra carpeta de trabajo como directorio activo, ¡lo cual es una buena práctica!
► MATLAB también proporciona una facilidad de arranque bastante interesante. Se trata de un fichero denominado startup.m (que debe crear el propio usuario) en el que se pueden colocar comandos de inicio y configuración personalizados. Por ejemplo, podemos crear en la carpeta que tengamos establecida como directorio activo un fichero startup.m cuyo contenido sea:
addpath c:\estudios\practicas\Matlab\Ecuaciones
addpath c:\MisDoc\Despacho\Contabilidad\Auxiliar
que establece 2 carpetas auxiliares en las que MATLAB debe buscar comandos cuando se invoquen (aparte de en el directorio activo). En el fichero de arranque matlabrc.m mencionado antes existe una instrucción que pregunta si existe en el directorio activo un fichero llamado startup.m, en cuyo caso lo ejecuta. Esto permite independizar el fichero matlabrc.m, en el que como hemos dicho sólo debería añadirse el comando cd “ruta a nuestro directorio de trabajo”, de la definición de nuestras opciones personalizadas (que se incluirían en el fichero startup.m). También, esta dualidad de ficheros de arranque permite que en varios ordenadores exista el mismo fichero matlabrc.m, pero en cada ordenador se cree un fichero startup.m diferente.
Guardar y recuperar sesiones
MATLAB permite guardar y recuperar la sesión en curso con objeto de no perder el trabajo hecho si necesitamos salir del programa y reanudarlo en otro momento. La forma más simple (y también la menos efectiva) de guardar una sesión es, al comienzo de la misma (o en cualquier momento a lo largo de la sesión) ejecutar el comando diary:
>> diary 'nombre de fichero'
El nombre de fichero (entre comillas simples) es el de un fichero de texto (puede incluir una ruta completa a una carpeta, si no se desea guardarlo en el directorio activo) en el que a partir de este momento se guardará todo lo que aparezca en la Ventana de Comandos. Sin embargo, todas las variables asignadas y los gráficos se perderán. Este fichero es sólo un recordatorio de lo que hemos hecho y en que punto nos hemos quedado, aunque es útil porque también los resultados mostrados en pantalla tras la ejecución de algún comando quedan registrados. Este comando es como si hiciera una captura continua de pantalla. Si no se especifica extensión, el fichero creado será de texto plano. Es recomendable indicar la extensión .m para recuperarlo cómodamente desde una sesión de MATLAB.
Más útil es el comando save, que permite guardar las variables, vectores o matrices que estén en memoria. Su utilización es simple:
Introducción a MATLAB 7‐José Cortés Parejo 10
>> save nombrefichero (sin extensión)
Guarda las variables en formato binario en el fichero especificado y le añade la extensión .mat. Su contraparte es el comando load, que recupera (generalmente en una sesión posterior) las variables almacenadas en un fichero de tipo .mat:
>> S = load nombrefichero.mat
Nótese la utilización de una “variable” S para almacenar, en forma de estructura, las variables cargadas (si no se utiliza S = las variables quedarán efectivamente cargadas, pero tendremos que recordar su nombre).
Introducción a MATLAB 7‐José Cortés Parejo 11
Una vez vistos los comandos más elementales y una introducción a los ficheros de programa .m, es hora de entrar en donde MATLAB despliega toda su potencia: la manipulación de números, vectores y matrices.
2.1 Operando con números Un número o escalar se escribe en MATLAB, de forma estándar, como una parte entera seguida de un punto y la parte decimal. Internamente se almacena en binario en formato exponencial, ocupando un total de 8 bytes (64 bits), de los cuales se dedican 53 bits a la mantisa y 11 al exponente (lo que equivale aproximadamente a 15 cifras decimales). Todos los cálculos, a menos que se especifique lo contrario, se realizan en doble precisión utilizando siempre los 8 bytes aunque aparentemente, en pantalla, pueden mostrársenos como números enteros o con sólo 4 cifras decimales (formato por defecto).
Formatos numéricos
Una vez dicho que MATLAB opera siempre en doble precisión utilizando 8 bytes para cada número, otra cuestión es cómo se muestran los números en la Ventana de Comandos con objeto de hacer más claras las operaciones y resultados. Por defecto, MATLAB utiliza el denominado formato short, que presenta los números con 4 dígitos decimales, el último de ellos redondeado. Por ejemplo:
>> x = 25.37829614
Al dar Return aparecerá:
>> x =
25.3783
Aunque ya sabemos que, internamente, la variable x contiene el número escrito con todas sus cifras.
Podemos establecer otros tipos de formatos de visualización de números y para ello se emplea el comando format seguido de una palabra clave que especifica el tipo de formato. Algunos de los formatos permitidos por MATLAB son:
format short (defecto) Formato de punto fijo con 4 cifras decimales
format shorte Formato de punto flotante con 4 cifras decimales
format long Formato de punto fijo con hasta 15 cifras decimales
format longe Formato de punto flotante con hasta 15 cifras decimales
format bank Formato de punto fijo con 2 cifras decimales
format rat Aproximación de un número como cociente de enteros
Variables numéricas
Ya hemos tenido ocasión de tratar con variables: son, al igual que en otros lenguajes de programación, zonas de memoria en la que se almacenan números y poseen un nombre, definido por el usuario que sirve para utilizar su contenido en expresiones algebraicas. La casi única condición que se impone al nombre es que comience por una letra.
2‐ Escalares, Vectores y Matrices
Introducción a MATLAB 7‐José Cortés Parejo 12
► MATLAB distingue entre mayúsculas y minúsculas, por lo que A y a pueden ser variables distintas. La asignación de un número a una variable se hace, como en casi todos los lenguajes, escribiendo su nombre, el signo = y el valor a asignar:
>> balance = 11
y ya sabemos que si damos , aparte de realizarse la asignación, se mostrará en pantalla:
balance =
11
mientras que si hubiésemos terminado la sentencia con un punto y coma (;), se efectuaría la asignación pero sin mostrase el valor.
► Para ver el contenido de una variable basta con escribir su nombre en la Ventana de Comandos.
Una importantísima diferencia entre MATLAB y la mayoría de lenguajes de programación es que las variables no tiene que estar predefinidas ni es necesario especificar su tipo (por defecto es siempre doble precisión de 8 bytes). Esto da una enorme potencia a la hora de operar o programar. Es de notar, sin embargo, que MATLAB tiene comandos para definir tipos concretos de variables con objeto de aprovechar al máximo la potencia del procesador. Por ejemplo int8(x) conviete la variable x a un entero de 8 bits.
Variables de entorno
MATLAB tiene predefinidas algunas variables cuyos nombres pueden utilizarse en cualquier lugar (siempre que sea apropiado su uso). Algunas de ellas son:
ans Variable en la que se almacena el último cálculo realizado
eps Es en realidad una función que devuelve (en la variable ans) la precisión del ordenador
pi Contiene el valor del número
i Unidad imaginaria. Se utiliza en expresiones con números complejos.
Inf Infinito
Expresiones algebraicas
Todos sabemos lo que es una expresión algebraica en el sentido matemático de la palabra, por lo que no nos detendremos mucho en este apartado. En MATLAB una expresión algebraica se escribe prácticamente igual salvo que todo (escalares, variables, funciones, operadores, etc.) tiene que escribirse en una misma línea. Por ejemplo la expresión matemática:
2
23.5
1
1
xeC
x
Se escribiría en MATLAB: C = -3.5*(exp(-x^2)+1)/sqrt(x^2+1)
donde se han utilizado las funciones intrínsecas exp (exponencial) y sqrt (raíz cuadrada).
Operadores aritméticos, relacionales y lógicos
Operadores aritméticos: Son los habituales, suma (+), resta (‐), división (/), multiplicación (*) y potenciación (^). Este último aparece en el ejemplo anterior.
Introducción a MATLAB 7‐José Cortés Parejo 13
Operadores relacionales: Se utilizan para comparar 2 expresiones aritméticas, resultando en el valor 1 (True‐Verdad) cuando la comparación es cierta y 0 (False‐Falso) cuando no lo es. Estos operadores son:
igual: == no igual: ~= menor que: < menor o igual que: <= mayor que: > mayor o igual que: >=
Nótese que el operador igual se escribe con dos signos = (un solo signo = sería una asignación). Por otra parte, el símbolo ~, que no suele estar presente en los teclados, se obtiene mediante la combinación de teclas Alt 126 tecleando los números en el numpad y soltando la tecla Alt. El principal uso de los operadores relacionales se encuentra en la programación en conjunción con bucles y bifurcaciones (Capítulo 3) mediante una condición.
Operadores lógicos: Se utilizan para comparar 2 expresiones aritméticas, resultando en el valor 1 (True‐Verdad) cuando la comparación es cierta y 0 (False‐Falso) cuando no lo es.
AND: && OR: || XOR: xor NOT: ~
Operador “2 puntos” (:)
MATLAB proporciona un mecanismo muy potente para crear ciertos conjuntos de números, muy utilizados en la práctica, que están en progresión aritmética (por ejemplo, las abscisas de un soporte de Interpolación, los instantes de tiempo en los que se evalúa la solución de una ecuación diferencial o como veremos, grupos de índices para referirse a elementos de un vector o matriz y también en estructuras de tipo bucle for). Se trata del uso del operador “2 puntos” (:) y su empleo lo convierte en una herramienta excelente.
x1:inc:x2
donde x1 es un valor inicial, inc el incremento y x2 el valor final. Este operador genera los elementos de una progresión aritmética comenzando en x1, con diferencia inc y hasta llegar a x2 o a un valor x tal que x + inc > x2. Por ejemplo:
>> 0:0.1:0.5
ans =
0 0.1000 0.2000 0.3000 0.4000 0.5000
En general, cualquiera de los 3 parámetros implicados en la expresión pueden ser números decimales, positivos o negativos y cuando el incremento es 1, no es necesario ponerlo. Los valores generados pueden utilizarse para crear un vector que los tenga como elementos (sección 2.2), o para referirse a los índices de un grupo de elementos en un vector o matriz. También, como veremos, en la construcción de bucles for.
Introducción a MATLAB 7‐José Cortés Parejo 14
Funciones escalares elementales
MATLAB posee una potente batería de funciones, tanto matemáticas como no matemáticas. Su formato general es el siguiente:
[y1,y2,…,yk] = nombre(x1,x2,…,xn) donde x1,x2, … ,xn son los argumentos de entrada o datos (numéricos o variables
previamente asignadas) que se proporcionan a la función. Por su parte, y1,y2, … ,yk son las variables de salida, las cuales son el resultado del cálculo interno que realiza la función. La gran mayoría de funciones sólo tienen un argumento de entrada y una variable de salida, como la función exp vista antes. En este caso, pueden omitirse los corchetes:
>> x = 5.38; >> y = exp(x)
Como ya se puso de manifiesto en el ejemplo del apartado anterior, una función puede evaluarse “al vuelo”; es decir, si queremos utilizar el valor de exp(5.38) no es necesario calcularlo previamente:
>> x = 5.38; >> C = -3.5*(exp(-x^2)+1)/sqrt(x^2+1)
Existen sin embargo funciones (no matemáticas) que no tienen argumentos y algunas con un solo argumento de entrada pero varios de salida, como la función factor(n) que obtiene los factores primos del entero n. Para una referencia completa de las funciones matemáticas de MATLAB se recomienda utilizar la ayuda con el comando help matlab\elfun. Para cada función, pulsando sobre su nombre, se nos mostrará información sobre la tarea que realiza, argumentos de entrada, variables de salida, etc. A continuación listamos algunas de las principales y más utilizadas funciones de MATLAB:
sin seno (argumento en radianes) cos coseno (argumento en radianes)
tan tangente (argumento en radianes) asin arco seno
acos arco coseno atan arco tangente
exp exponencial log logaritmo neperiano
log10 logaritmo de base 10 sqrt raíz cuadrada
abs valor absoluto (o módulo, si el argumento es complejo) fix redondeo hacia 0 (parte entera)
round redondeo al entero más cercano factor obtiene los factores primos de un número entero
2.2 Vectores y Matrices
Como ya se ha dicho anteriormente, es en el cálculo vectorial y matricial donde destaca sobre todo MATLAB, no sólo en problemas que les conciernen directamente como la resolución de
Introducción a MATLAB 7‐José Cortés Parejo 15
Sistemas de Ecuaciones Lineales o el cálculo de autovalores, sino en multitud de otros temas que pueden formularse en terminos vectoriales o matriciales, como por ejemplo el uso de polinomios. Por lo general, vectores y matrices se consideran variables, es decir, zonas de memoria con un nombre propio. Es raro utilizarlos como elementos aislados sin estar asociados a un nombre.
Vectores
Un vector es una estructura del tipo: [v1,v2,…,vn] donde v1,v2,…,vn son los elementos del vector y pueden estar separados por comas (,) o por espacios en blanco. Los corchetes son obligatorios y cada elemento vi puede en efecto ser un escalar, una variable previamente definida o incluso una expresión algebraica. La asignación de un vector a un nombre de variable se hace igual que en el caso escalar:
>> Gastos = [35.72,51.68,19.27]
o bien:
>> Gastos = [35.72 51.68 19.27]
Esta definición crea lo que en rigor se denomina un vector fila. También pueden generarse vectores columna separando los elementos por puntos y coma (;) o mediante sucesivos:
>> Ventas = [61.87;-2.43;12.95]
Al dar obtendremos:
Ventas =
61.8700 -2.4300 12.9500 Nótense los 0’s añadidos a la derecha: el formato de presentación por defecto es, como se ha dicho, short (4 cifras a la derecha de la coma). También podríamos haber creado el vector columna dando un después de cada dato (pero precediendo el primero con un corchete de apertura [ y terminando el último con ]. Es importante notar que funcionalmente un vector fila y un vector columna son entidades distintas cuando se empleen en expresiones algebraicas. De hecho, para MATLAB un vector fila es una matriz de 1 fila y n columnas, mientras que un vector columna es una matriz de n filas por 1 columna. MATLAB dispone del operador trasposición (representado por un apóstrofe al final) que convierte un vector fila en columna o viceversa, pero manteniendo el tipo original. Por ejemplo:
>> Gastos = [35.72,51.68,19.27]; >> Gastos'
Al dar se obtendrá un vector columna (por cierto, almacenado en la variable ans, que ahora ya es de tipo vectorial). Sin embargo el vector original Gastos sigue siendo un vector fila, como se comprueba tecleando su nombre en la Ventana de Comandos.
► Para referirse a un elemento concreto de un vector, por ejemplo para saber su valor o para utilizarlo en una expresión algebraica, sólo hay que escribir el nombre del vector seguido por el índice de la posición del elemento incluido entre paréntesis. Nótese que la primera posición tiene índice 1, por lo que no podremos referirnos nunca a la “posición 0”.
Introducción a MATLAB 7‐José Cortés Parejo 16
Por ejemplo para el vector Gastos definido antes:
>> Gastos(2)
Tras obtenemos el valor de la 2ª entrada del vector:
ans =
51.6800
Naturalmente, podría haberse asignado este valor a una variable escalar o utilizarlo implícitamente en una expresión:
>> x = Gastos(2)
O bien: >> Febrero = 7*Gastos(2)/12 Una característica fundamental de MATLAB en relación a los vectores y que lo distingue fuertemente de otros lenguajes es que no sólo no es necesario definirlos previamente (como en el caso de las variables), sino que tampoco es obligatorio especificar previamente su dimensión (número de elementos). Un vector se redimensiona automáticamente si se añaden nuevos elementos:
>> Gastos = [35.72,51.68,19.27]; >> Gastos(4)= 16.82
Gastos =
35.72,51.68,19,27,16.82 Utilización del operador 2 puntos (:)
El operador dos puntos (:) puede utilizarse para crear rápidamente vectores cuyos elementos están en progresión aritmética o incluso para referirse a un grupo de elementos de un vector ya creado:
>> v = 0:0.1:0.5
v =
0 0.1000 0.2000 0.3000 0.4000 0.5000 La otra alternativa (referencia a elementos):
>> w = v(3:5)
w =
0.2000 0.3000 0.4000
En fin, una última posibilidad (seleccionar los elementos 2º, 4º y 6º del vector v)
>> u = v(2:2:6)
u =
0.1000 0.3000 0.5000 Utilización de un vector de índices
MATLAB facilita la posibilidad incluso de extraer o referenciar elementos de un vector a partir de índices almacenados en otro vector. Por ejemplo, con el anterior vector v:
Introducción a MATLAB 7‐José Cortés Parejo 17
>> v = 0:0.1:0.5
v =
0 0.1000 0.2000 0.3000 0.4000 0.5000 Si definimos un vector de índices >> indice = [2 3 6] Podemos referirnos a los elementos de v cuyas posiciones sean la 2ª, 3ª y 6ª:
>> u = v(indice)
u =
0.1000 0.2000 0.5000
Matrices
Una matriz es una estructura de tipo rectangular (array en inglés‐arreglo) que contiene valores numéricos distribuidos en filas y columnas (tal como sabemos que es una matriz en matemáticas). Para definir una matriz en MATLAB debemos hacerlo por filas (sin embargo, internamente MATLAB las almacena por columnas, lo cual conviene recordar para cierto tipo de operaciones). El procedimiento es muy intuitivo si se ha comprendido cómo se definían los vectores fila y columna:
>> M = [2 5 7;3 1 4;6 8 2;1 3 5]
M =
2 5 7 3 1 4 6 8 2 1 3 5
También podríamos haber sustituido los espacios en blanco por comas (,) y los puntos y coma (;) por Return, tal y como se hizo para crear un vector columna. También, como sucedía con los vectores, las matrices no tiene por que estar previamente definidas o dimensionadas. Para hacer referencia a un elemento de una matriz se escribe su nombre y los índices correspondientes a la fila y columna incluidos entre paréntesis:
>> M(3,2)
ans =
8
O bien, podemos utilizar el valor de un elemento en una expresión referenciándolo implícitamente:
>> x = 7*M(3,2)^2 ( 27 8x )
Submatrices y grupos de elementos
Para seleccionar o referirse a una submatriz o grupo de elementos en un vector es muy útil el operador dos puntos (:) o el empleo de un vector de índices. Veamos algunos ejemplos con la matriz M creada antes:
>> M = [2 5 7;3 1 4;6 8 2;1 3 5]
Introducción a MATLAB 7‐José Cortés Parejo 18
M =
2 5 7 3 1 4 6 8 2 1 3 5
>> M(2,2:3)
ans =
1 4 Otro ejemplo:
>> M(3:4,2)
ans =
8 3
► Cuando se utiliza el operador (:) sin índices MATLAB lo interpreta como “todos los índices”:
>> M(2,:) (significa “2ª fila‐todas las columnas”)
ans =
3 1 4 Finalmente, igual que se hizo con vectores, podemos referirnos a elementos de una matriz mediante un vector de índices:
>> indices = [1 3]; >> M(2,indices)
ans =
3 4
Matrices predefinidas
En MATLAB existen algunos tipos de matrices que pueden definirse automáticamente especificando sólo sus dimensiones:
zeros(n,k) genera una matriz de n filas por k columnas cuyos elementos son 0.
ones(n,k) genera una matriz de n filas por k columnas cuyos elementos son 1.
eye(n) genera una matriz identidad (diagonal de 1) de dimensión n.
Aparte de que este tipo de matrices puede aparecer en distintas aplicaciones, su principal utilidad (sobre todo la matriz zeros) consiste en predefinir una matriz con dimensiones específicas. Ya se ha dicho que en MATLAB no es necesario establecer previamente las dimensiones de un vector o matriz, pues esto puede hacerse dinámicamente mientras se generan sus elementos. Sin embargo, éste procedimiento (redimensionado dinámico) no es recomendable para vectores o matrices grandes, por ejemplo cuando se genera un vector de abscisas dentro de un intervalo. Aunque aún no hemos dicho casi nada de programación, las siguientes líneas de un programa deben ser fácilmente entendibles:
Introducción a MATLAB 7‐José Cortés Parejo 19
>> for i=0:100 >> x(i+1)=i/100; >> end Este pequeño programa consiste en un bucle con 101 iteraciones que va generando dinámicamente un vector x en el que se van almacenando los valores 0,0.01,0.02,0.03... hasta llegar a 1. Cuando se ejecuta por primera vez la instrucción x(i+1)=i/100 la variable i tiene el valor 0 y MATLAB crea un vector de un solo elemento: x(1)=0. En la 2ª iteración i toma el valor 1 por lo que la instrucción x(i+1)=i/100 equivale a x(2)=0.01, lo cual indica que al vector x, que sólo tenía un elemento, le estamos añadiendo un segundo elemento. Por tanto, en este momento x ya es un vector de dimensión 2. En la siguiente iteración se añadirá un nuevo elemento y x tendrá dimensión 3 y así sucesivamente. Es decir, MATLAB está generando dinámicamente el vector x aumentando su dimensión en cada iteración. Este procedimiento, aunque no podamos apreciarlo por tratarse de un programa muy simple y ejecutado en un ordenador moderno, es muchísimo más lento que uno similar en el que previamente hubiéramos definido un vector x con 101 elementos:
>> x = zeros(1,101); >> for i=0:100 >> x(i+1)=i/100; >> end
Nótese finalmente (y ya volveremos sobre esto en el capítulo sobre programación) que las 4 líneas anteriores se podrían haber sustituido, en este caso particular, por una única instrucción:
>> x = [0:0.01:1];
que utiliza el operador “2 puntos” para generar una progresión aritmética de 101 números entre 0 y 1.
Operaciones con Vectores y Matrices
Las expresiones algebraicas con vectores y matrices siguen las mismas reglas que en el caso de escalares, pero teniendo en cuenta que la multiplicación y la división presentan características especiales. Aparte, igual que sucedía con los vectores, disponemos del operador trasposición, que cambia las filas por columnas:
>> B = A' si A tiene n filas y k columnas, B tiene k filas y n columnas.
Multiplicación de matrices
Teniendo en cuenta que un vector fila se considera una matriz de una sola fila y un vector columna una matriz de una sola columna, la regla general para la multiplicación de 2 matrices A y B es que el número de columnas de A sea igual que el número de filas de B. En este caso, la matriz
resultante tiene el número de filas de A y el número de columnas de B. De hecho, el elemento (i,j) de C = A*B es el producto escalar de la fila i‐ésima de A por la columna j‐ésima de B:
1 1 2 2( , ) . . . i j i j ik kjC i j a b a b a b
donde se supone que el número de columnas de A y el de filas de B es k.
Introducción a MATLAB 7‐José Cortés Parejo 20
Existen dos casos particulares interesantes que aparecen con frecuencia en las aplicaciones: si u y v son vectores fila (o ambos vectores columna) con las mismas longitudes, por ejemplo:
>> u = [u1 u2 ... un]; >> v = [v1 v2 ... vn];
entonces están bien definidas las operaciones u*v' y u'*v: En el primer caso se trata de un producto escalar y el resultado es una matriz 1x1, es decir, un escalar:
1 1 2 2' . . . n nu v u v u v u v
Por su parte, el producto u'*v es una matriz de n filas y n columnas:
1 1 1 2 11
2 2 1 2 2 2
1 1
1 2
. .
. .' . .. . . . . .
. . . . . .. .
n
n
n
n n n n n
u v u v u vuu u v u v u v
u v v v v
u u v u v u v
División de matrices
Si 2 matrices A y B son cuadradas (igual número de filas y columnas) y la segunda es invertible
(determinante distinto de 0), entonces está bien definida la división A/B como el producto de A por la inversa de B:
>> C = A/B
También son válidas en MATLAB las divisiones de una matriz por un vector, teniendo el siguiente significado. Si b es un vector columna (o el trapuesto de un vector fila):
x = A\b equivale a 1 A b , es decir, x es la solución del Sistema de Ecuaciones Ax b .
También es posible utilizar el símbolo de divisón / (división “por la derecha”), aunque es bastante menos frecuente su uso:
x = A/b es la solución del Sistema xA b donde ahora b es un vector fila (y también x lo es).
Operaciones elemento a elemento
Los operadores multiplicación y potenciación pueden realizarse elemento a elemento simplemente precediendo el operador con un punto (.):
>> A = [2 4;3 1]
A =
2 4 3 1
>> B = [5 8;9 3]
B =
5 8 9 3
Introducción a MATLAB 7‐José Cortés Parejo 21
Entonces:
>> C = A.*B
C =
10 32 27 3 Otro ejemplo:
>> C = A.^2
C =
4 16 9 1 ► Digamos para terminar que MATLAB también permite operar un vector o matriz con un número (escalar), entendiendo que la operación se efectúa con cada elemento. Por ejemplo, para la matriz A anterior:
A =
2 4 3 1
es perfectamente válida la operación A + 7:
>> C = A + 7
C =
9 11 10 8
2.3 Funciones Vectoriales y Matriciales
Todas las funciones matemáticas vistas para escalares pueden aplicarse a vectores o matrices, resultando en la aplicación de la correspondiente función a cada elemento del vector o matriz. Por ejmplo:
>> M = [2 4;3 1]
M =
2 4 3 1
>> B = exp(M)
B =
7.3891 54.5982 20.0855 2.7183
Introducción a MATLAB 7‐José Cortés Parejo 22
Producto escalar y vectorial
MATLAB proporciona funciones específicas para este tipo de operaciones ampliamente utilizadas:
x = dot(u,v) realiza el producto escalar de los vectores u y v.
w = cross(u,v) calcula el producto vectorial de u y v y lo devuelve en un vector.
Funciones auxiliares
Las siguientes funciones realizan operaciones sobre vectores o matrices, aunque sin considerar su estructura vectorial. Sólo actúan sobre éstos como conjunto de números. Al igual que sucedía con las funciones matemáticas, el argumento puede ser cualquier expresión algebraica y contener a su vez variables. El resultado puede ser usado implícitamente en una expresión o asignado a una variable.
length(v) obtiene la dimensión de v, es decir, el número de elementos.
size(M) devuelve en un vector de 2 componentes el número de filas y columnas de M.
size(M,1) número de filas de M.
size(M,2) número de columnas de M.
sum(v) calcula la suma de los elementos de v.
prod(v) calcula el producto de los elementos de v.
min(v) calcula el mínimo de los elementos de v.
max(v) calcula el máximo de los elementos de v.
sort(v) ordena los elementos de v de menor a mayor.
NOTA: las funciones sum, prod, min, max y sort pueden utilizarse con una matriz M, en cuyo caso devuelven un vector donde cada componente es el resultado de aplicar la correspondiente función a las columnas de M.
Funciones matemáticas especiales
Las siguientes funciones sí consideran a vectores y matrices como elementos de un espacio vectorial:
norm(v) norma euclídea o norma‐2 del vector v: 2 2 21 2 nnorm(v)= v +v +...+v
norm(v,1) norma‐1 del vector v: | | ... | 1 2 nnorm(v,1)=|v |v |v
norm(v,Inf) norma‐ del vector v: |, |,..., |)1 2 nnorm(v,Inf)= max(|v |v |v
norm(M) norma espectral de la matriz M: |, |,..., |) 1 2 nnorm(M)= max(| | |
donde , ,..., 1 2 n son los valores singulares de M
norm(M,'fro') norma euclídea o de Frobenius de la matriz M: 2
,norm(M,'fro')= iji j
m
det(M) determinante de la matriz M.
inv(M) inversa de la matriz M.
cond(M) número de condición de la matriz M con respecto a la inversión.
Introducción a MATLAB 7‐José Cortés Parejo 23
2.4 Otros tipos de entidades matemáticas
MATLAB proporciona, aparte de los escalares, vectores y matrices ordinarias, otros tipos de entidades matemáticas que encuentran aplicación en numerosos campos. En esta sección veremos rápidamente algunas de ellas (ver help para más detalles).
Hipermatrices
Se trata de matrices de 3 dimensiones y para crearlas hay que hacerlo en 2 o más pasos, generando en cada paso una matriz bidimensional (del tipo usual) que se va almacenando sucesivamente en la “tercera dimensión” en las posiciones 1, 2, etc.
Un ejemplo aclarará su uso:
>> M(:,:,1) = [2 4 1;3 8 6] La 1ª matriz se almacena en la posición 1
M =
2 4 1 3 8 6
>> M(:,:,2) = [5 2 9;1 3 7] La 2ª matriz se almacena en la posición 2 Al dar se mostrarán cada una de las “capas” de la matriz M. M(:,:,1) =
2 4 1 3 8 6 M(:,:,2) =
5 2 9 1 3 7
Polinomios
La forma más sencilla de definir en MATLAB un polinomio es utilizando su expresión como suma de potencias de la variable.
Si 11 1 0( ) ... n n
n nP x a x a x a x a es un polinomio de grado n, basta con crear un vector fila con
los coeficientes empezando por el de la mayor potencia.
Por ejemplo, si 3 2( ) 2 5 3 1 P x x x x
>> P = [2 -5 3 -1];
crea un vector con los coeficientes de ( )P x . De momento, sólo es un vector como los vistos en la
sección anterior; pero serán las funciones que se utilicen sobre él las que indiquen que se trata en efecto de un polinomio. Nótese que si en el polinomio faltara alguna potencia, debe ponerse un 0 en el correspondiente lugar.
Veamos algunas de estas funciones:
roots(P) devuelve en un vector las raíces de ( )P x (incluso las complejas).
poly(v) construye un polinomio (vector) cuyas raíces son los elementos de v.
Introducción a MATLAB 7‐José Cortés Parejo 24
polyval(P,x) evalúa ( )P x en x, que puede ser un valor, variable o expresión escalar, o un vector, en cuyo caso la evaluación se hace para cada elemento.
La suma o resta de polinomios se realiza exactamente igual que si fueran vectores; sin embargo la multiplicación tiene un significado distinto. MATLAB para ello utiliza la convolución de los vectores:
>> P = [1 -2 3]; 2( ) 2 3 P x x x
>> Q = [1 4]; ( ) 4 Q x x
>> R = conv(P,Q) ( ) ( ) ( ) R x P x Q x
R =
1 2 -5 12 3 2( ) 2 5 12 R x x x x En MATLAB la división entre 2 polinomios se realiza mediante la función deconv, que devuelve 2 vectores, respectivamente con los coeficientes del cociente y los del resto. Su uso es el siguiente:
>> [Coc,rest] = deconv(P,Q)
Por ejemplo, si queremos dividir el polinomio 3 2( ) 2 5 3 1 P x x x x entre 2( ) 2 4 Q x x x :
>> P = [2 -5 3 -1];
>> Q = [1 -2 4];
>> [Coc,rest] = deconv(P,Q)
Coc =
2 -1 rest =
0 0 -7 3
es decir, el polinomio cociente es 2 1x
y el resto 7 3 x . Nótense los 0 en las posiciones 1 y 2 en el vector rest. En efecto rest se considera un vector (degenerado) de tercer grado que obedece a la fórmula:
rest = P ‐ conv(Q,Coc)
Cadenas de caracteress
Una cadena de caracteres es un conjunto ordenado de caracteres alfanuméricos (letras y números) que son considerados por MATLAB como un texto, con el que no puede operarse aritméticamente (incluso aunque la cadena de caracteres conste sólo de números). Para definir una cadena es necesario incluirla entre comillas simples. Si un carácter de la cadena fuera precisamente una comilla, ésta debe ser doble.
>> c = 'prueba de texto'
c =
prueba de texto
Introducción a MATLAB 7‐José Cortés Parejo 25
Nótese que, como era de esperar, la cadena aparece sin las comillas y además cuadrada a la izquierda: esto indica que la cadena no comenzaba por un espacio (el espacio es un carácter como otro cualquiera. Par utilizar o referirnos a un carácter concreto de la cadena, lo haremos como si ésta fuera un vector de números:
>> c(6)
ans =
a Podemos comprobar que el “espacio” es un carácter:
>> c(7)
ans = y aunque no aparezca nada debajo de ans, MATLAB ha imprimido realmente un espacio. Algunas funciones para manipulación de cadenas son las siguientes (pueden consultarse todas con help matlab\strfun):
strcat(c1,c2) concatena las cadenas c1 y c2 strcmp(c1,c2) compara las cadenas c1 y c2. Devuelve 1 si son iguales y 0 en caso contrario num2str(x,k) convierte un número x en una cadena con k caracteres (más el punto, si existe) int2str(n) convierte un número entero n en una cadena
Introducción a MATLAB 7‐José Cortés Parejo 26
Hasta el momento, todo lo visto se supone realizado en la Ventana de Comandos. Pero MATLAB es sobre todo un entorno de programación en el que se pueden escribir programas conteniendo comandos, expresiones y naturalmente, sentencias de tipo bucle y bifurcaciones. También dispone de funciones de entrada/salida desde/a fichero que, aunque pueden ejecutarse en la Ventana de Comandos, se ha preferido describirlas en este capítulo, pues es donde mejor encajan. El lenguaje de programación de MATLAB es similar a C, con algunas diferencias importantes, como que se trata de un intérprete de comandos. En todo caso, hay que decir que un programa escrito en MATLAB puede ser convertido a C y compilado para ganar en velocidad de ejecución. Los ficheros que MATLAB utiliza para progamación tienen la extensión .m y fueron descritos brevemente en la sección 1.2. Son ficheros de texto ASCII y, como ya se dijo, aunque pueden crearse y editarse con cualquier editor de texto, generalmente éstos añaden la extensión .txt y podrían leerse desde MATLAB, pero no los reconocería como conteniendo un programa. Puede cambiarse la extensión a .m, pero desde luego es mucho mejor y recomendable utilizar el editor que incorpora MATLAB, pues añade la extensión .m, distingue el tipo de comando o sentencia coloreándolo de forma diferente, proporciona indentaciones automáticas para mejor legibilidad de los bucles y bifurcaciones y controla los paréntesis de cierre en combinación con los de apertura en expresiones algebraicas.
3.1 Ficheros m Para crear un fichero .m basta con ir al menú File y seleccionar New, eligiendo una de las dos primeras opciones que se nos muestra: Script o Function. Su principal diferencia es que los primeros generalmente realizan cometidos que se desarrollan íntegramente dentro del programa (aunque se hagan llamadas al exterior) y no tienen parámetros de entrada ni variables de salida, mientras que los de tipo function realizan una función concreta (valga la redundancia) sobre datos que se le pasan y, tras realizar las instrucciones especificadas, devuelven los resultados en variables. Para entendernos, un Script sería el programa principal y las functions, las subrutinas que son llamadas desde el programa principal.
Scripts
El siguiente código corresponde al contenido de un fichero .m de tipo Script generado desde dentro de MATLAB, donde vemos en color violeta parámetros que utilizan algunos comandos o funciones, en verde un comentario y en azul palabras claves para comienzo y fin de bucles y bifurcaciones.
close all marco(520,1019,238,737) ventana(-1.5,1.5,-1.5,1.5) % Dibujo de una circunferencia i=1; for t=-pi:0.1:pi x(i)=cos(t); y(i)=sin(t); i=i+1; end plot(x,y,'b')
3‐ Programación
Introducción a MATLAB 7‐José Cortés Parejo 27
El programa contiene un comando del sistema (close all), llamadas a funciones escritas por el usuario que establecen una ventana gráfica en el monitor (marco) de 500x500 pixels cuadrada a la derecha y arriba de la pantalla y otra ventana de trabajo virtual (ventana), el bucle for/end y finalmente una instrucción de dibujo (plot). Todos estos comandos y funciones de tipo gráfico se estudiarán en detalle en el Capítulo 4. El programa, como fácilmente puede deducirse, dibuja una circunferencia.
Para ejecutar el programa contenido en un fichero Script sólo hay que escribir su nombre (sin la extensión .m) en la Ventana de Comandos y dar a la tecla Return (); pero nótese que estos ficheros pueden también utilizarse escribiendo su nombre, como si se tratara de un comando, dentro de otro programa.
Functions
Una function es también un programa. Ya las mencionamos en la sección 2.1, refiriéndonos a las funciones del sistema tal como exp o factor. Sin embargo, aquí nos interesa la posibilidad que ofrece MATLAB para crear nuestras propias functions. Un fichero .m es una function cuando va encabezado por una sentencia del tipo:
function [y1,y2,…,yk] = nombre(x1,x2,…,xn)
donde x1,x2, … ,xn son los argumentos de entrada o datos (numéricos, variables o matrices
previamente asignadas) que se proporcionan a la función. Por su parte, y1,y2, … ,yk son las variables de salida (que a su vez pueden ser vectores o matrices), las cuales son el resultado del cálculo interno que realiza la función. El nombre que aparece delante del paréntesis incluyendo a los argumentos de entrada debe ser obligatoriamente el mismo que el nombre del fichero .m que aloja la función. El siguiente programa es el contenido de un fichero llamado newton.m:
% Metodo de Newton
function Iter = newton(x0,n)
k=abs(2*exp(1)-1); x=x0; for i = 1:n x = x-fun1(x)/fun1der(x); Error = abs(fun1(x))/k; Iter = [i x Error] end Esta rutina recibe como argumentos de entrada 2 variables conteniendo respectivamente un número real x0 y un entero n y realiza n iteraciones del método de Newton para hallar una raíz de la función fun1 (que a su vez es otra function contenida en el fichero fun1.m). También utiliza una segunda function, fun1der, que estará definida en el fichero funder1.m. Una function se puede ejecutar desde la Ventana de Comandos, desde dentro de otra function o desde un programa Script, escribiendo su encabezamiento sin la palabra function y suponiendo que los argumentos de entrada son números o variables (escalares, vectoriales o matriciales) con valores previamente asignados. Las variables de salida no tienen por que tener los mismos nombres empleados en la definición de la function. Por ejemplo, desde la Ventana de Comandos:
>> Result = newton(2.5,100)
Al dar se ejecurá la function y el resultado quedará almacenado en el vector Result.
Introducción a MATLAB 7‐José Cortés Parejo 28
Nótese que a continuación podría invocarse la misma función con diferentes argumentos de entrada y una variable distinta de salida. En los 2 ejemplos anteriores, un script y una function, se han incluido comentarios, que se muestran en color verde y comienzan con el carácter %. Cuando el intérprete de MATLAB encuentra este carácter, ignora todo lo escrito en la misma línea. ► Pueden también seleccionarse varias líneas y con el botón derecho del ratón pinchar en la opción Comment: quedarán comentadas con % todas las líneas seleccionadas. En ocasiones, en la fase de depuración de un programa es útil que no se ejecute un conjunto de instrucciones (para tratar de ver si es en estas instrucciones donde se está produciendo un determinado error): basta con comentarlas con %. Con posterioridad puede eliminarse el símbolo de comentario y de nuevo las instrucciones podrán ejecutarse.
Sub‐funciones
Desde la últimas versiones de MATLAB se permite que dentro de una function se definan una o varias sub‐funciones, utilizando la misma estructura y formato que una function. La única restricción es que estas sub‐funciones son locales y sólo se pueden ejecutar como parte de la function principal, que es la que aparece en primer lugar. Por ejemplo, podemos utiliar la siguiente variación sobre el programa que acabamos de ver:
% Metodo de Newton function Iter = newton(x0,n) K=abs(coef(1)); x=x0; for i=1:n x=x-fun1(x)/fun1der(x); Error=abs(fun1(x))/k; Iter=[i x Error] end function zz = coef(fi) zz=2*exp(fi)-1;
La sub‐función es zz = coef(fi) y cuando es llamada desde la línea 2 con argumento 0, devuelve el valor 2*exp(1)-1.
Digamos para finalizar que es de notar que expresiones del tipo coef(1) o fun1(x), que son funciones, tienen la misma sintaxis que llamadas a vectores. MATLAB sin embargo las diferencia al estar definidas como function. Naturalmente, en este caso no podrían existir vectores cuyos nombres fueran coef o fun1.
Variables Locales y Globales
Todas las variables que no sean de salida (escalares o matriciales) a las que se asignan valores dentro de un script o function son locales y no están definidas fuera del correspondiente programa. Por ejemplo, si ejecutamos el anterior programa desde la Ventana de Comandos (es conveniente ejecutar previamente un clear all) y queremos saber el valor de la variable K:
>> K ??? Undefined function or variable 'K'.
Introducción a MATLAB 7‐José Cortés Parejo 29
pues en efecto K era una variable local a la función newton.m. Para hacer que una variable pueda estar disponible en varios programas o funciones, o bien en la propia Ventana de Comandos, MATLAB proporciona el comando global nombre (el color azul lo pone MATLAB) y debe incluirse como sentencia en todo programa en el que se pretenda utilizar dicha variable. Por ejemplo, si en nuestro programa incluimos (al principio) el comando:
global K
y en la Ventana de Comandos:
>> global K Cuando ejecutemos de nuevo el programa newton.m, aparte de los resultados, podremos saber el valor de la variable K:
>> K K = 1.8955 y ahora ya no se obtiene un mensaje de error pues K es global y existe en los espacios de trabajo de nuestro programa y en el de la Ventana de Comandos.
3.2 Bucles Un bucle, como sabe cualquier persona iniciada en la programación, consiste en un grupo de sentencias o instrucciones que se repiten una y otra vez hasta que se cumpla determinada condición. Cuando esto ocurre, el programa continúa ejecutándose normalmente en la línea siguiente a la de finalización del bucle. Naturalmente se supone que las sentencias contenidas en el bucle no se ejecutan exactamente con los mismos datos en cada repetición o iteración, sino que por ejemplo, van creando dinámicamente un vector (en cada iteración el vector tiene una dimensión más), o bien una variable incrementa su valor de una iteración a otra. En MATLAB todos los bucles son del tipo “con control al principio” y esto quiere decir que la condición que gobierna las repeticiones se escribe al comienzo del conjunto de sentencias que contiene. Existen 2 tipos de bucles y cada uno está regulado por un tipo de condición:
Bucles for
Un bucle for tiene la estructura: for variable = x1:inc:x2 sentencia 1 sentencia 2 ----------- sentencia n end Este tipo de bucle está controlado por una variable, digamos x, que comienza tomando el valor x1. Cada vez que se ejecuta el conjunto de sentencias incluidas entre las palabras clave for y end,
Introducción a MATLAB 7‐José Cortés Parejo 30
x se incrementa en el valor de la variable inc y se compara con el valor final, contenido en la variable x2. Mientras sea x x2, se continúa ejecutando el grupo de sentencias. Ya hemos visto un ejemplo simple de bucle for:
i=1; for t = -pi:0.1:pi x(i)=cos(t); y(i)=sin(t); i=i+1; end plot(x,y,'b')
En él la variable t toma el valor inicial t = - 3.14159265358979 y tras ejecutarse el cuerpo del bucle (las 3 sentencias que siguen al for), se incrementa su valor en 0.1 y se vuelven a ejecutar las 3 sentencias. El proceso continúa mientras sea t pi (el último valor de t que cumple la condición es t = 3.05840734641021) y una vez completo el bucle, se continúa la ejecución en la sentencia siguiente a la palabra clave end, en este caso la función de dibujo plot(x,y,'b'). Un bucle for puede contener a su vez otro bucle for, en cuyo caso se habla de “bucles anidados”:
i=1; for u = -2:0.1:2 j = 1; for v = -1:0.1:1 X(i,j) = u; Y(i,j) = v ; j = j+1; end i = i+1; end
Este programa genera dinámicamente 2 matrices de 41 filas por 21 columnas y lo hace por filas: cuando se inicia el bucle “exterior” (el primero de ellos), la variable i tiene el valor 1 y se ejecutará todo el bucle “interior” con este valor de i, como si se hubiera escrito:
for v = -1:0.1:1 X(1,j) = u; Y(1,j) = v ; j = j+1; end
Tras la ejecución completa se habrá generado la 1ª fila de las matrices X e Y, transfiriéndose el control a la siguiente sentencia (i = i+1). En la siguiente iteración del bucle exterior la variable i tiene el valor 2 y con el bucle interior se generarán la 2ª fila de las matrices X e Y y así sucesivamente.
Bucles while
Un bucle while tiene la estructura:
while expresión sentencia 1 sentencia 2 ----------- sentencia n end
Introducción a MATLAB 7‐José Cortés Parejo 31
Es un tipo más general de bucle y su funcionamiento está controlado por la “expresión”, que usualmente se trata de una de tipo relacional y/o lógica. Recordemos que estos operadores comparan expresiones algebraicas y devuelven un 1 cuando la comparación es cierta y un 0 en caso contrario. El cuerpo de sentencias se ejecuta mientras sea cierta la condición. Un sencillo ejemplo pone de manifiesto una de las diferencias entre los bucles for y while. El siguiente programa calcula una aproximación a la serie:
1 1 1 11 ...
2 4 8 16S
Cuyo valor exacto es 2S :
S = 1; x = 1; while x > 0.000001 x = x/2; S = S + x; end S La suma de los términos se realiza mientras (while) el valor del correspondiente término sea mayor que una millonésima. Y esto se hace sin tener que precalcular a partir de qué término ocurre lo contrario. Por esto while se emplea a menudo cuando no se conoce previamente el número de iteraciones o repeticiones que tiene que efectuar el bucle, sino que este número viene controlado por el cumplimiento o no de una determinada condición.
3.3 Bifurcaciones Una bifurcación es una sentencia que permite ejecutar o no un conjunto de instrucciones dependiendo de que se cumpla una determinada condición. Cuando durante la ejecución de un programa o función se llega a una de estas sentencias, se evalúa la condición (verdadera o falsa) y entonces el programa se bifurca a un bloque u otro de instrucciones. Existen 2 tipos de bifurcaciones, que describiremos con algún ejemplo en los siguientes apartados.
Sentencia if/else
Una bifurcación if se ecribe, en su forma más simple:
if condición sentencia 1 sentencia 2 ----------- sentencia n end siguiente sentencia
La condición es generalmente de tipo relacional (compara una variable o expresión con otra), pero también se pueden encadenar condiciones mediante operadores lógicos. Cuando la condición es cierta, se ejecuta el conjunto de instrucciones inmediatamente debajo y hasta llegar a end. Entonces continúa la ejecución en la siguiente sentencia o instrucción que debajo de end. En el caso de que la condición sea falsa, la ejecución se salta todo el bloque de sentencias y continúa en la siguiente instrucción bajo end. Veamos un ejemplo:
Introducción a MATLAB 7‐José Cortés Parejo 32
function pitagorico(V)
s = sqrt(V(1)^2 + V(2)^2); W = V;
if s == fix(s) W(3) = s; end W
Este programa de tipo function tiene como argumento de entrada un vector V de 2 elementos y comprueba si la suma de los cuadrados de estos elementos es un cuadrado perfecto (es decir, si la raíz cuadrada de esta suma es un entero). En caso de que se cumpla la condición, añade este valor como tercer elemento de V (aumento dinámico de la dimensión). En cualquier caso la ejecución sigue en la sentencia a continuación de end que lo único que hace es mostrar en la Ventana de comandos el contenido del vector W. Si la condición ha sido cierta, la última instrucción mostrará un vector de 3 elementos (una terna pitagórica), pero en caso contrario W sólo tendrá 2 elementos. Puede definirse un segundo bloque de sentencias o instrucciones para ser ejecutadas cuando no se cumple la condición. Esto se hace con la palabra clave else:
function x = resuelve(A,y);
D = det(A); if D == 0 x = Inf; disp 'El sistema no tiene solución' else x = inv(A)*y; end x Esta función tiene como argumentos de entrada una matriz A y un vector columna y. Pretende resolver el sistema de ecuaciones Ax = y cuando esto sea posible. Para ello calcula como paso previo el determinante de la matriz y pregunta si es 0, en cuyo caso asigna a la variable de salida x el valor Inf (esta es una variable de entorno, que funciona como infinito) y a continuación muestra en pantalla un mensaje utilizando el comando del sistema disp. En caso contrario, es decir si det(A)0, resuelve el sistema. En cualquiera de los 2 casos la ejecución se retoma en la siguiente instrucción después de end, que en este ejemplo, muestra el contenido de la variable x Igual que ocurría con los bucles, las sentencias if pueden anidarse.
Sentencia switch/case/otherwise
Se trata de una bifurcación múltiple que muchas veces simplifica la utilización de varias sentencias if anidadas. Su estructura general es:
switch expresión algebraica case e1 Grupo 1 de sentencias case e2 Grupo 2 de sentencias ----------- case eN Grupo N de sentencias otherwise Grupo alternativo de sentencias end
Introducción a MATLAB 7‐José Cortés Parejo 33
Al llegar la ejecución de un programa o función a la sentencia switch se evalúa la expresión algebraica que figura a la derecha. Cada grupo de sentencias Grupo 1, Grupo 2 … Grupo N es un conjunto de sentencias que se ejecuta para aquél valor e1, e2, … eN que coincida con la expresión que acompaña a switch. En el caso de que no exista coincidencia, se ejecuta entonces un grupo alternativo de sentencias, el que sigue a la palabra clave otherwise y hasta llegar a end . Un ejemplo pondrá de manifiesto su uso:
switch x case -1 a = [-1:0.1:0]; y = sqrt(1-x.^2); case 0 a = [0:0.1:1]; y = sqrt(1-x.^2); case 1 a = 0; y = 0; otherwise disp 'fuera del intervalo de definición' end plot(a,y,'b')
Supongamos que este conjunto de sentencias se incluye en un bucle for en el que la variable x varíe desde ‐2 a 2 de 1 en 1. Cuando x tome el valor -2 no ocurrirá ninguno de los case y se ejecutará el bloque otherwise que muestra en pantalla el mensaje 'fuera del intervalo de definición'. En la siguiente iteración x = -1 y se ejecutará el bloque correspondiente a case -1; en la siguiente es x = 0 y se ejecutará el bloque correspondiente a case 0. En la siguiente iteración será x = 1 y se ejecutará el bloque correspondiente a case 1. Finalmente, para x = 2 ninguno de los case es cierto y se ejecutará el bloque otherwise.
Como resulta bastante evidente, este programa dibuja la función 21y x en el intervalo [‐2,2],
previniendo los casos en que no está definida.
3.4 Ruptura de la ejecución Se trata de sentencias de control de flujo en un programa para forzar la terminación inmediata de la ejecución en bucles o functions. Generalmente se utilizan en conjunción con bifurcaciones, permitiendo que una de las opciones de bifurcación sea la ruptura de ejecución y devolución del control a otro punto del programa.
Sentencia break
Termina la ejecución de un programa, bucle for o while. Si aparece en un grupo de bucles anidados, sólo interrumpe la ejecución en el bucle que contiene la sentencia y devuelve el control al bucle inmediatamente más exterior.
Sentencia continue
En un bucle, termina la ejecución de la iteración en curso y pasa a la siguiente iteración del bucle en el que está contenida la sentencia.
Introducción a MATLAB 7‐José Cortés Parejo 34
Sentencia return
Parecida a break, pero de uso exclusivo en functions. Termina la ejecución de una function y devuelve el control al programa o función que la invocó.
3.5 Entrada/Salida de datos Ya vimos en la sección 1.3 los comandos save y load que permitían guardar las variables y su contenido en un fichero o bien recuperarlas. En realidad estos comandos son bastante toscos pues no facilitan prácticamente control sobre la forma de guardar los datos y load sólo puede leer ficheros previamente salvados con load. En esta sección hablaremos de comandos o funciones que sí nos proporcionan este control en la escritura o lectura de datos.
Entrada/Salida interactiva
Se trata de funciones que permiten leer datos escritos desde teclado por el usuario o escribir en pantalla el contenido de variables en tiempo de ejecución de un programa.
Función input
Cuando durante la ejecución de un programa se llega a una sentencia incluyendo esta función, se detiene la ejecución, se imprime en pantalla un mensaje (especificado por el programador) y espera a que el usuario introduzca datos desde teclado. Tras dar el programa continúa la ejecución asignando el dato introducido a la correspondiente variables Su formato es:
V = input('mensaje')
donde 'mensaje' es el texto que se desea mostrar al detenerse la ejecución (hay que poner comillas simples) y V es la variable escalar, vectorial o matricial. Nótese que en situaciones concretas la entrada podría ser incluso una cadena de caracteres, con lo cual V sería un vector con un carácter por componente. Un ejemplo del uso de input:
V = input('introducir un vector de 2 elementos: ')
Al llegar la ejecución a este punto, se mostrará en pantalla
introducir un vector de 2 elementos:
Si tecleamos a continuación [2 5] y damos se leerá el vector introducido y se asignará a V. Función disp
Sirve para mostrar en pantalla datos (numéricos o de texto). Su formato es el siguiente:
disp(x)
donde x puede ser un escalar, vector, matriz o cadena de caracteres (poniendo en el lugar de x directamente el dato o bien el nombre de la variable que lo contenga). Por ejemplo:
x = 7.5; disp('raíz de la ecuación':) disp(x)
Introducción a MATLAB 7‐José Cortés Parejo 35
cuando el programa llega a este punto aparecerá en pantalla:
raíz de la ecuación:
7.5
Una variante de esta función es display que sólo se diferencia en que la respuesta también muestra el nombre de la variable. Si en las anteriores 3 líneas sustituimos disp(x) por display(x), entonces al ejecutarse obtendremos:
raíz de la ecuación:
x =
7.5
Funciones fopen y fclose
Son funciones que se limitan a abrir o cerrar un fichero con objeto de leer o escribir datos en él. Función fopen
Abre un fichero. Su formato general es:
Id = fopen('nombre de fichero','clave')
donde nombre de fichero (hay que ponerlo entre comillas simples) es el nombre de un fichero que debe estar en el Directorio Activo, en alguna de la Paths definidas o bien especificando su path completa. La variable Id es un entero que devuelve la función y se utiliza como identificador del fichero. MATLAB reserva los identificadores ‐1, 0, 1, y 2 con significados específicos. Si se produce un error al abrir el fichero (por ejemplo, que no lo encuentre), el sistema devolverá Id = -1. Los otros 3 valores reservados no son de mucho interés. Si el fichero se abre con éxito, se devolverá un número mayor o igual que 3 que asignará automáticamente MATLAB e irá aumentando en sucesión según se ejecuten posteriores funciones fopen. Finalmente clave es una cadena de 1 o 2 caracteres que indica el uso que se la va a dar al fichero abierto y puede ser una de las siguientes (consultar help fopen para más opciones):
'r' abre para lectura de datos 'w' abre para escritura (descartando su contenido, si lo tiene) 'a' abre para escritura, añadiendo lo que vaya a escribirse al final del contenido
Por ejemplo:
Id = fopen('coeficientes.m','r')
Si se produce un error, tras ejecutar la sentencia la variable Id contendrá un ‐1. Si en cambio el fichero se abre con éxito Id contendrá un 3 (si es la 1ª que se usa fopen) o un entero ≥ 3. Función fclose
Sirve para cerrar un fichero. Su uso es más simple:
fclose(Id)
donde Id es la variable devuelta por fopen o bien directamente su valor.
Introducción a MATLAB 7‐José Cortés Parejo 36
Funciones fprint y fscanf
Son funciones para escribir o leer datos en ficheros de texto previamente abiertos con fopen. La función fprintf es más intuitiva pues escribe los datos tal y como le especificamos que lo haga. En cambio fscanf depende de cómo estén ya escritos los datos en el fichero y a veces puede producir resultados inesperados.
Función fprintf
Escribe datos a un fichero. Se emplea en la forma:
fprintf(Id,'formato',V)
donde Id es el identificador del fichero en el que se va a escribir y V es el dato, variable, vector o matriz que se pretende escribir. Una misma sentencia fprintf puede contener un grupo de especificaciones de formato y variables separados por comas. Por su parte formato es una cadena de caracteres (incluida entre comillas simples) que precisa la forma de escribir los datos de una forma similar a como se hace en lenguaje C. Cada especificación comienza con el carácter % al que sigue, opcionalmente, una anchura de campo (número de dígitos o caracteres a escribir) y una clave de conversión. Los principales especificadores son:
%d Números enteros. Ejemplo: %5d escribe 5 números enteros %f Números decimales de punto fijo. Ejemplo: %12.5f escribe el número con 5 decimales y
lo coloca en un espacio total de 12 caracteres, incluyendo el punto y el signo. %e Idem para números en coma flotante. %s Cadena de caracteres. %c Escritura de un único carácter. Para escribir por ejemplo 12 caracteres: %12c También se admite como especificador de formato el carácter \ (barra invertida) que se utiliza para realizar “backspace”, tabulación o pasar a una nueva línea. Este último caso, que es el que más se emplea, se escribe simplemente \n. Función fscanf
Lee datos de un fichero. Su uso más simple es: (consultar help fscanf):
V = fscanf(Id,'formato')
donde Id es el identificador del fichero del que se van a leer datos y V la variable, vector o matriz en la que se almacenarán los datos leídos. El formato de lectura viene especificado de forma similar a fprintf aunque como ya se ha dicho, pueden aparecer problemas inesperados si los datos no están escritos en el fichero tal y como esperamos que lo estén.
Introducción a MATLAB 7‐José Cortés Parejo 37
MATLAB proporciona potentes funciones para la creación de gráficos vectoriales 2D y 3D, esto es aquéllos en los que las entidades geométricas a dibujar (puntos, rectas, curvas, polígonos, superficies poliédricas o regulares) están definidas mediante coordenadas o ecuaciones. En el caso de objetos 3D, se entiende que su representación en pantalla se realiza a través de una perspectiva o fotografía virtual de los mismos. También es posible manipular en MATLAB gráficos de mapas de bits o bitmaps, que son aquéllos que precisamente carecen de estructura geométrica (vectorial) y son una mera matriz rectangular de pixels coloreados, como en una fotografía digital. Es de notar que en todo caso, la representación de objetos vectoriales en la pantalla de un monitor es en sí misma un mapa de bits, aunque es conveniente entender la diferencia: podemos tener en las correspondientes variables las coordenadas “exactas” (dentro de la precisión de MATLAB) de (sólo) los puntos extremos de un segmento de recta 2D, mientras que en pantalla lo que vemos es un conjunto de pixels coloreados que representan una aproximación discreta a los infinitos puntos del segmento.
4.1 Gráficos vectoriales 2D
Un gráfico vectorial 2D es aquél en el que todo lo que se dibuja está definido geométricamente mediante coordenadas de puntos (con respecto a un sistema de referencia) o ecuaciones de curvas. La principal ventaja de este tipo de gráficos está en que representan los objetos en su nivel matemático más abstracto. Las entidades geométricas creadas pueden entonces ser movidas (trasladadas), escaladas o rotadas simplemente operando sobre las coordenadas (estos operadores se denominan Transformaciones Afines). Nótese que incluso el texto que se muestra en pantalla (no sólo en MATLAB, sino en cualquier aplicación corriendo bajo Windows) es en realidad un gráfico vectorial que describe mediante una ecuación la curva 2D que corresponde a la forma de cada carácter. Sin embargo, el usuario no tiene que preocuparse por este tipo especial de gráfico: las ecuaciones están escritas en los ficheros asociados a cada fuente de letra.
Definición de una ventana gráfica o Marco
Lo primero que debemos hacer antes de dibujar cualquier gráfico es decirle a MATLAB en qué zona (rectangular) de la pantalla queremos que aparezca nuestro dibujo. Esta zona es lo que se denomina una Viewport (Marco) y su posición y dimensiones se especifican en pixels. La función figure define una Viewport o Marco de pantalla en el que van a aparecer los gráficos que posteriormente creemos. Esta función debe utilizarse por tanto antes que cualquier otra función de dibujo. Su formato es:
figure('Propiedad 1',Valor 1,'Propiedad 2',Valor 2, ...)
donde Propiedad 1, Propiedad 2, etc. son nombres clave que especifican una determinada característica del Marco y su nombre debe ir entre comillas simples. Por su parte, Valor 1, Valor 2, etc. son valores numéricos o caracteres que definen parámetros asociados. Existen más de medio centenar de propiedades o características que pueden definirse para un Marco, y pueden consultarse con los comandos help figure o doc figure, pero la gran
4‐ Gráficos 2D/3D
Introducción a MATLAB 7‐José Cortés Parejo 38
mayoría de ellas no suelen utilizarse. MATLAB asigna valores por defecto a estas propiedades y un usuario normal sólo cambiará unas pocas. Las principales son:
position establece la posición y dimensiones del Marco de dibujo. El Valor que le acompaña es un vector de 4 elementos conteniendo, en pixels, las coordenadas del vértice inferior izquierdo del Marco y el número de pixels en horizontal y vertical. El sistema de referencia utilizado por MATLAB tiene su origen en el pixel inferior izquierdo de la pantalla y las unidades comienzan en 1 (no en 0, como es habitual en otras aplicaciones). Por ejemplo:
figure('position',[500 200 400 400])
crea un Marco cuyo vértice inferior izquierdo es el pixel (500, 200) y tiene una anchura y altura de 400 pixels.
color Indica el color de fondo del Marco. Por defecto es gris, pero habitualmente el usuario lo establecerá en blanco con el parámetro 'w' (white). Ver más adelante la especificación en MATLAB del color.
menubar Por defecto, MATLAB incluye el Marco en una ventana estándar de Windows con el típico menú en la parte superior. La propiedad menubar sirve para no mostrar esta barra de menú y su parámetro es 'none'.
numbertitle También por defecto, la cabecera de la ventana de Windows que contiene al Marco incluye un “número de Marco” que va aumentando si se establecen sucesivas llamadas a figure. Con el parámetro 'off' no se mostrará éste.
Unas buenas elecciones de propiedades y parámetros para una sesión de dibujo podrían ser:
figure('position',[1 1 1024 768],'color','w') (pantalla completa)
o bien:
figure('position',[521 239 500 500],'color','w','menubar','none','numbertitle','off')
que establece un Marco cuadrado de 500x500 pixels en la parte superior derecha de la pantalla (suponiendo una resolución de pantalla de 1024x768 pixels), con el fondo de color blanco, sin la barra de menú y sin el número de Marco. La Figura 2 en el Capítulo 1, muestra un Marco de estas características, que tiene la ventaja de dejar espacio suficiente en la pantalla para mostrar la Ventana de Comandos y el Editor de texto de MATLAB (en el que aparece el programa que genera el gráfico).
Definición de una Ventana virtual
Una ventana virtual es una zona rectangular del Sistema de Referencia Universal (SRU), que es en el que trabaja el ususario en sus propias unidades (unidades abstractas, milímetros, pulgadas, etc.). Es como si a un papel milimetrado con cuadrícula de 1x1 mm. (que sería el equivalente a la Viewport o Marco) le asociáramos nuestras propias unidades. Por ejemplo, en un plano de una ciudad dibujado sobre el papel milimetrado, podíamos establecer que el espaciado entre las líneas de cuadrícula son 50 metros en la ventana virtual. También podríamos establecer que el origen del SRU sea el centro del papel milimetrado, de forma que las unidades en horizontal sean negativas a la izquierda del origen y positivas a la derecha. Y lo mismo con el eje vertical.
Introducción a MATLAB 7‐José Cortés Parejo 39
La función que permite definir y especificar las propiedades de una ventana virtual (técnicamente se denomina Window o Ventana) es axes y adopta un formato similar a figure:
axes('Propiedad 1',Valor 1,'Propiedad 2',Valor 2, ...)
donde las “propiedades” y “valores” tiene un significado similar a los de la función figure, aunque son distintos.
► Es muy importante llamar a esta función después de haber definido ya un Marco con la función figure para evitar que se establezcan propiedades por defecto para figure que darían lugar a resultados inesperados. Nótese que en el momento de inicio de MATLAB el sistema asigna a todas las propiedades de figure y axes valores por defectos (incluso aunque no se vaya a dibujar ningún gráfico), de ahí la conveniencia de fijar previamente el Marco de pantalla y a continuación la Ventana de trabajo.
Como sucedía con figure, existen multitud de propiedades a las que MATLAB asigna valores por defecto, pero un usuario normal sólo estará interesado en cambiar algunas. Veamos las principales:
position esta propiedad especifica lo mismo que en figure; pero mientras que allí las unidades eran pixels y se referían a la pantalla completa, ahora son, por defecto, en unidades “normalizadas” (números decimales entre 0 y uno en ambos ejes) y se refieren al Marco o Viewport previamente establecido (son porcentajes de sus longitudes), de forma que por ejemplo en abscisas el 0 se asigna al extremo izquierdo del Marco y el 1 al extremo derecho. Así, el Valor que le acompaña es un vector de 4 elementos en el que los dos primeros establecen el origen de coordenadas, y los 2 siguientes, el ancho y alto de la Ventana. Por ejemplo:
axes('position',[0.2 0.2 0.6 0.6])
establece una Ventana con origen a 0.2 unidades en horizontal y 0.2 unidades en vertical con respecto al extremo inferior izquierdo del Marco; es decir, ambas coordenadas están a un 20% del tamaño total del Marco comenzando en su extremo inferior izquierdo. Los otros dos elementos indican que tanto el ancho como el alto de la Ventana son de un 60% la longitud de las correspondientes longitudes en el Marco (por tanto, aún “sobraría” un margen del 20% a la derecha y arriba del Marco.
Salvo para situaciones especiales, es muy recomendable definir la position como:
axes('position',[0 0 1 1])
queriendo con ello indicar simplemente que se pretende utilizar todo el Marco de pantalla como zona de dibujo: origen en el extremo inferior izquierdo y 100% de ancho y alto.
xlim, ylim Especifican los intervalos para las abscisas y ordenadas en unidades “abstractas” (números decimales cualesquiera). El Valor de estas propiedades son sendos vectores de 2 elementos. Por ejemplo:
axes('position',[0 0 0 0]),'xlim',[-1.5 1.5],'ylim',[0 2.5])
DataAspectRatio Escalado de los ejes X, Y, Z (también afecta a la 3ª coordenada para gráficos 3D).
Introducción a MATLAB 7‐José Cortés Parejo 40
El valor de esta propiedad, salvo en alguna aplicación excepcional, debería ser el vector [1 1 1], indicando con ello que las 3 coordenadas están igualmente escaladas. Nótese que MATLAB por defecto asigna a esta propiedad el vector [2 2 1], por lo que la coordenada Z estaría escalada a la mitad en gráficos 3D.
► Como regla general la función axes; debe invocarse de forma parecida al siguiente ejemplo:
axes('position',[0 0 1 1],'xlim',[x1 x2],'ylim',[y1 y2],'DataAspectRatio',[1 1 1])
donde x1,x2,y1,y2 son valores numéricos correspondiendo a las abscisas mínima y máxima y a las ordenadas mínima y máxima en nuestro dibujo concreto.
Función axis
La función axis es una versión de alto nivel de axes, y permite establecer o desactivar algunas
propiedades de axes, utilizando un formato más cómodo. Por ejemplo:
axis([x1,x2,y1,y2])
especifica los límites de la Ventana de trabajo, o bien:
axis equal
es equivalente a 'DataAspectRatio',[1 1 1]) en la función axes. MATLAB, por defecto, también dibuja ejes con marcas sobre ellos y etiquetado (numeración). Aunque esto puede ser útil en ocasiones, a menudo el usuario preferirá no dibujar ejes o dibujarlo por sí mismo y lo mismo sucederá con las marcas o la numeración. Para desactivar estas características por defecto podemos usar axis, en la forma axis off
Función hold
En los siguientes apartados veremos las principales funciones de dibujo. Sin embargo, antes conviene hablar de la función de inicialización hold. Su cometido consiste en permitir que todas las funciones de dibujo que se empleen después de haberla invocado se realicen en la ventana gráfica (Marco) establecida. Por defecto, su estado es off, lo que significa que cuando se dibuje algo, se eliminarán algunas propiedades de la Ventana y el Marco previamente establecidos y se pondrán a su valor por defecto (lo cual no suele ser lo deseado). La forma más sencilla de evitar esto consiste en utilizar hold on o simplemente hold (que conmuta entre off y on).
Implementación de las funciones de iniciación
Como se ha comentado, las funciones figure y axes tienen multitud de “propiedades” o características que son inicializadas por MATLAB durante el proceso de arranque. Se ha destacado que algunas de estas propiedades por defecto pueden no ser las deseadas por un usuario normal. Por ejemplo, si no se llama a la función figure, cuando creemos un gráfico MATLAB lo situará en un Marco o Viewport establecido por defecto, generalmente en el centro de la pantalla (que ocultará lo que se esté mostrando en ese momento), con el fondo gris y con unas dimensiones pre‐establecidas. También, si no se utiliza axes MATLAB ajustará todo lo que dibujemos para que ocupe el Marco completo.
Introducción a MATLAB 7‐José Cortés Parejo 41
Por eso hay que insistir en la necesidad de utilizar de forma apropiada estas 2 funciones como inicialización de cualquier programa en el que vayan a realizarse gráficos.
Dado que unas especificaciones más o menos estándares como las que se han indicado:
figure('position',[521 239 500 500],'color','w','menubar','none','numbertitle','off')
axes('position',[0 0 1 1],'xlim',[x1 x2],'ylim',[y1 y2],'DataAspectRatio',[1 1 1])
son complicadas de escribir (aunque se puede utilizar copy/paste desde un fichero ya existente) y “afean” la presentación de nuestros pogramas, es recomendable que cada usuario cree sus propias funciones de inicialización que sólo tengan como datos de entrada lo que realmente sea variable de un programa de dibujo a otro. Por ejemplo, si un usuario decide que generalmente va a utilizar como Marco o Viewport uno sin que aparezca en la ventana de Windows ni el menú, ni el número de figure y que tenga el fondo blanco, puede crear una function en un fichero llamado por ejemplo Marco.m con el siguiente contenido:
A esta función sólo hay que pasarle las coordenadas (px,py) del vértice inferior izquierdo del Marco (en pixels) y las longitudes horizontal y vertical (también en pixels). Si por ejemplo en un programa en el que vamos a generar gráficos, incluimos la sentencia:
Marco(521,239,500,500)
se creará una figure consistente en un Marco de 500x500 pixels alineado arriba a la derecha, con el fondo blanco y sin que aparezca el menú de la ventana de Windows ni el número de figure. Más aún, si el usuario va a utilizar con frecuencia este Marco de 500x500 pixels, podría crear un fichero de nombre por ejemplo Marco500.m cuyo contenido fuese:
Entonces, en un programa de dibujo bastaría con utilizar la función Marco (sin argumentos) para que se creara la pretendida ventana gráfica. Lo mismo que con la definición de un Marco puede (y debe) hacerse con la definición de una ventana virtual o Window. Si creamos un fichero llamado por ejemplo Ventana.m cuyo contenido sea:
Bastará con escribir en nuestro programa de dibujo, por ejemplo:
Ventana(-1.5,1.5,0,2.5)
para que se invoque a la correspondiente función axes con nuestros parámetros pre‐establecidos.
function Ventana(xmin,xmax,ymin,ymax)
axes(’position’,[0 0 1 1])
axis equal
axis off
hold on
function Marco(px,py,nx,ny)
figure(’position’,[px py nx ny],’color,’w’,’menubar’,’none’,’numbertitle’,’off’)
function Marco
figure(’position’,[521 239 500 500],’color,’w’,’menubar’,’none’,’numbertitle’,’off’)
Introducción a MATLAB 7‐José Cortés Parejo 42
NOTA: a diferencia de lo que ocurre con los Marcos o Viewports, que a menudo serán el mismo en la mayoría de nuestros programas de dibujo, la Ventana virtual o Window que se invoca con axes variará de un programa a otro. Por ejemplo, un programa en el que se vaya a dibujar una circunferencia de centro (0,0) y radio 2 utilizaría una llamada a nuestra función Ventana del tipo:
Ventana(-2.5,2.5,-2.5,2.5)
Mientras que si lo que pretendemos es dibujar la función sen( )y x en el intervalo [0,], probablemente elegiríamos una Ventana del tipo:
Ventana(-0.5,3.5,-1.5,1.5)
Función de dibujo plot
La principal función de dibujo en MATLAB es plot. Se trata de una función muy versátil y potente, que en su formato más simple se escribe:
plot(x,y,color)
donde x,y son variables escalares o vectores (o directamente sus valores numéricos), mientras
que color es una especificación de color (ver más abajo). Cuando x,y son simplemente 2 números o variables escalares (en general decimales de doble precisión), indican las coordenadas de un punto (x,y) relativas a la Window o Ventana del Sistema de Referencia Universal (la establecida con la función axes). La función “crea” un punto virtual con toda su precisión numérica en la Window (que no es visible, dado que se trata de una ventana virtual) y “dibuja” un pixel en la Viewport o Marco de pantalla, y lo hace con el color especificado.
Si x,y son vectores han de tener el mismo número de elementos. El primer vector se interpreta como un conjunto de abscisas y el segundo, como uno de ordenadas, correspondiéndose unas y otras elemento a elemento. En este caso plot crea los puntos de coordenadas (x(i),y(i)) en la Window y los dibuja en
la Viewport de acuerdo con la especificación de color. La función plot por defecto dibuja los puntos uniéndolos con un segmento de recta, lo cual es ideal para la representación gráfica de una función a partir de un conjunto no demasiado numeroso de puntos. El grosor de los segmentos puede especificarse mediante la propiedad 'linewidth' que tiene como Valor dicho grosor expresado en “puntos”. En MATLAB, como en muchas aplicaciones, un “punto” es 1/72 pulgada (25.4 milímetros). Por defecto, el grosor es ½ punto. Por ejemplo:
plot(x,y,'linewidth',3)
dibuja los puntos conéctandolos con segmentos de una anchura aproximada de 1 mm.
La unión de los puntos mediante segmentos puede cambiarse mediante una opción que especifica un “marcador” para dibujar el punto. Los marcadores pueden ser un punto (.), círculo (o), asterisco (*), etc. (consultar help plot) y deben estar incluidos entre comillas simples. Por ejemplo:
plot(x,y,'.')
dibuja los puntos como un “punto”, mientras que:
plot(x,y,'o')
los representa mediante un pequeño círculo.
Introducción a MATLAB 7‐José Cortés Parejo 43
También plot admite la opción o propiedad 'markersize' que establece el tamaño del marcador; por ejemplo:
plot(x,y,'.','markersize',10)
dibuja puntos con un grosor de 10 unidades (ver doc plot o simplemente, probar manualmente algunos “tamaños” para el marcador).
Especificación del color
En MATLAB un color puede especificarse principalmente de 2 formas: el formato RGB y mediante una palabra clave.
Formato RGB: es un vector de 3 elementos indicando las proporciones de Rojo, Verde y Azul.
Son, por tanto, valores entre 0 y 1. Los colores primarios son:
Rojo: [r 0 0] 0< r 1 clave: 'r' Verde: [0 r 0] 0< r 1 clave: 'g' Azul: [0 0 r] 0< r 1 clave: 'b'
Los colores llamados secundarios son:
Cian: [0 r r] 0< r 1 clave: 'c' Magenta: [r 0 r] 0< r 1 clave: 'm' Amarillo: [r r 0] 0< r 1 clave: 'y'
Los denominados grises son de la forma [r r r] siendo casos particulares [1 1 1] (Blanco o 'w') y [0 0 0] (Negro o 'k').
MATLAB admite también la combinación de un marcador con una clave de color. Por ejemplo:
plot(x,y,'.b','markersize',10)
dibujaría los puntos con coordenadas en los vectores x,y con un punto de tamaño 10 coloreado en azul.
Veamos un ejemplo de dibujo de un polígono utilizando la función plot: cuadroSD500 ventana(1,10,1,10)
P=[4 2 5 9 8 6 4 9 5 2 4 8 7 9];
plot(P(1,:),P(2,:),'b','linewidth',2) plot(P(1,:),P(2,:),'.b','markersize',20)
Nótese cómo los puntos, cuyas abscisas están en la 1ª fila de la matriz P y ordenadas en la 2ª fila, se dibujan 2 veces: una vez uniendo los vértices mediante líneas y la segunda vez, utilizando un punto como marcador para resaltar los vértices.
Figura 3
Introducción a MATLAB 7‐José Cortés Parejo 44
Relleno de polígonos
MATLAB dispone de 2 funciones para rellenar polígonos: patch y fill. La primera, siendo mucho más potente que la segunda es considerada por MATLAB como de “bajo nivel”. En cambio, fill es más sencilla de utilizar. Veamoslas:
Función patch
Admite 2 tipos de formato. Para polígonos simples se escribe:
patch('XData',x,'YData',y,'FaceColor','color')
donde 'XData', 'YData', 'FaceColor' son palabras clave y x,y son vectores conteniendo las abscisas y ordenadas de los vértices del polígono a rellenar. Si el último vértice no coincide con el primero, esta función cierra automáticamente el polígono. Por ejemplo:
P=[1 4 3;2 1 5];
patch('XData',P(1,:),'YData',P(2,:),'FaceColor','y')
dibujaría el triángulo de vértices (1,2),(4,1),(3,5) y lo rellenaría de color amarillo.
Para dibujos en los que haya varios polígonos que compartan vértices es mucho más útil el segundo formato de patch:
patch('Vertices',V,'Faces',C,'FaceColor','color')
Aquí 'Vertices', 'Faces' y 'FaceColor' son palabras clave. V es una matriz que contiene las coordenadas de los vértices por filas, sin repetir y dados en cualquier orden. C es una matriz de conexión que especifica, por filas, los vértices que contiene cada polígono. Por ejemplo:
V=[1 2;4 1;3 5;6 3]
corresponde a los vértices (1,2),(4,1),(3,5),(6,3). Estos vértices pueden conectarse de diferentes maneras y ser compartidos por más de un polígonos. Nótese además que su orden es irrelevante. La matriz C de conexión:
C=[1 2 3;2 4 3]
indica en este caso que vamos a formar 2 polígonos: uno conectando los vértices 1º, 2º y 3º (y cerrando el triángulo) y el otro conectando los vértices 2º, 4º y 3º (y de nuevo, cerrando el triángulo). La Figura 4 muestra estos 2 polígonos, que se han creado a partir de una lista de coordenadas de puntos, seleccionado después cuáles de estos puntos conforman cada polígono. Este segundo modo de utilizar la función patch tiene su nayor interés en polígonos 3D, donde para objetos poliédricos varias caras pueden compartir vértices.
Función fill
Como se ha dicho, es una función de más alto nivel que patch y constituye la forma más rápida de dibujar un único polígono:
fill(x,y,'color')
rellena de color el polígono cuyas abscisas y ordenadas están en los vectores x,y.
Figura 4
Introducción a MATLAB 7‐José Cortés Parejo 45
Por ejemplo, para dibujar con relleno de color el polígono cuyo contorno habíamos previamente dibujado mediante la función plot, podríamos utilizar el siguiente programa:
P=[4 2 5 9 8 6 4 9 5 2 4 8 7 9];
plot(P(1,:),P(2,:),'b','linewidth',2) plot(P(1,:),P(2,:),'.b','markersize',20)
fill(P(1,:),P(2,:),'y')
4.2 Gráficos Vectoriales 3D
Se entiende por Gráfico Vectorial 3D la estructura de datos geométricos que define de forma abstracta un grupo de objetos tridimensionales, entendiéndose por esto: coordenadas 3D de puntos, ecuaciones de rectas o curvas 3D y ecuaciones de planos o de superficies regulares. Para visualizar estos objetos 3D debemos desde luego obtener una proyección que simule el proceso seguido por el ojo o por una cámara fotográfica para captarlos en 2 dimensiones.
Cualquier gráfico 3D se va a representar siempre sobre una ventana gráfica 2D, es decir, un Marco o Viewport, por lo que una de las primeras sentencias de un programa que manipule objetos 3D debe ser siempre una llamada a la función figure, bien directamente, bien mediante una función creada por nosotros del tipo de las vistas en la sección anterior: Marco o Marco500.
El segundo y muy importante aspecto a tener en cuenta es que, igual que se hizo en el caso 2D con la definición de una Ventana o Window del Sistema de Referencia Universal en el que se situaban las entidades geométricas en unidades abstractas (números en doble precisión), ahora debe definirse una “Ventana 3D” que establezca la zona del espacio tridimensional que va a “verse” en la ventana gráfica de pantalla o Marco. Esta Ventana 3D, aunque al principio no resulte claro, es un tronco de pirámide cuyo vértice está en el punto focal de la perspectiva (el Observador) y corresponde precisamente a la zona que se vería a través del objetivo de una cámara (ver Figura 6). El “espacio” comprendido entre el punto focal y el primer plano que se muestra en la Figura se supone que no es visible (corresponde al interior del ojo o de la cámara) y lo mismo sucede con respecto a un segundo plano que se sitúa más allá de todos los objetos 3D que van a visualizarse.
Cámara virtual
En general, una cámara virtual se define especificando los parámetros de esta pirámide (infinita) y el rectángulo del Plano cercano. La forma estándar de hacerlo consiste en establecer la posición 3D del punto focal P que, a todos los efectos, puede considerarse como el Observador y el rectángulo en el que se va a “plasmar” la vista en perspectiva (que está en el Plano Cercano o Hither en la Figura 6). Dado que las coordenadas precisas de los vértices de este rectángulo no son intuitivas, todas las
aplicaciones que operan con gráficos 3D recurren a fijar un Punto de Mira u Objetivo MP , que es
Figura 5
Figura 6
Introducción a MATLAB 7‐José Cortés Parejo 46
un punto imaginario del espacio 3D que se proyectaría por perspectiva en el centro de este
rectángulo (representado en la Figura 7 como 0P ). Nótese que el vector MP P determina lo que
se llama Dirección principal de Mira, que es el vector D de la Figura 7. Este vector fija el plano de proyección sin más que especificar su distancia al punto focal mediante un parámetro llamado distancia focal. Finalmente, una vez establecido el plano de proyección, el rectángulo concreto correspondiente al “fotograma” sobre el que se va a captar la vista perspectiva se considera que tiene sus lados inferior y superior paralelos al plano XY (plano del “suelo”) y está centrado respecto al punto 0P . Sus dimensiones
se dan a través del Angulo de apertura (Field of View o FOV), que es el ángulo (medido en un plano vertical) que abarcaría totalmente al rectángulo.
Funciones de definición de Cámaras
Para cada uno de los parámetros vistos en el apartado anterior que definen una cámara, MATLAB utiliza una función específica. Veamos las principales:
campos(P) Define la posición del Observador o Punto focal de la perspectiva. Tiene como argumento un vector P con las coordenadas cartesianas del mismo.
camtarget(PM) Define la posición del Punto de Mira o Target hacia donde apunta la dirección principal de la cámara. Su argumento es un vector PM con las coordenadas cartesianas de este Punto de Mira.
camva(fi) Establece el Angulo de Visión o FOV (Field of View) y se indica en grados.
camproj('tipo') Tipo de perspectiva. Por defecto MATLAB lo establece como 'orthographic', es decir, una proyección paralela.
Generalmente desearemos ver nuestro gráfico 3D en “perspectiva real” o cónica, para lo que se le pasa el argumento 'perspective'.
Existen otras funciones para manipulación de una Cámara, por ejemplo, para moverla o rotarla alrededor de la Dirección principal de Vista o para especificar la posción del Observador en coordenadas esféricas (lo cual es muy útil en determinadas aplicaciones). Puede consultarse información adicional con los comandos help view y doc view.
► Nótese que, al margen de definir una cámara, es necesario al menos proporcionar la propiedad DataAspectRatio de la función axes (o equivalentemente utilizar axis equal) y desactivar el dibujo de ejes, etiquetado, etc. con axis off. Por otra parte, si no se activa hold on, cada vez que se utilice una función de dibujo 3D (se verán a continuación) se borrará el último dibujo y se restablecerán algunas propiedades gráficas a sus valores por defecto.
Implementación de una Cámara
Igual que hicimos en el caso bidimensional, podemos generar un fichero .m en el que se agrupen todas las funciones que definen los parámetros de una Cámara. Por ejemplo, un fichero CamaraMatlab.m cuyo contenido sea:
Figura 7
Introducción a MATLAB 7‐José Cortés Parejo 47
A esta función se le pasaría un vector P con las coordenadas del Observador, otro vector PM con las del Punto de Mira y el Angulo de apertura FOV. También se han incluido las sentencias antes comentadas, axis equal y axis off.
Función de dibujo plot3
La función plot3 es similar a la ya vista para 2 dimensiones, pero ahora dibuja puntos 3D:
Plot3(x,y,z,color)
donde x,y,z son escalares o vectores en los que están almacenadas las 3 coordenadas de un punto. MATLAB utiliza la definición de cámara existente (si no la hemos definido nosotros, usará los parámetros establecidos por defecto) para poner en perspectiva los puntos y dibujarlos en perspectiva en la Ventana gráfica (Marco).
Funciones de relleno
Ambas son generalizaciones de sus homólogas 2D; pero es en el dibujo de objetos poliédricos, donde generalmente varias caras pueden compartir vértices, cuando patch es más potente.
Función patch
También admite los mismos 2 tipos de formato. Para polígonos simples se escribe:
patch('XData',x,'YData',y,'Zdata',z,'FaceColor','color')
donde en los vectores x,y,z se encuentran las coordenadas de los vértices del polígono a rellenar.
El segundo tipo de formato es mejor para objetos poliédricos:
patch('Vertices',V,'Faces',C,'FaceColor','color')
Por ejemplo, para el objeto poliédrico de la figura 8, la matriz de vértices es:
V=[0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 0]; y la matriz de conexión, que relaciona los vértices de cada cara: C=[1 2 3 4;1 4 8 5;5 6 7 8]
function CamaraMatlab(P,Pm,FOV)
campos(P); camtarget(PM); camva(FOV); camproj('perspective')
axis equal axis off hold on
Figura 8
Introducción a MATLAB 7‐José Cortés Parejo 48
Para realizar el dibujo de estos 3 polígonos:
patch('Vertices',V,'Faces',C,'FaceColor','y')
Función fill3
Es totalmente similar al caso bidimensional, solo que añadiendo una 3ª coordenada:
fill(x,y,z,'color')
Funciones para representación de Mallas
Una Malla (Mesh) es un objeto poliédrico que resulta de la discretización de una Superficie paramétrica como la de la Figura 9. Estas son superficies en las que cada coordenada viene dada por una función de 2 parámetros:
( , )( , )( , )
x f u vy g u vz h u v
Una vez generados los puntos de la Malla evaluando las ecuaciones en un conjunto discreto de valores de los parámetros podríamos dibujar cada polígono rectangular, que no tiene por qué ser plano, con la función patch o fill3, aunque esto sería tedioso y tendríamos que crear un programa que lo hiciera de forma más o menos automática. MATLAB dispone sin embargo de funciones específicas para representar esta mallas:
Función mesh
Tiene el siguiente formato básico:
mesh(X,Y,Z,'facecolor',ColorCara,'edgecolor',ColorLado)
donde en las matrices X,Y,Z se encuentran las coordenadas ( , , )x y z de los puntos de la
superficie,'facecolor' y 'edgecolor' son palabras clave y ColorCara,ColorLado son especificaciones de color respectivamente para el interior de las caras y las aristas. Por defecto, MATLAB realiza una eliminación de partes ocultas, es decir, no dibuja la parte de cada polígono que no debería ser visible para la cámara. En todo caso, si para alguna aplicación particular se desea ver la superficie como si fuera “de alambre” (wireframe), existe el comando hidden off, que anula la eliminación (hidden on restituiría la “opacidad” de las caras).
Función surface
Su formato es similar a mesh, pero permite añadir propiedades de sombreado e iluminación de forma que la superficie no aparezca faceteada (aunque si se desea puede aún mostrarse las caras, pero sombreadas según la iluminación) Para más detalles sobre la iluminación ver help surface o doc surface.
Figura 9
Figura 10
Introducción a MATLAB 7‐José Cortés Parejo 49
[1] Javier García de Jalón, José Ignacio Rodríguez y Jesús Vidal Aprenda Matlab 7.0 como si estuviera en primero Universidad Politécnica de Madrid. ETS Ingenieros Industriales (2005) http://mat21.etsii.upm.es/ayudainf/aprendainf/Matlab70/matlab70primero.pdf
[2] Holly Moore MATLAB para Ingenieros Pearson Educación, México (2007)
[3] Christos Xenophontos A Beginner’s Guide to MATLAB Department of Mathematical Sciences. Loyola College. University of Maryland (1998) http://math.loyola.edu/~loberbro/matlab/Beginners_guide_to_MATLAB.pdf
[4] Rosa Echevarría Líbano Breves apuntes de MATLAB. Una introducción rápida pero no trivial Departamento de Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla (2010) http://personal.us.es/echevarria/documentos/IntroduccionMATLAB.pdf
[5] MathWorks ‐ Documentation Center Language Fundamentals http://www.mathworks.es/es/help/matlab/
Referencias