introducción a matlab 7 - personal.us.espersonal.us.es/jcortes/material/material_archivos/material...

52
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

Upload: others

Post on 14-Sep-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

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

 

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 =

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