Vous êtes sur la page 1sur 62

1

Curso introductorio: El programa MATLAB versin 7


Contenido

Curso
intrductorio
de MATLAB.

Introduccin ...................................................................................................................................................................... 3
1

EL PROGRAMA MATLAB: PRIMEROS PASOS ............................................................................................................. 3

1.2

Notas de clase en
preparacin
Cmo empiezo a usar MATLAB? ...................................................................................................................
4

1.3

Cmo obtengo ayuda para usar MATLAB? ..................................................................................................... 5

1.4

Cmo es el entorno de trabajo de MATLAB? .................................................................................................. 5

1.1

3.

Qu es MATLAB? ............................................................................................................................................. 3

Flavia E. Buffo
2012.

1.4.1

La ventana con el historial ........................................................................................................................ 7

1.4.2

El directorio actual. ................................................................................................................................... 8

1.4.3

El workspace browser y array editor ........................................................................................................ 9

1.4.4

El editor/debugger .................................................................................................................................... 9

1.5

Formatos de salida y de otras opciones de MATLAB ...................................................................................... 10

1.6

Guardar variables y estados de una sesin: Comandos save y load............................................................... 11

1.7

Guardar sesin y copiar salidas: Comando diary ............................................................................................ 11

1.8

Lneas de comentarios .................................................................................................................................... 12

1.9

Medida de tiempos y de esfuerzo de clculo ................................................................................................. 12

VARIABLES: MATRICES y VECTORES ........................................................................................................................ 14


2.1

Nmeros reales de doble precisin ................................................................................................................ 14

2.2

Nmeros complejos: funcin complex............................................................................................................ 15

2.3

Matrices y vectores ......................................................................................................................................... 16

2.1

Cadenas de caracteres .................................................................................................................................... 20

OPERADORES Y FUNCIONES EN MATLAB ............................................................................................................... 23


3.1

Operadores aritmticos .................................................................................................................................. 23

3.2

Funciones matemticas elementales.............................................................................................................. 24

3.3

Operadores elemento a elemento.................................................................................................................. 25

3.4 Operadores para la resolucin de sistemas de ecuaciones lineales .................................................................... 26

3.5 Operadores relacionales ...................................................................................................................................... 27


3.6 Operadores lgicos .............................................................................................................................................. 28
3.7 Funciones que actan sobre vectores.................................................................................................................. 28
3.8 Funciones que actan sobre matrices .................................................................................................................. 29
4.

5.

PROGRAMACIN DE MATLAB................................................................................................................................. 31
4.1

Bucles y Bifurcaciones ..................................................................................................................................... 31

4.2

Lectura y escritura interactiva de variables ................................................................................................... 34

4.3

Archivos *.m.................................................................................................................................................... 35

4.4

Help para las funciones de usuario ................................................................................................................. 37

4.5

Referencias de funcin (function handles) ..................................................................................................... 38

4.6

Funciones inline .............................................................................................................................................. 39

4.7

Funciones annimas ....................................................................................................................................... 40

4.8

Recomendaciones generales de programacin .............................................................................................. 40

GRFICOS BIDIMENSIONALES ................................................................................................................................. 42


5.1

Representacin grfica de funciones definidas por una frmula ................................................................... 42

5.2

Funciones grficas 2D elementales ................................................................................................................. 43

5.3

Control de ventanas grficas........................................................................................................................... 48

5.3 Otras funciones grficas 2-D ................................................................................................................................ 48


5.4

Entrada de puntos con el ratn ...................................................................................................................... 51

5.5

Preparacin de pelculas o "movies" .............................................................................................................. 51

5.6

Las ventanas grficas de MATLAB ................................................................................................................... 52

6 GRFICOS TRIDIMENSIONALES ................................................................................................................................... 53


6.1. Dibujo simplificado de funciones 3-D ................................................................................................................. 53

6.2

Otras forma de construir grficas tridimensionales ...................................................................................... 54

6.3

Utilizacin del color en grficos 3-D ............................................................................................................... 56

6.4

Otras funciones grficas 3D ............................................................................................................................ 57

6.5

Elementos generales: ejes, puntos de vista, lneas ocultas. ........................................................................... 58

FUNCIONES DE FUNCIN ........................................................................................................................................ 59

7.1

Races de ecuaciones escalares no lineales .................................................................................................... 59

7.2

Clculo de extremos locales y globales ........................................................................................................... 59

7.3

Clculo de integrales definidas ....................................................................................................................... 60

7.4

Resolucin numrica de ecuaciones diferenciales ordinarias ........................................................................ 61

Introduccin
Este apunte pretende iniciar al lector en la utilizacin del programa MATLAB. Est
organizado de la siguiente manera, en la primera seccin se mencionan brevemente las
facilidades de MATLAB como herramienta de clculo, se presenta el entorno de MATLAB y
los primeros pasos para acceder al programa y su a entorno. Se definen algunos conceptos
bsicos como comandos, variables, constantes, operadores y funciones de MATLAB y la
sintaxis para utilizarlos. En La seccin 2 estudia lo referente al ingreso de matrices y
vectores. En la tercer seccin se presentan los operadores y las funciones de la librera
MATLAB que se utilizan para realizar operaciones entre escalares, vectores y matrices. En
la seccin 4 se menciona cmo programar con MATLAB, cmo crear archivos m (funciones
y procedimientos de comandos) y las referencias de funcin. En las secciones 5 y 6 se
describe cmo obtener grficos en 2D y 3D. Para finalizar con el manejo de funciones de
funciones para resolver diferentes problemas: resolucin de ecuaciones no lineales,
optimizacin, integracin numrica y resolucin numrica de ecuaciones diferenciales.

1 EL PROGRAMA MATLAB: PRIMEROS PASOS


1.1 Qu es MATLAB?
MATLAB es el nombre abreviado de MATrix LABoratory. MATLAB es un programa para
realizar clculos numricos con vectores y matrices. Como caso particular puede tambin
trabajar con nmeros escalares tanto reales como complejos, con cadenas de caracteres
y con otras estructuras de informacin ms complejas. Una de las capacidades ms
atractivas es la de realizar una amplia variedad de grficos en dos y tres dimensiones.
MATLAB tiene tambin un lenguaje de programacin propio.
MATLAB es un gran programa de clculo tcnico y cientfico. Para ciertas operaciones es
muy rpido, cuando puede ejecutar sus funciones en cdigo nativo con los tamaos ms
adecuados para aprovechar sus capacidades de vectorizacin. En otras aplicaciones resulta
bastante ms lento que el cdigo equivalente desarrollado en C/C++ o Fortran. El lenguaje
de programacin de MATLAB siempre es una magnfica herramienta de alto nivel para
desarrollar aplicaciones tcnicas, fcil de utilizar y que, como ya se ha dicho, aumenta
significativamente la productividad de los programadores respecto a otros entornos de
desarrollo. MATLAB dispone de un cdigo bsico y de varias libreras especializadas
(toolboxes). En este curso slo se har referencia al cdigo bsico. Uno de los puntos
fuertes de MATLAB son los grficos.

1.2 Cmo empiezo a usar MATLAB?


MATLAB se inicia como cualquier otra aplicacin de Windows, clicando dos veces en el
icono correspondiente en el escritorio o por medio del men Inicio. Al iniciar MATLAB se
abre una ventana, el aspecto de esta ventana puede cambiarse eligiendo la opcin
Layout/Default en el men Desktop de la toolbar. La parte ms importante de la ventana
inicial es Command Window, que aparece en la parte derecha. En esta sub-ventana es
donde se ejecutan los comandos de MATLAB, a continuacin del prompt caracterstico
(>>), que indica que el programa est preparado para recibir instrucciones.
En la parte superior izquierda de la pantalla aparecen dos ventanas tambin muy tiles: en
la parte superior aparece la ventana Current Directory, que se puede alternar con
Workspace clicando en la pestaa correspondiente. La ventana Current Directory muestra
los archivos del directorio activo o actual. El directorio activo se puede cambiar desde
Command Window, o desde la propia ventana (o desde la barra de herramientas, debajo
de la barra de mens) con los mtodos de navegacin de directorios propios de Windows.
Clicando dos veces sobre alguno de los archivos *.m del directorio activo se abre el editor
de archivos de MATLAB, herramienta fundamental para la programacin sobre la que se
volver en las prximas pginas. El Workspace contiene informacin sobre todas las
variables que se hayan definido en esta sesin y permite ver y modificar las matrices con las
que se est trabajando.
En la parte central izquierda aparece la ventana Command History que muestra los ltimos
comandos ejecutados en la Command Window. Estos comandos se pueden volver a
ejecutar haciendo doble clic sobre ellos. Clicando sobre un comando con el botn derecho
del ratn se muestra un men contextual con las posibilidades disponibles en ese
momento. Para editar uno de estos comandos hay que copiarlo antes a la Command
Window.
En la parte inferior izquierda de la pantalla aparece el botn Start, con una funcin anloga
a la del botn Inicio de Windows. Start da acceso inmediato a ciertas capacidades del
programa. El men Desktop realiza un papel anlogo al botn Start, dando acceso a los
mdulos o componentes de MATLAB que se tengan instalados.
Es posible recuperar comandos anteriores de MATLAB y moverse por dichos comandos con
el ratn y con las teclas-flechas y . Al pulsar la primera de dichas flechas aparecer el
comando que se haba introducido inmediatamente antes. De modo anlogo es posible
moverse sobre la lnea de comandos con las teclas y , ir al principio de la lnea con la
tecla Inicio, al final de la lnea con Fin, y borrar toda la lnea con Esc. Recurdese que slo
hay una lnea activa (la ltima). Para borrar todas las salidas anteriores de MATLAB y dejar
limpia la Command Window se pueden utilizar las funciones clc y home. La funcin clc
(clear console) elimina todas las salidas anteriores, mientras que home las mantiene, pero
lleva el prompt (>>) a la primera lnea de la ventana. Si se desea salir de MATLAB basta
teclear los comandos quit o exit, elegir Exit MATLAB en el men File o utilizar cualquiera de
los medios de terminar una aplicacin en Windows.

1.3 Cmo obtengo ayuda para usar MATLAB?


MATLAB 7.0 dispone de un excelente Help con el que se puede encontrar la informacin
que se desee. Hay distintas opciones en el men Help de la ventana principal de la
aplicacin. De forma muy inmediata, es posible recurrir al Help desde la lnea de comandos
de la Command Window, como se indica a continuacin.
>> help

Las sentencias que se detallan a continuacin son algunas de las que sern tiles a lo largo
del curso:
>> help general

Para obtener ayuda de los comandos generales de MATLAB.


>> help ops

Para obtener ayuda de los operadores y caracteres especiales.


>> help lang

Para obtener ayuda de construcciones del lenguaje de programacin.


>> help elmat

Para obtener ayuda de la manipulacin de matrices elementales.


>> help elfun

Para obtener ayuda de las funciones matemticas elementales.

>> help specfun

Para obtener ayuda de las funciones matemticas especiales.


>> help matfun

Para obtener ayuda de funciones de matrices y lgebra lineal numrica.


>> help polyfun

Para obtener ayuda de interpolacin y polinomios.


>> help graph2d

Para obtener ayuda de grficos en dos dimensiones.

>> help graph3d

Para obtener ayuda de grficos en tres dimensiones.

>> help specgraph

Para obtener ayuda de grfico especiales.


1.4 Cmo es el entorno de trabajo de MATLAB?
El entorno de trabajo de MATLAB es muy grfico e intuitivo, similar al de otras aplicaciones
profesionales de Windows. Las componentes ms importantes del entorno de trabajo de
MATLAB 7.0 se vern con ms detalle.
La ventana Command Window es la ventana en la que se escriben las constantes y las
variables, se ejecutan interactivamente las instrucciones de MATLAB que llamaremos
comandos y se muestran los resultados correspondientes. En cierta forma es la ventana
ms importante y la nica que exista en las primeras versiones de MATLAB.
Una variable es un nombre que se da a una entidad numrica o no, que puede ser una
matriz, un vector, un escalar, una cadena de caracteres e incluso una expresin. El valor de
esa variable, e incluso el tipo de entidad que representa, puede cambiar a lo largo de una
sesin de MATLAB o a lo largo de la ejecucin de un programa. La forma ms normal de

cambiar el valor de una variable es colocndola a la izquierda del operador de asignacin


(=). MATLAB distingue entre maysculas y minsculas en los nombres de variables.
Los nombres de variables deben empezar siempre por una letra y pueden constar de hasta
63 letras y nmeros. La funcin namelengthmax permite preguntar al programa por este
nmero mximo de caracteres. El carcter guin bajo (_) se considera como una letra.
A diferencia de los lenguajes de programacin no hace falta declarar las variables que se
vayan a utilizar. Esto hace que se deba tener especial cuidado con no utilizar nombres
errneos en las variables, porque no se recibir ningn aviso del ordenador.
El comando clear sirve para eliminar variables y tiene varias formas posibles:
clear
clear A b
clear global
clear functions
clear all

elimina todas las variables creadas previamente (excepto


las variables globales).
borra las variables indicadas con A y b.
borra las variables globales.
borra las funciones M y las funciones Mex.
borra todas las variables, incluyendo las globales, y las funciones.

Una expresin de MATLAB puede tener las dos formas siguientes: primero, asignando su
resultado a una variable,
>> variable = expresin
y segundo evaluando simplemente el resultado del siguiente modo,
>> expresin
en cuyo caso el resultado se asigna automticamente a una variable interna de MATLAB
llamada ans (de answer) que almacena el ltimo resultado obtenido. Se considera por
defecto que una expresin termina cuando se pulsa intro. Si se desea que una expresin
contine en la lnea siguiente, hay que introducir tres puntos (...) antes de pulsar intro.
Tambin se pueden incluir varias expresiones en una misma lnea separndolas por comas
(,) o puntos y comas (;). Si una expresin termina en punto y coma (;) su resultado se
calcula, pero no se escribe en pantalla. Esta posibilidad es muy interesante, tanto para
evitar la escritura de resultados intermedios, como para evitar la impresin de grandes
cantidades de nmeros cuando se trabaja con matrices de gran tamao.
MATLAB tiene un gran nmero de funciones incorporadas. Algunas son funciones
intrnsecas, esto es, funciones incorporadas en el propio cdigo ejecutable del programa.
Estas funciones son particularmente rpidas y eficientes. Existen adems funciones
definidas en archivos *.m y *.mex12 que vienen con el propio programa o que han sido
aportadas por usuarios del mismo. Estas funciones extienden en gran manera las
posibilidades del programa. El concepto de funcin en MATLAB es semejante al de otros
lenguajes de programacin, aunque con algunas diferencias importantes. Una funcin tiene
nombre, valor de retorno y argumentos. Una funcin se llama utilizando su nombre en una
expresin o utilizndolo como un comando ms. Las funciones se pueden definir en
archivos de texto *.m en la forma que se ver ms adelante. Los argumentos de cada

funcin van a continuacin del nombre entre parntesis (y separados por comas si hay ms
de uno). Los valores de retorno son el resultado de la funcin y sustituyen a sta en la
expresin donde la funcin aparece.
Una caracterstica de MATLAB es que las funciones que no tienen argumentos no llevan
parntesis, por lo que a simple vista no siempre son fciles de distinguir de las simples
variables. Por ejemplo eps es una funcin sin argumentos, que devuelve la diferencia entre
1.0 y el nmero de coma flotante inmediatamente superior. En lo sucesivo el nombre de la
funcin ir seguido de parntesis si interesa resaltar que la funcin espera que se le pase
uno o ms argumentos. MATLAB permite que una funcin tenga un nmero variable de
argumentos y valores de retorno, determinado slo en tiempo de ejecucin.
MATLAB tiene diversos tipos de funciones. A continuacin se enumeran los tipos de
funciones ms importantes, clasificadas segn su finalidad:
1.- Funciones matemticas elementales.
2.- Funciones matemticas especiales.
3.- Funciones matriciales elementales.
4.- Funciones matriciales especficas.
5.- Funciones para la descomposicin y/o factorizacin de matrices.
6.- Funciones para anlisis estadstico de datos.
7.- Funciones para anlisis de polinomios.
8.- Funciones para integracin de ecuaciones diferenciales ordinarias.
9.- Funciones para la resolucin de ecuaciones no-lineales y optimizacin.
10.- Funciones para la integracin numrica.
11.- Funciones para el procesamiento de seal.
Algunas cosas tiles para conocer:
Comenzando a teclear el nombre de una funcin y pulsando la tecla Tab, MATLAB
completa automticamente el nombre de la funcin, o bien muestra en una ventana
las funciones disponibles que comienzan con las letras tecleadas por el usuario.
Cuando al ejecutar un archivo *.m se produce un error y se obtiene el
correspondiente mensaje en la Command Window, MATLAB muestra mediante un
subrayado un enlace a la lnea del archivo fuente en la que se ha producido el error.
Clicando en ese enlace se va a la lnea correspondiente del archivo por medio del
Editor/Debugger.
1.4.1 La ventana con el historial

La ventana Command History ofrece acceso a las sentencias que se han ejecutado
anteriormente en la Command Window. Estas sentencias estn tambin accesibles por
medio de las teclas y , pero esta ventana facilita mucho el tener una visin ms general
de lo hecho anteriormente y seleccionar lo que realmente se desea repetir.

1.4.2 El directorio actual.

El concepto de directorio activo o directorio actual es muy importante en MATLAB. Los


programas de MATLAB se encuentran en archivos con la extensin *.m. Estos archivos se
ejecutan escribiendo su nombre en la lnea de comandos (sin la extensin), seguido de los
argumentos entre parntesis, si se trata de funciones. No todos los archivos *.m que se
encuentren en el disco duro o en otras unidades lgicas montadas en una red local son
accesibles. Para que un archivo *.m se pueda ejecutar es necesario que se cumpla una de
las dos condiciones siguientes:
Que est en el directorio actual. MATLAB mantiene en todo momento un nico
directorio con esta condicin. Este directorio es el primer sitio en el que MATLAB
busca cuando, desde la lnea de comandos, se le pide que ejecute un archivo. El
comando dir muestra los archivos que contiene este directorio.
Que est en uno de los directorios indicados en el Path de MATLAB, al que se accede
eligiendo la opcin set path en el men file de la toolbar. El Path es una lista
ordenada de directorios en los que el programa busca los archivos o las funciones
que ha de ejecutar. Muchos de los directorios del Path son propios de MATLAB, pero
los usuarios tambin pueden aadir sus propios directorios, normalmente al principio
o al final de la lista.
El comando pwd (de print working directory) permite saber cul es el directorio actual.
Para cambiar de directorio actual se puede utilizar el comando cd (de change directory) en
la lnea de comandos, seguido del nombre del directorio, por ejemplo
>>cd( C:\MATLAB\Ejemplos)
Para subir un nivel en la jerarqua de directorios se utiliza el comando cd .., y cd ../.. para
subir dos niveles. La ventana Current Directory permite explorar los directorios del
ordenador en forma anloga a al Explorador u otras aplicaciones de Windows. Cuando se
llega al directorio deseado se muestran las carpetas y los archivos all contenidos. La
ventana Current Directory permite ordenarlos por fecha, tamao, nombre, etc. El directorio
actual cambia automticamente en funcin del directorio seleccionado con este
explorador, y tambin se puede cambiar desde la propia barra de herramientas del
MATLAB Desktop. Los archivos *.m mostrados en la ventana Current Directory se pueden
abrir con el Editor/Debugger mediante un doble clic.
A partir del men contextual que se abre clicando con el botn derecho en cualquier parte
de la ventana Current Directory se tiene la posibilidad de aadir ese directorio al Path de
MATLAB.

1.4.3 El workspace browser y array editor

El espacio de trabajo de MATLAB (Workspace) es el conjunto de variables y de funciones de


usuario que en un determinado momento estn definidas en la memoria del programa o de
la funcin que se est ejecutando.
Para obtener informacin sobre el Workspace desde la lnea de comandos se pueden
utilizar los comandos who y whos. El segundo proporciona una informacin ms detallada
que el primero.
La ventana Workspace constituye un entorno grfico para ver las variables definidas en el
espacio de trabajo. Se activa con el comando Desktop/Workspace.
Es importante insistir en que cada una de las funciones de MATLAB tiene su propio espacio
de trabajo, al que en principio slo pertenecen las variables recibidas como argumentos o
definidas dentro de la propia funcin. En la barra de herramientas de la ventana Workspace
aparece una lista desplegable llamada Stack, con los espacios de trabajo del programa
actual. Hay que tener en cuenta que cuando se termina de ejecutar una funcin y se
devuelve el control al programa que la haba llamado, las variables definidas en la funcin
dejan de existir (salvo que se hayan declarado como persistent) y tambin deja de existir su
espacio de trabajo. Si se desean examinar otras matrices y/o vectores, al hacer doble clic
sobre ellas el Array Editor muestra en la misma ventana como subventanas con una
pestaa diferente. Clicando con el botn derecho sobre alguna de las variables del
Workspace Browser se abre un men contextual que ofrece algunas posibilidades
interesantes, como por ejemplo la de representar grficamente dicha variable. El Array
Editor no slo permite ver los valores de los elementos de cualquier matriz o vector
definido en el programa: es tambin posible modificar estos valores clicando sobre la celda
correspondiente. La ventana del Array Editor incluye una lista desplegable en la que se
puede elegir el formato en el que se desea ver los datos. El Array Editor es muy til
tambin para entender bien ciertos algoritmos, ejecutando paso a paso un programa y
viendo cmo cambian los valores de las distintas variables.
1.4.4 El editor/debugger

En MATLAB tienen particular importancia los ya citados archivos-M (o M-files). Son


archivos de texto ASCII, con la extensin *.m, que contienen conjuntos de comandos o
definicin de funciones (estos ltimos son un poco ms complicados y se vern ms
adelante). La importancia de estos archivos-M es que al teclear su nombre en la lnea de
comandos y pulsar Intro, se ejecutan uno tras otro todos los comandos contenidos en dicho
archivo. El poder guardar instrucciones y grandes matrices en un archivo permite ahorrar
mucho trabajo de tecleado.
Aunque los archivos *.m se pueden crear con cualquier editor de archivos ASCII,
MATLAB dispone de un editor que permite tanto crear y modificar estos archivos, como
ejecutarlos paso a paso para ver si contienen errores (proceso de Debug o depuracin).
El Editor muestra con diferentes colores los diferentes tipos o elementos constitutivos de
los comandos (en verde los comentarios, en violeta las cadenas de caracteres, etc.). El

10

Editor se preocupa tambin de que las comillas o parntesis que se abren, no se queden sin
el correspondiente elemento de cierre. Colocando el cursor antes o despus de una
apertura o cierre de corchete o parntesis y pulsando las teclas () o (), el Editor
muestra con qu cierre o apertura de corchete o parntesis se empareja el elemento
considerado; si no se empareja con ninguno, aparece con una rayita de tachado.
Seleccionando varias lneas y clicando con el botn derecho aparece un men contextual
cuya sentencia Comment permite entre otras cosas comentar con el carcter % todas las
lneas seleccionadas. Estos comentarios pueden volver a su condicin de cdigo ejecutable
seleccionndolos y ejecutando Uncomment en el men contextual. Otra opcin muy til de
ese men contextual es Smart Indent, que organiza la sangra de los bucles y bifurcaciones
de las sentencias seleccionadas.
Para realizar la ejecucin de un archivo de comandos controlada con el Debugger dicha
ejecucin se comienza eligiendo el comando Run en el men Debug, pulsando la tecla F5,
clicando en el botn Continue ( ) de la barra de herramientas del Editor o tecleando el
nombre del archivo en la lnea de comandos de la Command Window
El Debugger es un programa que hay que conocer muy bien, pues es muy til para detectar
y corregir errores. Es tambin enormemente til para aprender mtodos numricos y
tcnicas de programacin. Para aprender a manejar el Debugger lo mejor es practicar. Su
uso correcto no es parte de los contenidos de un curso introductorio de MATLAB.
1.5 Formatos de salida y de otras opciones de MATLAB
MATLAB 7.0 dispone de un cuadro de dilogo desde el que se establecen casi todas las
opciones que el usuario puede determinar por su cuenta. Este cuadro de dilogo se abre
con el comando Preferences del men File. El cuadro de dilogo Command/Window/Fonts
ofrece la posibilidad de elegir el tipo de letra as como el tamao y el color, tanto de las
letras como del fondo con la que se escribe en la ventana de comandos de MATLAB. Es
muy importante utilizar tipos de letra de tamao constante (por ejemplo, Courier New,
Lucida Console o Monospaced), para que las filas de las matrices se alineen bien en la
pantalla. Respecto a los formatos numricos con que MATLAB muestra los resultados
(recurdese que siempre calcula con doble precisin, es decir con unas 16 cifras decimales
equivalentes), las posibilidades de mostrar los resultados son las siguientes:
short coma fija con 4 decimales (defecto)
long coma fija con 15 decimales
hex cifras hexadecimales
bank nmeros con dos cifras decimales
short e notacin cientfica con 4 decimales,
short g notacin cientfica o decimal, dependiendo del valor
long e notacin cientfica con 15 decimales
long g notacin cientfica o decimal, dependiendo del valor
rational expresa los nmeros racionales como cocientes de enteros

11

Estos formatos se pueden cambiar tambin desde la lnea de comandos anteponiendo la


palabra format. Por ejemplo,
>> format long
Por otra parte, el formato loose introduce algunas lneas en blanco en la salida (opcin por
defecto), mientras que el formato compact elimina las lneas en blanco citadas. Estas
opciones estn se pueden tambin establecer desde la lnea de comandos en la forma:
>> format compact
MATLAB aplica un factor de escala general a las matrices cuando los elementos no enteros
ms grandes o ms pequeos son superiores o inferiores a una determinada cantidad (103
y 103, respectivamente). Hay que aadir que MATLAB trata de mantener el formato de los
nmeros que han sido definidos como enteros (sin punto decimal). Si se elige la opcin
format rational el programa trata de expresar los nmeros racionales como cocientes de
enteros.
1.6 Guardar variables y estados de una sesin: Comandos save y load
En muchas ocasiones puede resultar interesante interrumpir el trabajo con MATLAB y
poderlo recuperar ms tarde en el mismo punto en el que se dej (con las mismas variables
definidas, con los mismos resultados intermedios, etc.). Hay que tener en cuenta que al
salir del programa todo el contenido de la memoria se borra automticamente.
Para guardar el estado de una sesin de trabajo existe el comando save. Si se teclea:
>> save
antes de abandonar el programa, se crea en el directorio actual un archivo binario llamado
MATLAB.mat (o MATLAB) con el estado de la sesin (excepto los grficos, que por ocupar
mucha memoria hay que guardar aparte). Dicho estado puede recuperarse la siguiente vez
que se arranque el programacon el comando:
>> load
Esta es la forma ms bsica de los comandos save y load. Se pueden guardar tambin
matrices y vectores de forma selectiva y en archivos con nombre especificado por el
usuario. Por ejemplo, el comando (sin comas entre los nombres de variables):
>> save filename A x y
guarda las variables A, x e y en un archivo binario llamado filename.mat (o filename). Para
recuperarlas en otra sesin basta teclear:
>> load filename
Si no se indica ninguna variable, se guardan todas las variables creadas en esa sesin.
Con la opcin -append en el comando save la informacin se guarda a continuacin de lo
que hubiera en el archivo.
1.7 Guardar sesin y copiar salidas: Comando diary
Los comandos save y load crean archivos binarios o ASCII con el estado de la sesin. Existe
otra forma ms sencilla de almacenar en un archivo un texto que describa lo que el
programa va haciendo (la entrada y salida de los comandos utilizados). Esto se hace con el
comando diary en la forma siguiente:

12

>> diary filename.txt


...
>> diary off
...

>> diary on
...
El comando diary off suspende la ejecucin de diary y diary on la reanuda. El simple
comando diary pasa de on a off y viceversa. Para poder acceder al archivo filename.txt con
Notepad o Word es necesario que diary est en off. Si en el comando diary no se incluye el
nombre del archivo se utiliza por defecto un archivo llamado diary (sin extensin).
1.8 Lneas de comentarios
Ya se ha indicado que para MATLAB el carcter tanto por ciento (%) indica comienzo de
comentario. Cuando aparece en una lnea de comandos, el programa supone que todo lo
que va desde ese carcter hasta el fin de la lnea es un comentario.
Ms adelante se ver que los comentarios de los archivos *.m tienen algunas
peculiaridades importantes, pues pueden servir para definir help's personalizados de las
funciones que el usuario vaya creando.
MATLAB permite comentar bloques de sentencias, es decir, muchas sentencias contiguas
de una vez. Una forma de hacerlo es seleccionar las sentencias que se desea comentar,
clicar con el botn derecho, y elegir la opcin Comment en el men que se abre; las
sentencias seleccionadas se comentan individualmente con el carcter %. De forma similar
se pueden eliminar los comentarios. Otra forma de comentar bloques de sentencias es
encerrar las lneas que se desea inutilizar entre los caracteres %{ y %}. Los bloques
comentados pueden incluirse dentro de otros bloques comentados ms amplios (bloques
anidados).
1.9 Medida de tiempos y de esfuerzo de clculo
MATLAB dispone de funciones que permiten calcular el tiempo empleado en las
operaciones matemticas realizadas. Algunas de estas funciones son las siguientes:
cputime devuelve el tiempo de CPU (con precisin de centsimas de segundo) desde
que el programa arranc. Llamando antes y despus de realizar una operacin y
restando los valores devueltos, se puede saber el tiempo de CPU empleado en esa
operacin. Este tiempo sigue corriendo aunque MATLAB est inactivo.
etime(t2, t1) tiempo transcurrido entre los vectores t1 y t2 (atencin al orden!),
obtenidos como respuesta al comando clock.
tic ops toc imprime el tiempo en segundos requerido por ops. El comando tic pone el
reloj a cero y toc obtiene el tiempo transcurrido.
A modo de ejemplo, el siguiente cdigo mide de varias formas el tiempo necesario para
resolver un sistema de 1000 ecuaciones con 1000 incgnitas. Tngase en cuenta que los

13

tiempos pequeos (del orden de las dcimas o centsimas de segundo), no se pueden


medir con gran precisin.
>> n=1000; A=rand(n); b=rand(n,1); x=zeros(n,1);
>> tiempoIni=clock; x=A\b; tiempo=etime(clock, tiempoIni)
>> time=cputime; x=A\b; time=cputime-time
>> tic; x=A\b; toc
Cuando de colocan varias sentencias en la misma lnea se ejecutan todas sin tiempos
muertos al pulsar intro. Esto es especialmente importante en la lnea de comandos en la
que se quiere medir los tiempos. Todas las sentencias de clculos matriciales van seguidas
de punto y coma (;) con el objeto de evitar la impresin de resultados. Conviene ejecutar
dos o tres veces cada sentencia para obtener tiempos ptimos, ya que la primera vez que
se ejecutan se emplea un cierto tiempo en cargar las funciones a memoria.

14

2 VARIABLES: MATRICES y VECTORES


MATLAB es un programa preparado para trabajar con vectores y matrices. Como caso
particular tambin trabaja con variables escalares (matrices de dimensin 1). MATLAB
trabaja siempre en doble precisin, es decir guardando cada dato en 8 bytes, con unas 15
cifras decimales exactas, tambin puede trabajar con cadenas de caracteres (strings) y,
desde la versin 5.0, tambin con otros tipos de datos: Matrices de ms dos dimensiones,
matrices dispersas, vectores y matrices de celdas, estructuras y clases y objetos.
2.1 Nmeros reales de doble precisin
Los elementos constitutivos de vectores y matrices son nmeros reales almacenados en 8
bytes (53 bits para la mantisa y 11 para el exponente de 2; entre 15 y 16 cifras decimales
equivalentes). Es importante saber cmo trabaja MATLAB con estos nmeros y los casos
especiales que presentan. MATLAB mantiene una forma especial para los nmeros muy
grandes (ms grandes que los que es capaz de representar), que son considerados como
infinito. Por ejemplo, obsrvese cmo responde el programa al ejecutar el siguiente
comando:
>> 1.0/0.0
Warning: Divide by zero
ans =
Inf
As pues, para MATLAB el infinito se representa como inf Inf.
MATLAB tiene tambin una representacin especial para los resultados que no estn
definidos como nmeros. Por ejemplo, ejectense los siguientes comandos y obsrvense
las respuestas obtenidas:
>> 0/0
Warning: Divide by zero
ans =
NaN
>> inf/inf
ans =
NaN
En ambos casos la respuesta es NaN, que es la abreviatura de Not a Number. Este tipo de
respuesta, as como la de Inf, son enormemente importantes en MATLAB, pues permiten
controlar la fiabilidad de los resultados de los clculos matriciales. Los NaN se propagan al
realizar con ellos cualquier operacin aritmtica, en el sentido de que, por ejemplo,
cualquier nmero sumado a un NaN da otro NaN. MATLAB tiene esto en cuenta. Algo
parecido sucede con los Inf.
A continuacin se detallan, adems de los mencionados antes, algunos otros nombres, que
estn pre-definidos por MATLAB:

15

NaN
Inf
ans
i,j
Pi

resultados que no estn definidos como nmeros


nmeros muy grandes
variable del sistema para almacenar el resultado de
evaluar expresiones
unidad imaginaria : raiz cuadrada de -1
nmero

MATLAB dispone de tres funciones tiles relacionadas con las operaciones de coma
flotante. Estas funciones, que no tienen argumentos, son las siguientes:
eps devuelve la diferencia entre 1.0 y el nmero de coma flotante inmediatamente
superior. Da una idea de la precisin o nmero de cifras almacenadas. En un PC, eps
vale2.2204e-016.
realmin devuelve el nmero ms pequeo con que se puede trabajar (2.2251e-308)
realmax devuelve el nmero ms grande con que se puede trabajar (1.7977e+308).
2.2 Nmeros complejos: funcin complex
En muchos clculos los resultados no son reales sino complejos, con parte real y parte
imaginaria. MATLAB trabaja sin ninguna dificultad con nmeros complejos. Para ver como
se representan por defecto los nmeros complejos, ejectense los siguientes comandos:
>> a=sqrt(-4)
a=
0 + 2.0000i
>> 3 + 4j
ans =
3.0000 + 4.0000i
En la entrada de datos de MATLAB se pueden utilizar indistintamente la i y la j para
representar el nmero imaginario unidad (en la salida, sin embargo, puede verse que
siempre aparece la i). Si la i o la j no estn definidas como variables, puede intercalarse el
signo (*). Esto no es posible en el caso de que s estn definidas, porque entonces se utiliza
el valor de la variable. En general, cuando se est trabajando con nmeros complejos,
conviene no utilizar la i como variable ordinaria, pues puede dar lugar a errores y
confusiones. Por ejemplo, obsrvense los siguientes resultados:
>> i=2
i=
2
>> 2+3i
ans =
2.0000 + 3.0000i
>> 2+3*i
ans =
8

16

>> 2+3*j
ans =
2.0000 + 3.0000i
Cuando i y j son variables utilizadas para otras finalidades, como unidad imaginaria puede
utilizarse tambin la funcin sqrt(-1), o una variable a la que se haya asignado el resultado
de esta funcin.
MATLAB dispone asimismo de la funcin complex, que crea un nmero complejo a partir de
dos argumentos que representan la parte real e imaginaria, como en el ejemplo siguiente:
>> complex(1,2)
ans =
1.0 .0000i
2.3 Matrices y vectores
Como en casi todos los lenguajes de programacin, en MATLAB las matrices y vectores son
variables que tienen nombres. Se sugiere que se utilicen letras maysculas para matrices y
letras minsculas para vectores y escalares (MATLAB no exige esto, pero puede resultar
til).
Para definir una matriz no hace falta declararlas o establecer de antemano su tamao.
MATLAB determina automticamente el nmero de filas y de columnas en funcin del
nmero de elementos que se proporcionan (o se utilizan).
Hay diferentes maneras de introducir matrices, una de ellas es utilizando el teclado. Las
matrices se introducen por filas, los elementos de una misma fila estn separados por
blancos o comas, mientras que las filas estn separadas por pulsaciones enter o por
caracteres punto y coma(;). Por ejemplo, el siguiente comando define una matriz A de
dimensin (33):
>> A=[1 2 3; 4 5 6; 7 8 9]
A partir de este momento la matriz A est disponible para hacer cualquier tipo de
operacin con ella (adems de valores numricos, en la definicin de una matriz o vector se
pueden utilizar expresiones y funciones matemticas).
Como casos especiales de matrices, se definen los vectores, un vector fila x en la forma
siguiente (si los tres nmeros estn separados por blancos o comas, el resultado ser un
vector fila):
>> x=[10 20 30] % vector fila
Por el contrario, si los nmeros estn separados por intros o puntos y coma (;) se obtendr
un vector columna:
>> y=[11; 12; 13] % vector columna.

17

MATLAB tiene en cuenta la diferencia entre vectores fila y vectores columna. En MATLAB
se accede a los elementos de vector poniendo el ndice entre parntesis (por ejemplo x(3)
x(2)). Los elementos de las matrices se acceden poniendo los dos ndices entre parntesis,
separados por una coma (por ejemplo A(1,2) A(3,2)). Las matrices se almacenan por
columnas aunque se introduzcan por filas, y teniendo en cuenta esto se puede accederse a
cualquier elemento de una matriz con un slo subndice. Por ejemplo, si A es una matriz
(33) se obtiene el mismo valor escribiendo A(1,2) que escribiendo A(4).
Tambin se pueden definir matrices a partir de indicar elementos no cero de la misma por
ejemplo
>> clear A
>> A(1,1)=1; A(2,2)=2;A(3,3) =3
nos dar una matriz diagonal de dimensin 3 y con los elementos ingresados.
Para calcular la dimensin de una matriz o de un vector se utilizan las funciones de
MATLAB size y length como sigue
>> [m,n]=size(A)
devuelve el nmero de filas y de columnas de la matriz A. Si la matriz es cuadrada basta
recoger el primer valor de retorno.
La sentencia
>>n=length(x)
calcula el nmero de elementos del vector y lo guarda en n.
La asignacin de valores complejos a vectores y matrices desde teclado puede hacerse de
las dos formas, que se muestran en el ejemplo siguiente (conviene hacer antes clear i, para
que i no est definida como variable; este comando se estudiar ms adelante):
>> A = [1+2i 2+3i; -1+i 2-3i]
A=
1.0000 + 2.0000i 2.0000 + 3.0000i
-1.0000 + 1.0000i 2.0000 - 3.0000i
>> A = [1 2; -1 2] + [2 3; 1 -3]*I % En este caso el * es necesario
A=
1.0000 + 2.0000i 2.0000 + 3.0000i
-1.0000 + 1.0000i 2.0000 - 3.0000i
Puede verse que es posible definir las partes reales e imaginarias por separado. En este
caso s es necesario utilizar el operador (*), segn se muestra en el ejemplo anterior.
Introducir las matrices por teclado slo es prctico cuando se trabaja con matrices de
pequeo tamao o cuando no hay que repetir esa operacin muchas veces. Existen en
MATLAB varias funciones orientadas a definir con gran facilidad matrices de tipos
particulares.
Algunas de estas funciones son las siguientes:
eye(4) forma la matriz unidad de tamao (44)

18

zeros(3,5) forma una matriz de ceros de tamao (35)


zeros(4) dem de tamao (44)
ones(3) forma una matriz de unos de tamao (33)
ones(2,4) idem de tamao (24)
linspace(x1,x2,n) genera un vector con n valores igualmente espaciados entre x1 y x2
logspace(d1,d2,n) genera un vector con n valores espaciados logartmicamente entre
10^d1 y 10^d2. Si d2 es pi, los puntos se generan entre 10^d1 y pi
rand(3) forma una matriz de nmeros aleatorios entre 0 y 1, con distribucin
uniforme, de tamao (33)
rand(2,5) idem de tamao (25)
randn(4) forma una matriz de nmeros aleatorios de tamao (44), con
distribucinnormal, de valor medio 0 y varianza 1.
magic(4) crea una matriz (44) con los nmeros 1, 2, ... 4*4, con la propiedad de que
todas las filas, las columnas y la diagonal suman lo mismo.
hilb(5) crea una matriz de Hilbert de tamao (55). La matriz de Hilbert es una matriz
cuyos elementos (i,j) responden a la expresin (1/(i+j-1)). Esta es una matriz
especialmente difcil de manejar por los grandes errores numricosa los que conduce
invhilb(5) crea directamente la inversa de la matriz de Hilbert
kron(x,y) produce una matriz con todos los productos de los elementos del vector x
por los elementos del vector y. Equivalente a xT*y, donde x e y son vectores fila. Es
una matriz de rango 1.
compan(pol) construye una matriz cuyo polinomio caracterstico tiene como
coeficientes los elementos del vector pol (ordenados de mayor grado a menor)
vander(v) construye la matriz de Vandermonde a partir del vector v (las columnas
son las potencias de los elementos de dicho vector).
Existen otras funciones para crear matrices de tipos particulares. Con Help/MATLAB Help
se puede obtener informacin sobre todas las funciones disponibles en MATLAB, que
aparecen agrupadas por categoras o por orden alfabtico.

MATLAB ofrece tambin la posibilidad de crear una matriz a partir de matrices previas ya
definidas, por varios posibles caminos:
recibiendo alguna de sus propiedades (como por ejemplo el tamao),
por composicin de varias submatrices ms pequeas, siempre que los tamaos de
las submatrices los permitan.
modificndola de alguna forma.
En la prctica 1 se presentan diferentes ejercicios que indican de qu manera se obtienen
nuevas matrices utilizando las funciones de MATLAB diag(A), triu(A), tril(A) y
combinaciones de ellas.
Otra manera de cargar matrices es mediante el operador dos puntos (:). Este operador es
muy importante en MATLAB y puede usarse de varias formas. Se sugiere al lector que

19

practique mucho sobre los ejercicios del prctico 1 en este apartado, introduciendo todas
las modificaciones que se le ocurran y haciendo pruebas abundantes.
Para empezar, defnase un vector x con el siguiente comando:
>> x=1:10
x=
1 2 3 4 5 6 7 8 9 10
En cierta forma se podra decir que el operador (:) representa un rango: en este caso, los
nmeros enteros entre el 1 y el 10. Por defecto el incremento es 1, pero este operador
puede tambin utilizarse con otros valores enteros y reales, positivos o negativos. En este
caso el incremento va entre el valor inferior y el superior, en las formas que se muestran a
continuacin:
>> x=1:2:10
x=
13579
>> x=1:1.5:10
x=
1.0 2.5000 4.0000 5.5000 7.0000 8.5000 10.0000
>> x=10:-1:1
x=
10 8 7 6 5 4 3 2 1
Puede verse que, por defecto, este operador produce vectores fila. Si se desea obtener un
vector columna basta trasponer el resultado.
El operador dos puntos (:) es an ms til y potente y tambin ms complicado con
matrices. Se usar para extraer filas y columnas de matrices. En la prctica 1 encontrars
ejemplos.
El operador dos puntos (:) puede utilizarse en ambos lados del operador (=). Por ejemplo, a
continuacin se va a definir una matriz identidad B de tamao 66 y se van a reemplazar
filas de B por filas de A. Obsrvese que la siguiente secuencia de comandos sustituye las
filas 2, 4 y 5 de B por las filas 1, 2 y 3 de A,
>> A=magic(6);
>> B=eye(size(A));
>> B([2 4 5],:)=A(1:3,:)
B=
100000
35 1 6 26 19 24
001000
3 32 7 21 23 25
31 9 2 22 27 20
000001

20

Como nuevo ejemplo, se va a ver la forma de invertir el orden de los elementos de un


vector:
>> x=rand(1,5)
x=
0.9103 0.7622 0.2625 0.0475 0.7361
>> x=x(5:-1:1)
x=
0.7361 0.0475 0.2625 0.7622 0.9103
Obsrvese que por haber utilizado parntesis en vez de corchetes los valores generados
por el operador (:) afectan a los ndices del vector y no al valor de sus elementos.
Para invertir el orden de las columnas de una matriz se puede hacer lo siguiente:
>> A=magic(3)
A=
816
357
492
>> A(:,3:-1:1)
ans =
618
753
294
aunque hubiera sido ms fcil utilizar la funcin fliplr(A), que es especfica para ello. Ver
tambin las funciones flipud(A), flipdim(A).
Un caso especialmente interesante es el de crear una nueva matriz componiendo como
submatrices otras matrices definidas previamente. A modo de ejemplo, ejectense las
siguientes lneas de comandos y obsrvense los resultados obtenidos:
>> A=rand(3)
>> B=diag(diag(A))
>> C=[A, eye(3); zeros(3), B]
Finalmente, hay que decir que A(:) representa un vector columna con las columnas de A
una detrs de otra. Tambin se pueden definir las matrices y vectores por medio de
funciones de librera y funciones programadas por el usuario que se vern ms adelante.
2.1 Cadenas de caracteres
MATLAB puede definir variables que contengan cadenas de caracteres. Los caracteres de
una cadena se almacenan en un vector, con un carcter por elemento. Cada carcter ocupa
dos bytes. Las cadenas de caracteres van entre apstrofos o comillas simples, como por
ejemplo: 'cadena'. Si la cadena debe contener comillas, stas se representan por un doble
carcter comilla, de modo que se pueden distinguir fcilmente del principio y final de la
cadena. Por ejemplo, para escribir la cadena ni 'idea' se escribira 'ni''idea'''. Una matriz de

21

caracteres es una matriz cuyos elementos son caracteres, o bien una matriz cuyas filas son
cadenas de caracteres. Todas las filas de una matriz de caracteres deben tener el mismo
nmero de elementos. Si es preciso, las cadenas (filas) ms cortas se completan con
blancos. A continuacin se pueden ver algunos ejemplos y practicar con ellos:>> c='cadena'
c=
cadena
>> size(c) % dimensiones del array
ans =
16
>> double(c) % convierte en nmeros ASCII cada carcter
ans =
99 97 100 101 110 97
>> char(abs(c)) % convierte nmeros ASCII en caracteres
ans =
cadena
>> cc=char('ms','madera') % convierte dos cadenas en una matriz
cc =
ms
madera
>> size(cc) % se han aadido tres espacios a 'ms'
ans =
26
Las funciones ms importantes para manejo de cadenas de caracteres son las siguientes:
double(c)
convierte en nmeros ASCII cada carcter.
char(v)
convierte un vector de nmeros v en una cadena de caracteres.
char(c1,c2)
crea una matriz de caracteres, completando con blancos las
cadenas ms cortas.
deblank(c)
elimina los blancos al final de una cadena de caracteres.
disp(c)
imprime el texto contenido en la variable c.
ischar(c)
detecta si una variable es una cadena de caracteres.
isletter()
detecta si un carcter es una letra del alfabeto. Si se le pasa un
vector o matriz de caracteres devuelve un vector o matriz de
unos y ceros.
isspace()
detecta si un carcter es un espacio en blanco. Si se le pasa un
vector o matriz de caracteres devuelve un vector o matriz de
unos y ceros.
strcmp(c1,c2)
comparacin de cadenas. Si las cadenas son iguales devuelve un
uno, y si no lo son, devuelve un cero (funciona de modo
diferente que la correspondiente funcin de C).
strcmpi(c1,c2)
igual que strcmp(c1,c2), pero ignorando la diferencia entre
maysculas y minsculas.

22

strncmp(c1,c2,n)
c1==c2
s=[s,' y ms']
findstr(c1,c2)
strmatch(cc,c)
strrep(c1,c2,c3)
[p,r]=strtok(t)
int2str(v)
num2str(x,n)
str2double(str)
vc=cellstr(cc)
sprintf

compara los n primeros caracteres de dos cadenas.


compara dos cadenas carcter a carcter. Devuelve un vector o
matriz de unos y ceros.
concatena cadenas, aadiendo la segunda a continuacin de la
primera.
devuelve un vector con las posiciones iniciales de todas las veces
en que la cadena ms corta aparece en la ms larga.
devuelve los ndices de todos los elementos de la matriz de
caracteres (o vector de celdas) cc, que empiezan por la cadena c.
sustituye la cadena c2 por c3, cada vez que c2 es encontrada en
c1.
separa las palabras de una cadena de caracteres t. Devuelve la
primera palabra p y el resto de la cadena r.
convierte un nmero entero en cadena de caracteres.
convierte un nmero real x en su expresin por medio de una
cadena de caracteres, con cuatro cifras decimales por defecto
(pueden especificarse ms cifras, con un argumento opcional n).
convierte una cadena de caracteres representando un nmero
real en el nmero real correspondiente.
convierte una matriz de caracteres cc en un vector de celdas vc,
eliminando los blancos adicionales al final de cada cadena. La
funcin char() realiza las conversiones opuestas.
convierte valores numricos en cadenas de caracteres, de
acuerdo con las reglas y formatos de conversin del lenguaje C.

Con las funciones anteriores se dispone en MATLAB de una amplia gama de posibilidades
para trabajar con cadenas de caracteres. A continuacin se pueden ver algunos ejemplos:
>> num2str(pi) % el resultado es una cadena de caracteres, no un nmero
ans =
3.142
>> num2str(pi,8)
ans =
3.1415927
Es habitual convertir los valores numricos en cadenas de caracteres para poder
imprimirlos como ttulos en los dibujos o grficos.

23

3. OPERADORES Y FUNCIONES EN MATLAB


MATLAB puede operar con escalares, vectores y matrices por medio de operadores y por
medio de funciones.
3.1 Operadores aritmticos
Los operadores para variables escalares, vectoriales y matriciales de MATLAB son los
siguientes:
+
adicin o suma
sustraccin o resta
*
multiplicacin
'
traspuesta

potenciacin
\
divisin-izquierda
/
divisin-derecha
Para utilizar estos operadores se deben tener en cuenta que las dimensiones de las
variables sean coherentes con las correspondientes operaciones matriciales. Si los
operadores no se usan de modo correcto se obtiene un mensaje de error.
Por ejemplo, sean
>> x=[10 20 30] % vector fila
>> y=[11; 12; 13] % vector columna.
si se intenta sumar los vectores x e y se obtendr el siguiente mensaje de error:
>> x+y
??? Error using ==> +
Matrix dimensions must agree.
Para calcular traspuesta de x basta teclear:
>> x'
Como el resultado de la operacin no ha sido asignado a ninguna variable, MATLAB utiliza
un nombre de variable por defecto (ans, de answer), que contiene el resultado de la ltima
operacin. La variable ans puede ser utilizada como operando en la siguiente expresin que
se introduzca. La dificultad al sumar x e y desaparece
si se suma x con el vector transpuesto de y:
>> x+y'
Los operadores listados antes se pueden aplicar tambin de modo mixto.
Dada la matriz
>> A=[1 2 3; 4 5 6; 7 8 9]
para calcular la traspuesta de A basta con hacer
>> A'

24

Como el resultado de la operacin no ha sido asignado a ninguna otra matriz, MATLAB


utiliza un nombre de variable por defecto (ans, de answer), que contiene el resultado de la
ltima operacin. Tambin podra haberse asignado el resultado a otra matriz llamada B:
>> B=A'
B=
147
258
369
Ahora ya estn definidas las matrices A y B, y es posible seguir operando con ellas. Por
ejemplo, se puede hacer el producto B*A (deber resultar una matriz simtrica):
>> B*A
ans =
66 78 90
78 93 108
90 108 126
Es importante advertir que el operador de matriz traspuesta ('), aplicado a matrices
complejas, produce la matriz conjugada y traspuesta. Existe una funcin que permite
hallar la matriz conjugada (conj( )) y el operador punto y apstrofo (.') que calcula
simplemente la matriz traspuesta.
Ejemplos de operaciones de matrices con escalares como los siguientes se analizarn en el
prctico 2.
>> A=[1 2; 3 4]
A=
12
34
>> A*2
ans =
24
68
>> A-4
ans =
-3 -2
-1 0
MATLAB utiliza el operador de divisin / para dividir por un escalar todos los elementos de
una matriz o un vector. Sin embargo, el uso del operador \ se describir con ms atencin.
3.2 Funciones matemticas elementales
Estas funciones, que comprenden las funciones matemticas trascendentales y otras
funciones bsicas, cuando se aplican a una matriz actan sobre cada elemento de la matriz

25

como si se tratase de un escalar. Por tanto, se aplican de la misma forma a escalares,


vectores y matrices. Algunas de las funciones de este grupo son las siguientes:
sin(x) seno
cos(x) coseno
tan(x) tangente
asin(x) arco seno
acos(x) arco coseno
atan(x) arco tangente (devuelve un ngulo entre -/2 y +/2)
atan2(x) arco tangente (devuelve un ngulo entre - y +); se le pasan 2 argumentos,
proporcionales al seno y al coseno.
sinh(x) seno hiperblico
cosh(x) coseno hiperblico
tanh(x) tangente hiperblica
asinh(x) arco seno hiperblico
acosh(x) arco coseno hiperblico
atanh(x) arco tangente hiperblica
log(x) logaritmo natural
log10(x) logaritmo decimal
exp(x) funcin exponencial
sqrt(x) raz cuadrada
sign(x) devuelve -1 si <0, 0 si =0 y 1 si >0. Aplicada a un nmero complejo, devuelve
un vector unitario en la misma direccin
rem(x,y) resto de la divisin (2 argumentos que no tienen que ser enteros)
mod(x,y) similar a rem (Ver diferencias con el Help)
round(x) redondeo hacia el entero ms prximo
fix(x) redondea hacia el entero ms prximo a 0
floor(x) valor entero ms prximo hacia -
ceil(x) valor entero ms prximo hacia +
gcd(x) mximo comn divisor
lcm(x) mnimo comn mltiplo
real(x) partes reales
imag(x) partes imaginarias
abs(x) valores absolutos
angle(x) ngulos de fase
3.3 Operadores elemento a elemento
En MATLAB existe tambin la posibilidad de aplicar elemento a elemento los operadores
matriciales (*, ^, \ y /).
Para ello basta precederlos por un punto (.). Por ejemplo,
>> [1 2 3 4]^2

26

??? Error using ==> ^


Matrix must be square.
>> [1 2 3 4].^2
ans =
1 4 9 16
>> [1 2 3 4]*[1 -1 1 -1]
??? Error using ==> *
Inner matrix dimensions must agree.
>> [1 2 3 4].*[1 -1 1 -1]
ans =
1 -2 3 -4
3.4 Operadores para la resolucin de sistemas de ecuaciones lineales
MATLAB utiliza los operadores de divisin para la resolucin de sistemas de ecuaciones
lineales. Considrese el sistema de ecuaciones lineales,
Ax = b
donde x y b son vectores columna, y A una matriz cuadrada invertible. La resolucin de este
sistema de ecuaciones se puede escribir en las 2 formas siguientes
>>x = inv(A)*b
>>x = A\b
As pues, el operador divisin-izquierda por una matriz (barra invertida \) equivale a premultiplicar por la inversa de esa matriz. En realidad este operador es ms general y ms
inteligente de lo que aparece en el ejemplo anterior: el operador divisin-izquierda es
aplicable aunque la matriz no tenga inversa e incluso no sea cuadrada, en cuyo caso la
solucin que se obtiene (por lo general) es la que proporciona el mtodo de los mnimos
cuadrados. Cuando la matriz es triangular o simtrica aprovecha esta circunstancia para
reducir el nmero de operaciones aritmticas. En algunos casos se obtiene una solucin con
no ms de r elementos distintos de cero, siendo r el rango de la matriz. Esto se debe a que
la matriz se reduce a forma de escaln y se resuelve el sistema dando valor cero a las
variables libres o independientes. Por ejemplo, considrese el siguiente ejemplo de matriz
(12) que conduce a un sistema de infinitas soluciones:
>> A=[1 2], b=[2]
>> x=A\b
x=
0
1
que es la solucin obtenida dando valor cero a la variable independiente x(1). Por otra
parte, en el caso de un sistema de ecuaciones redundante (o sobre-determinado) el

27

resultado de MATLAB es el punto ms cercano -en el sentido de mnima norma del errora las ecuaciones dadas (aunque no cumpla exactamente ninguna de ellas). Vase el
siguiente ejemplo de tres ecuaciones formadas por una recta que no pasa por el origen y
los dos ejes de coordenadas:
>> A=[1 2; 1 0; 0 1], b=[2 0 0]'
>> x=A\b, resto=A*x-b
x=
0.3333
0.6667
resto =
-0.3333
0.3333
0.6667
Si la matriz es singular o est muy mal escalada, el operador \ da un aviso (warning), pero
proporciona una solucin. La inteligencia del operador barra invertida \ tiene un costo,
MATLAB debe de emplear cierto tiempo en determinar las caractersticas de la matriz,
triangular, simtrica, etc. Si el usuario conoce perfectamente y con seguridad las
caractersticas de la matriz del sistema, lo mejor es utilizar la funcin linsolve, que se ver
ms adelante, que no realiza ninguna comprobacin y puede obtener la mxima eficiencia.
3.5 Operadores relacionales
El lenguaje de programacin de MATLAB dispone de los siguientes operadores relacionales:
<

menor que

>

mayor que

<=

<= menor o igual que

>=

>= mayor o igual que

==

igual que

~=

distinto que

El carcter (~) se obtiene en los PCs pulsando sucesivamente las teclas 1, 2 y 6 manteniendo
Alt pulsada. En MATLAB los operadores relacionales pueden aplicarse a vectores y
matrices, y eso hace que tengan un significado especial. En general, si una comparacin se
cumple el resultado es 1 (true), mientras que si no se cumple es 0 (false). Recprocamente,
cualquier valor distinto de cero es considerado como true y el cero equivale a false. Los
operadores relacionales de MATLAB se aplican a dos matrices o vectores del mismo
tamao, la comparacin se realiza elemento a elemento, y el resultado es otra matriz de

28

unos y ceros del mismo tamao, que recoge el resultado de cada comparacin entre
elementos. Considrese el siguiente ejemplo como ilustracin de lo que se acaba de decir:
>> A=[1 2;0 3]; B=[4 2;1 5];
>> A==B
ans =
01
00
>> A~=B
ans =
10
11
3.6 Operadores lgicos
Los operadores lgicos de MATLAB son los siguientes:
&

Y lgico

O lgico

Negacin lgica

Se evalan siempre ambos operandos, y el


resultado es true slo si ambos son true.
Se evalan siempre ambos operandos, y el
resultado
es false slo si ambos son false.
devuelve 0 en el caso en que ambos sean 1
ambos sean 0.

Los operadores lgicos se combinan con los relacionales para poder comprobar el
cumplimiento de condiciones mltiples. Ms adelante se vern ejemplos y ciertas
funciones de las que dispone MATLAB para facilitar la aplicacin de estos operadores a
vectores y matrices.
3.7 Funciones que actan sobre vectores
max(x)

mximo elemento de un vector. Devuelve el valor mximo de x


y la posicin que ocupa.
min(x)
mnimo elemento de un vector. Devuelve el valor mnimo y la
posicin que ocupa.
sum(x)
suma de los elementos de un vector.
cumsum(x) devuelve el vector suma acumulativa de los elementos de un
vector (cada elemento del resultado es una suma de elementos
del original).
mean(x)
valor medio de los elementos de un vector.
std(x)
desviacin tpica.

29

prod(x)
producto de los elementos de un vector
cumprod(x) devuelve el vector producto acumulativo de los elementos de
un vector.
sort(x)
devuelve un vector con la ordenacin de menor a mayor de los
elementos del vector x y un vector con las posiciones iniciales
en x de los elementos en el vector ordenado.
norm(x)
Norma 2 del vector x.
norm(x,p) Norma p del vector x.
norm(x,inf) Norma del vector x.
3.8 Funciones que actan sobre matrices
Las siguientes funciones exigen que el/los argumento/s sean matrices. En este grupo
aparecen algunas de las funciones ms tiles y potentes de MATLAB.
A'

calcula la traspuesta (conjugada) de la matriz A.

A.'

calcula la traspuesta (sin conjugar) de la matriz A.

devuelve un vector con los coeficientes del polinomio


caracterstico de la matriz cuadrada A.
trace(A) devuelve la traza (suma de los elementos de la diagonal) de una
matriz cuadrada A.
devuelve el nmero de filas y de columnas de una matriz
size(A)
rectangular A.
size(A,1) devuelve el nmero de filas de A.
poly(A)

size(A,2) devuelve el nmero de columnas de A.


[L,U] = lu(A)

[L,U,P] = lu(A)
B = inv(A)
det(A)
chol(A)

descomposicin de Crout (A = LU) de una matriz. La matriz L


es una permutacin de una matriz triangular inferior (dicha
permutacin es consecuencia del pivoteo por columnas
utilizado en la factorizacin) y U es triangular superior.
descomposicin de Crout (PA = LU) de una matriz. La matriz
L es una matriz triangular inferior, U es triangular superior.
Y P es una matriz de permutacin.
calcula la inversa de A.
devuelve el determinante de la matriz cuadrada A. Equivale
a det(L)*det(U)
descomposicin de Cholesky de matriz simtrica y positivodefinida.

30

rcond(A)
[X,D] = eig(A)
[Q,R] = qr(A)
[Q,R] = qr(A,0)
null(A)

devuelve una estimacin del recproco de la condicin


numrica de la matriz A basada en la norma 1.
valores propios (diagonal de D) y vectores propios
(columnas de X) de una matriz cuadrada A.
descomposicin QR de una matriz rectangular. Se utiliza
para sistemas con ms ecuaciones que incgnitas.
similar a la anterior, pero con Q del mismo tamao que A,
es decir, sin completar una base ortonormal cuando m>n.

devuelve una base ortonormal del subespacio nulo de la


matriz rectangular A.
orth(A)
devuelve una base ortonormal del espacio de columnas de
A.
[U,D,V] = svd(A) descomposicin en valores singulares de una matriz
rectangular (A=U*D*V').
pinv(A)
calcula la pseudo-inversa de una matriz rectangular A.
rank(A)
calcula el rango r de una matriz rectangular A.
norm(A)
calcula la norma 2 de una matriz (el mayor valor singular).
normest(A)
calcula de forma aproximada la norma-2 con menos
operaciones aritmticas.
norm(A,1)
calcula la norma 1 de una matriz.
norm(A,fro)
calcula la norma Frobenius de una matriz.
norm(A,inf)
norma- de A, mxima suma de valores absolutos por filas
cond(A)
Calcula el nmero de condicin de A en norma 2.
condest(A)
estimacin por defecto de la condicin numrica de A con la
norma-1.
es la forma ms eficiente de que dispone MATLAB para
linsolve(A,b)
resolver sistemas de ecuaciones lineales para cualquier A.
Obviamente, si b es una matriz de segundos miembros, x
ser una mariz de soluciones con el mismo
n de columnas.

31

4. PROGRAMACIN DE MATLAB
MATLAB es una aplicacin en la que se puede programar muy fcilmente. Se comenzar
viendo las bifurcaciones y bucles, y la lectura y escritura interactiva de variables, que son los
elementos bsicos de cualquier programa de una cierta complejidad.
4.1 Bucles y Bifurcaciones
MATLAB posee un lenguaje de programacin que como cualquier otro lenguaje dispone
de sentencias para realizar bucles y bifurcaciones.
Los bucles permiten repetir las mismas operaciones o operaciones anlogas sobre datos
distintos. En la figura se muestra la forma de un bucle, con el control situado al principio
o al final del mismo.

Si el control est situado al comienzo del bucle es posible que las sentencias no se ejecuten
ninguna vez, por no haberse cumplido la condicin cuando se llega al bucle por primera vez.
Sin embargo, si la condicin est al final del bucle las sentencias se ejecutarn por lo menos
una vez, aunque la condicin no se cumpla.
La sentencia for repite un conjunto de sentencias un nmero predeterminado de veces. La
siguiente construccin ejecuta sentencias con valores de i de 1 a n, variando de uno en uno.
for i=1:n
sentencias
end
o bien,
for i=vectorValores
sentencias
end
donde vectorValores es un vector con los distintos valores que tomar la variable i. El caso
ms general para la variable del bucle es

32

i= (valor_inicial:incremento: valor_final)
En el ejemplo siguiente el bucle se ejecuta por primera vez con i=n, y luego i se va
reduciendo de 1 en 1 hasta que llega a ser menor que 1, en cuyo caso el bucle se termina:
for i=n:-1:1
sentencias
end
En el siguiente ejemplo se presenta una estructura correspondiente a dos bucles anidados.
La variable j es la que vara ms rpidamente (por cada valor de i, j toma todos sus posibles
valores):
for i=1:m
for j=1:n
sentencias
end
end
Una ltima forma de inters del bucle for es la siguiente (A es una matriz):
for i=A
sentencias
end
en la que la variable i es un vector que va tomando en cada iteracin el valor de una de las
columnas de A.
Cuando se introducen interactivamente en la lnea de comandos, los bucles for se ejecutan
slo despus de introducir la sentencia end que los completa. Lo mismo sucede con otras
sentencias que se dan a continuacin.
La estructura del bucle while tiene la siguiente sintaxis:
while condicion
sentencias
end
Donde condicion puede ser una expresin vectorial o matricial. Las sentencias se siguen
ejecutando mientras haya elementos distintos de cero en condicion, es decir, mientras haya
algn o algunos elementos true. El bucle se termina cuando todos los elementos de
condicion son false (es decir, cero).

33

La sentencia break hace que se termine inmediatamente la ejecucin del bucle for y/o
while ms interno de los que comprenden a dicha sentencia. La sentencia continue hace
que se pase inmediatamente a la siguiente iteracin del bucle for o while, saltando todas
las sentencias que hay entre el continue y el fin del bucle en la iteracin actual.
Las bifurcaciones permiten realizar una u otra operacin segn se cumpla o no una
determinada condicin. A continuacin se muestran tres posibles formas de bifurcacin.

En su forma ms simple, la sentencia if se escribe en la forma siguiente


if condicin
sentencias
end
Otra opcin de la sentencia if se escribe en la forma siguiente
if condicin
bloque 1
else
bloque 2
end

Existe tambin la bifurcacin mltiple, en la que pueden concatenarse tantas condiciones


como se desee, y que tiene la forma

34

if condicin 1
bloque 1
elseif condicin 2
bloque 2
elseif condicin 3
bloque 3
else % opcin por defecto para cuando no se cumplan las
condiciones 1, 2, 3
bloque 4
end
donde la opcin por defecto else puede ser omitida, si no est presente no se hace nada
en caso de que no se cumpla ninguna de las condiciones que se han chequeado. Obsrvese
que las sentencias aparecen desplazadas hacia la derecha respecto al if, else o end. Esto se
hace para que el programa resulte ms legible, resultando ms fcil ver dnde empieza y
termina la bifurcacin o el bucle. Es muy recomendable seguir esta prctica de
programacin.
La sentencia switch realiza una funcin anloga a un conjunto de if...elseif concatenados.
Su forma general es la siguiente:
switch switch_expresion
case case_expr1,
bloque 1
case {case_expr 2, case_expr 3, case_expr 4,...}
bloque 2
...
otherwise, % opcin por defecto
bloque 3
end
Al principio se evala la switch_expresion, cuyo resultado debe ser un nmero escalar o
una cadena de caracteres. Este resultado se compara con las case_expr, y se ejecuta el
bloque de sentencias que corresponda con ese resultado. Si ninguno es igual a
switch_expresion se ejecutan las sentencias correspondientes a otherwise.
Las bifurcaciones y bucles no slo son tiles en la preparacin de programas o de archivos
*.m. Tambin se aplican con frecuencia en el uso interactivo de MATLAB.
4.2 Lectura y escritura interactiva de variables
Se ver a continuacin una forma sencilla de leer variables desde teclado y escribir
mensajes en la pantalla del PC. La funcin input permite imprimir un mensaje en la lnea de

35

comandos de MATLAB y recuperar como valor de retorno un valor numrico o el resultado


de una expresin tecleada por el usuario. Despus de imprimir el mensaje, el programa
espera que el usuario teclee el valor numrico o la expresin. Cualquier expresin vlida de
MATLAB es aceptada por este comando. El usuario puede teclear simplemente un vector o
una matriz. En cualquier caso, la expresin introducida es evaluada con los valores actuales
de las variables de MATLAB y el resultado se devuelve como valor de retorno. Por ejemplo:
>> n = input('Teclee el nmero de ecuaciones')
Otra posible forma de esta funcin es la siguiente (obsrvese el parmetro 's'):
>> nombre = input('Cmo te llamas?','s')
En este caso el texto tecleado como respuesta se lee y se devuelve sin evaluar, con lo que
se almacena en la cadena nombre. As pues, en este caso, si se teclea una frmula, se
almacena como texto sin evaluarse.
La funcin disp permite imprimir en pantalla un mensaje de texto o el valor de una matriz,
pero sin imprimir su nombre. En realidad, disp siempre imprime vectores y/o matrices: las
cadenas de caracteres son un caso particular de vectores. Considrense los siguientes
ejemplos de cmo se utiliza:
>> disp('El programa ha terminado')
>> A=rand(4,4)
>> disp(A)
Ejectense las sentencias anteriores en MATLAB y obsrvese la diferencia entre las dos
formas de imprimir la matriz A.
4.3 Archivos *.m
Los archivos con extensin (.m) son archivos de texto sin formato (archivos ASCII) que
constituyen el centro de la programacin en MATLAB. Estos archivos se crean y modifican
con un editor de textos cualquiera, aunque se recomienda utilizar el propio editor de
textos, que es tambin Debugger.
Existen dos tipos de archivos *.m, los archivos de comandos (llamados scripts en ingls) y
las funciones. Los primeros contienen simplemente un conjunto de comandos que se
ejecutan sucesivamente cuando se teclea el nombre del archivo en la lnea de comandos de
MATLAB o se incluye dicho nombre en otro archivo *.m. Un archivo de comandos puede
llamar a otros archivos de comandos. Si un archivo de comandos se llama desde la lnea de
comandos de MATLAB, las variables que crea pertenecen al espacio de trabajo base de
MATLAB y permanecen en l cuando se termina la ejecucin de dicho archivo. El comando

36

echo hace que se impriman los comandos que estn en un script a medida que van siendo
ejecutados. Este comando tiene varias formas:
echo on
echo off
echo file on
echo file off
echo file
echo on all
echo off all

activa el echo en todos los archivos script


desactiva el echo
donde 'file' es el nombre de un archivo de funcin, activa el echo
en esa funcin.
desactiva el echo en la funcin
pasa de on a off y viceversa
activa el echo en todas las funciones
desactiva el echo de todas las funciones

Una mencin especial merece el archivo de comandos startup.m . Este archivo se ejecuta
cada vez que se entra en MATLAB. En l puede introducir todos aquellos comandos que le
interesa se ejecuten siempre al iniciar la sesin, por ejemplo format compact y los
comandos necesarios para modificar el path.
Las funciones permiten definir funciones enteramente anlogas a las de MATLAB, con su
nombre, sus argumentos y sus valores de retorno. Los archivos *.m que definen funciones
permiten extender las posibilidades de MATLAB; de hecho existen bibliotecas de archivos
*.m que se venden (toolkits) o se distribuyen gratuitamente (a travs de Internet). La
primera lnea, que no sea un comentario, de un archivo llamado name.m que define una
funcin tiene la forma:
function [lista de valores de retorno] = name(lista de argumentos)
donde name es el nombre de la funcin. Entre corchetes y separados por comas van los
valores de retorno (siempre que haya ms de uno), y entre parntesis tambin separados
por comas los argumentos. Puede haber funciones sin valor de retorno y tambin sin
argumentos. Recurdese que los argumentos son los datos de la funcin y los valores de
retorno sus resultados. Si no hay valores de retorno se omiten los corchetes y el signo igual
(=); si slo hay un valor de retorno no hace falta poner corchetes. Tampoco hace falta poner
parntesis si no hay argumentos.
Los valores de retorno pueden ser mltiples y matriciales. Tanto el nmero de argumentos
como el de valores de retorno no tienen que ser fijos, dependiendo de cmo el usuario
llama a la funcin al ejecutarla. Recurdese que un archivo *.m puede llamar a otros
archivos *.m, e incluso puede llamarse a s mismo de forma recursiva. Los archivos de
comandos se pueden llamar tambin desde funciones, en cuyo caso las variables que se
crean pertenecen al espacio de trabajo de la funcin. Las variables definidas dentro de una
funcin son variables locales, en el sentido que son inaccesibles desde otras partes del

37

programa y en el que no interfieren con variables del mismo nombre definidas en otras
funciones o partes del programa. Se puede decir que pertenecen al propio espacio de
trabajo de la funcin y no son vistas desde otros espacios de trabajo. Para que la funcin
tenga acceso a variables que no han sido pasadas como argumentos es necesario declarar
dichas variables como variables globales, tanto en el programa principal como en las
distintas funciones que deben acceder a su valor. Es frecuente utilizar el convenio de usar
nombres largos (ms de 5 letras) para las variables globales y con maysculas. La ejecucin
de una funcin termina cuando se llega a su ltima sentencia ejecutable. Si se quiere forzar
a que una funcin termine de ejecutarse se puede utilizar la sentencia return, que devuelve
inmediatamente el control al entorno de llamada.
Tradicionalmente MATLAB obligaba a crear un archivo *.m diferente por cada funcin. El
nombre de la funcin deba coincidir con el nombre del archivo. A partir de la versin 5.0 se
introdujeron las sub-funciones, que son funciones adicionales definidas en un mismo
archivo *.m, con nombres diferentes del nombre del archivo (y del nombre de la funcin
principal) y que las sub-funciones slo pueden ser llamadas por las funciones contenidas
en ese archivo, resultando invisibles para otras funciones externas. A continuacin se
muestra un ejemplo contenido en un archivo llamado mi_fun.m:
function y=mi_fun(a,b)
y=subfun1(a,b);
function x=subfun1(y,z)
x=subfun2(y,z);
function x=subfun2(y,z)
x=y+z+2;

4.4 Help para las funciones de usuario


Tambin las funciones creadas por el usuario pueden tener su help, anlogo al que tienen
las propias funciones de MATLAB. Esto se consigue de la siguiente forma: las primeras
lneas de comentarios de cada archivo de funcin son muy importantes, pues permiten
construir un help sobre esa funcin. Cuando se teclea en la ventana de comandos de
MATLAB:
>> help name_my_func
el programa responde escribiendo las primeras lneas del archivo name_my_func.m que
comienzan por el carcter (%), es decir, que son comentarios. De estas lneas, tiene una
importancia particular la primera lnea de comentarios (llamada en ocasiones lnea H1). En

38

ella hay que intentar poner la informacin ms relevante sobre esa funcin. La razn es que
existe una funcin, llamada lookfor que busca una determinada palabra en cada primera
lnea de comentario de todas las funciones *.m.
4.5 Referencias de funcin (function handles)
Las referencias de funcin (function handles) constituyen un nuevo mecanismo para
referirse a un nombre de funcin, introducido en MATLAB 6.0. En versiones anteriores la
nica forma de referirse a una funcin era por medio del nombre. Las referencias de
funcin permiten al programador un mayor control sobre la funcin que es efectivamente
llamada. El principal uso de las referencias de funcin (como de los nombres de funcin en
versiones anteriores) es pasar a una funcin el nombre de otra funcin, junto con sus
argumentos, para que la pueda ejecutar. A estas funciones que ejecutan otras funciones
que se les pasan como argumentos se les llama funciones de funcin.
Por ejemplo, MATLAB dispone de una funcin llamada quad que calcula la integral definida
de una funcin entre unos lmites dados. La funcin quad es genrica, esto es calcula,
mediante mtodos numricos, integrales definidas de una amplia variedad de funciones,
pero para que pueda calcular dicha integral hay que proporcionarle la funcin a integrar.
Por ejemplo, para calcular, en forma aproximada,
b

sen x dx
a

se puede utilizar la sentencia:


>> area=quad('sin',0,pi)
area =
2.0000
La funcin quad ejecuta la funcin sin por medio de la funcin feval, que tiene la siguiente
forma general:
>>feval(funcname, arg1, arg2, arg3, ...)
donde funcname es una cadena de caracteres con el nombre de la funcin a evaluar, y
arg1, arg2, arg3, ... son los argumentos que se le pasan a feval para que se los pueda pasar
a funcname.
A partir de la versin 6.0 de MATLAB ya no se pasa, a las funciones de funcin, el nombre
de la funcin como en el ejemplo anterior, sino una referencia de funcin o function
handle. De todas formas, para mantener la compatibilidad con los programas desarrollados
en versiones anteriores, se sigue admitiendo que se pase a feval el nombre de la funcin,
pero este mecanismo ya no se soportar en versiones posteriores. En MATLAB 6.* la forma
correcta de ejecutar el ejemplo anterior sera:

39

>>fh=@sin;
>>area=quad(fh,0,pi);
donde la variable fh es una referencia de funcin, que es un nuevo tipo de dato de
MATLAB.
Una referencia de funcin se puede crear de dos formas diferentes:
Mediante el operador @ ("at" o "arroba"). La referencia a la funcin se crea
precediendo el nombre de la funcin por el operador @. El resultado puede
asignarse a una variable o pasarse como argumento a una funcin. Ejemplos:
>>fh = @sin;
>>area = quad(@sin, 0, pi);
Mediante la funcin str2func que recibe como argumento una cadena de caracteres
conteniendo el nombre de una funcin y devuelve como valor de retorno la
referencia de funcin. Una de las ventajas de esta funcin es que puede realizar la
conversin de un vector de celdas con los nombres en un vector de referencias de
funcin. Ejemplos:
>> fh = str2func('sin');
>> str2func({'sin','cos','tan'})
ans =
@sin @cos @tan
Una caracterstica comn e importante de ambos mtodos es que se aplican solamente al
nombre de la funcin, y no al nombre de la funcin precedido o cualificado por su path.
Adems los nombres de funcin deben tener menos de 31 caracteres.
4.6 Funciones inline
MATLAB permite definir funciones a partir de expresiones matemticas por medio de la
funcin inline. Esta funcin trata de averiguar inteligentemente cules son los argumentos
de la funcin inline, a partir del contenido de la expresin matemtica. Por defecto se
supone que 'x' es el argumento, aunque es tambin posible determinarlos explcitamente al
llamar a inline. Considrense los siguientes ejemplos:
>> f=inline('expresin entre apstrofos');
>> f=inline('expresin', a1, a2, a3); % los argumentos son 'a1', 'a2', 'a3'
>> f=inline('expresin', N); % los argumentos son 'x', 'P1', ..., 'PN'
Las funciones inline se llaman con el handle (f en las sentencias anteriores) seguido de los
argumentos entre parntesis. Por ejemplo
>>f=inline(x 2-2*x+1)

40

>>f(2)
4.7 Funciones annimas
Las funciones annimas constituyen una forma muy flexible de crear funciones sobre la
marcha, tanto en la lnea de comandos como en una lnea cualquiera de una funcin o de
un archivo *.m. La forma general de las funciones annimas es la siguiente:
>>fhandle = @(argumentos) expresin;
Despus de ser creada, la funcin annima puede ser llamada a travs del fhandle seguido
de la lista de argumentos actuales entre parntesis, o tambin puede ser pasada a otra
funcin como argumento, tambin por medio del fhandle. Por ejemplo, la siguiente funcin
annima calcula el valor del seno del ngulo doble:
>>senoAngDoble = @(ang) 2*sin(ang).*cos(ang);
Las funciones annimas acceden a las variables del espacio de trabajo en el que son
definidas y crean en ese momento una copia de las variables que utilizan. El valor de dichas
variables ya no se actualiza; slo los argumentos pueden cambiar de valor. De esta forma,
las funciones annimas pueden ejecutarse a travs del handle en otros espacios de trabajo.
Si las funciones annimas no tienen argumentos hay que poner los parntesis vacos, tanto
al definirlas como al llamarlas. Por otra parte, pueden tener varios valores de retorno
cuando la expresin que contienen devuelve varios valores. Se pueden recoger todos o slo
algunos de estos valores.
La nica limitacin importante de las funciones annimas es que estn limitadas a una
nica expresin ejecutable de MATLAB. Por otra parte, su uso no tiene ms limitaciones
que las del uso del handle de una funcin cualquiera.
4.8 Recomendaciones generales de programacin
Las funciones vectoriales de MATLAB son mucho ms rpidas que sus contrapartidas
escalares. En la medida de lo posible es muy interesante vectorizar los algoritmos de
clculo, es decir, realizarlos con vectores y matrices, y no con variables escalares
dentro de bucles.
Aunque los vectores y matrices pueden ir creciendo a medida que se necesita, es
mucho ms rpido reservarles toda la memoria necesaria al comienzo del programa.
Se puede utilizar para ello la funcin zeros. Adems de este modo la memoria
reservada es contigua.
Conviene desarrollar los programas incrementalmente, comprobando cada funcin o
componente que se aade. De esta forma siempre se construye sobre algo que ya ha
sido comprobado y que funciona, si aparece algn error, lo ms probable es que se
deba a lo ltimo que se ha aadido, y de esta manera la bsqueda de errores est
acotada y es mucho ms sencilla.

41

El debugger es una herramienta muy til a la hora de acortar ese tiempo de puesta a
punto.
Pensar bien las cosas al programar sobre una hoja de papel en blanco es mejor que
sobre la pantalla del PC.
Otro objetivo de la programacin debe ser mantener el cdigo lo ms sencillo y
ordenado posible.
Al pensar en cmo hacer un programa o en cmo realizar determinada tarea es
conveniente pensar siempre primero en la solucin ms sencilla, y luego plantearse
otras cuestiones como la eficiencia.
Finalmente, el cdigo debe ser escrito de una manera clara y ordenada,
introduciendo comentarios, utilizando lneas en blanco para separar las distintas
partes del programa, introduciendo sangra en las lneas para ver claramente el
rango de las bifurcaciones y bucles.
Utilizando nombres de variables que recuerden al significado de la magnitud fsica
correspondientes.
En cualquier caso, la mejor forma (y la nica) de aprender a programar es
programando.

42

5. GRFICOS BIDIMENSIONALES
Los grficos 2-D de MATLAB estn fundamentalmente orientados a la representacin
grfica de vectores y matrices. Cuando una matriz aparezca como argumento, se
considerar como un conjunto de vectores columna (en algunos casos tambin de vectores
fila). MATLAB utiliza un tipo especial de ventanas para realizar las operaciones grficas.
Ciertos comandos abren una ventana nueva y otros dibujan sobre la ventana activa, bien
sustituyendo lo que hubiera en ella, bien aadiendo nuevos elementos grficos a un dibujo
anterior.
5.1 Representacin grfica de funciones definidas por una frmula
Los comandos que se presentan en este apartado son funciones MATLAB fciles de usar
(easy-touse) para representar grficamente, de forma rpida, funciones definidas por una
expresin matemtica. Tienen slo un pequeo nmero de parmetros que se pueden
especificar. Todas ellas hacen uso de otras funciones MATLAB que disponen de un nmero
superior de opciones y parmetros que podemos modificar. Cuando se necesite hacer
grficas de funciones que no vienen definidas por una frmula, tales como las funciones
definidas a trozos, definidas a travs de programas o por sus valores en un nmero finito de
puntos, etc., habr que recurrir a funciones ms generales que se vern en la siguiente
seccin.
El comando ms fcil de usar que dispone MATLAB para dibujar curvas planas definidas por
una frmula matemtica es el comando ezplot, que puede ser usado de varias formas.
ezplot(f)

ezplot(f,[a,b])
ezplot(x,y)
ezplot(x,y,[a,b])
ezpolar(f)
ezpolar(f,[a,b])

Dibuja la funcin y=f(x) para x en un intervalo


adecuado, la variable de entrada, f es una cadena de
caracteres conteniendo la expresin de una funcin
y=f(x). Si f es una expresin de dos variables (x,y),
dibuja la curva implcitamente definida por f(x,y)=0.
Se dibuja f en el intervalo indicado.
Dibuja la curva de ecuaciones paramtricas x=x(t),
y=y(t) para t en el intervalo dado en el primer caso y
para t en el intervalo [a,b] en el segundo.
Dibuja la curva definida en coordenadas polares por
= f() para variando en el intervalo [0,2], en el
primer caso y en el intervalo [a,b] en el segundo

43

5.2 Funciones grficas 2D elementales


MATLAB dispone de cinco funciones bsicas para crear grficos 2-D. Estas funciones se
diferencian principalmente por el tipo de escala que utilizan en los ejes de abscisas y de
ordenadas. Estas cuatro funciones son las siguientes:
plot()
plotyy()
loglog()
semilogx()
semilogy()

Crea un grfico a partir de vectores y/o columnas de


matrices, con escalas lineales sobre ambos ejes.
Dibuja dos funciones con dos escalas diferentes para las
ordenadas, una a la derecha y otra a la izquierda de la
figura.
dem plot pero con escala logartmica en ambos ejes.
dem plot con escala lineal en el eje de ordenadas y
logartmica en el eje de abscisas.
dem con escala lineal en el eje de abscisas y logartmica
en el eje de ordenadas.

En lo sucesivo se har referencia casi exclusiva a la primera de estas funciones (plot). Las
dems se pueden utilizar de un modo similar.
Existen otras funciones orientadas a aadir ttulos al grfico, a cada uno de los ejes, a
dibujar una cuadrcula auxiliar, a introducir texto, etc. Estas funciones son:
title('ttulo')
xlabel('tal')

Aade un ttulo al dibujo.


Aade una etiqueta al eje de abscisas. Con xlabel off
desaparece.
ylabel('cual')
dem xlabel para el eje y.
text(x,y,'texto') Introduce 'texto' en el lugar especificado por las
coordenadas x e y. Si x e y son vectores, el texto se repite
por cada par de elementos. Si texto es tambin un vector
de cadenas de texto de la misma dimensin, cada
elemento se escribe en las coordenadas correspondientes.
gtext('texto')
Introduce texto con ayuda del ratn: el cursor cambia de
forma y se espera un clic para introducir el texto en esa
posicin.
legend()
Define rtulos para las distintas lneas o ejes utilizados en
la figura. Consultar el help para ms detalles
grid
Activa la inclusin de una cuadrcula en el dibujo. Con grid
off desaparece la cuadrcula.
Borrar texto (u otros elementos grficos) es un procedimiento ms complicado ya que debe
ser previsto de antemano; para poder hacerlo hay que recuperar previamente el valor de

44

retorno del comando con el cual se ha creado. Despus hay que llamar a la funcin delete
con ese valor como argumento. Considrese el siguiente ejemplo:
>> v = text(1,.0,'seno')
v=
76.0001
>> delete(v)
La funcin plot dibuja una nueva figura en la ventana activa (en todo momento MATLAB
tiene una ventana activa de entre todos las ventanas grficas abiertas), o abre una nueva
figura si no hay ninguna abierta, sustituyendo cualquier cosa que hubiera dibujada
anteriormente en esa ventana. Para verlo, se comenzar creando un par de vectores x e y
con los que trabajar:
>> x=[-10:0.2:10]; y=sin(x);
A continuacin se consideran dos esquemas diferentes, que es interesante analizar.
>> close % se cierra la ventana grfica activa anterior
>> grid % se crea una ventana con una cuadrcula
>> plot(x,y) % se dibuja la funcin seno borrando la cuadrcula
Se puede observar la diferencia con la secuencia que sigue:
>> close
>> plot(x,y) % se crea una ventana y se dibuja la funcin seno
>> grid % se aade la cuadrcula sin borrar la funcin seno
En el primer caso MATLAB ha creado la cuadrcula en una ventana nueva y luego la ha
borrado al ejecutar la funcin plot. En el segundo caso, primero ha dibujado la funcin y
luego ha aadido la cuadrcula. Esto es as porque hay funciones como plot que por defecto
crean una nueva figura, y otras funciones como grid que se aplican a la ventana activa
modificndola, y slo crean una ventana nueva cuando no existe ninguna ya creada.
En la funcin plot se utilizan tambin cadenas de 1, 2 3 caracteres para indicar colores y
tipos de lnea. La funcin plot(), en sus diversas variantes, no hace otra cosa que dibujar
vectores. Cuando a la funcin plot() se le pasa un nico vector real como argumento, dicha
funcin dibuja en ordenadas el valor de los n elementos del vector frente a los ndices 1, 2,
... n del mismo en abscisas, por defecto, los distintos puntos del grfico se unen con una
lnea continua. Una segunda forma de utilizar la funcin plot() es con dos vectores como
argumentos. En este caso los elementos del primer vector se representan en las abscisas y
los del segundo vector se representan en ordenadas. La funcin plot() permite tambin
dibujar mltiples curvas introduciendo varias parejas de vectores como argumentos, el
primer vector de la pareja contiene las abscisas y el segundo vector las ordenadas . Para
las sucesivas lneas se utilizan colores que son permutaciones cclicas del azul, verde, rojo,
cyan, magenta, amarillo y negro.

45

Si se pasan a plot() varios vectores complejos como argumentos, MATLAB simplemente


representa las partes reales y desprecia las partes imaginarias. Sin embargo, un nico
argumento complejo hace que se represente la parte real en abscisas, frente a la parte
imaginaria en ordenadas. Vase el siguiente ejemplo. El comando plot puede utilizarse
tambin con matrices como argumentos.
El conjunto bsico de argumentos de la funcin plot es una tripleta formada por dos
vectores y una cadena de 1, 2 3 caracteres que indica el color y el tipo de lnea o de
marker. En la tabla siguiente se pueden observar las distintas posibilidades.
Smbolo para color

Color

y
M
C
R
G
B
W
K

yellow
magenta
cyan
red
green
blue
white
black

Smbolo para
marcador
.
o
x
+
*
s
d

v
>
<
p

Smbolo estilo de lnea


:
-.
--

Marcador
puntos
crculos
letra x
Signo +
asteriscos
cuadrados
diamantes
tringulo
tringulo invertido
tringulo apuntado a
derecha
tringulo apuntando a
izquierda
estrella de 5 puntas
estrella de 6 puntas

Estilo
lneas continuas
lnea de puntos
lneas a barra- punto
lneas de trazos

Cuando hay que dibujar varias lneas, por defecto se van seleccionando sucesivamente los
colores de la tabla comenzando por el azul, hacia arriba, y cuando se terminan se vuelve a
empezar otra vez por el azul. Si el fondo es blanco, este color no se utiliza para las lneas.
Tambin es posible aadir en la funcin plot algunos especificadores de lnea que controlan
el espesor de la lnea, el tamao de los marcadores, etc. Por ejemplo:
>>plot(x,y,'-.rs', 'LineWidth',4, 'MarkerEdgeColor','k', 'MarkerFaceColor', 'g',...

46

'MarkerSize',10)
Existe la posibilidad de aadir lneas a un grfico ya existente, sin destruirlo o sin abrir una
nueva ventana. Se utilizan para ello los comandos hold on y hold off. El primero de ellos
hace que los grficos sucesivos respeten los que ya se han dibujado en la figura (es posible
que haya que modificar la escala de los ejes); el comando hold off deshace el efecto de hold
on.
Una ventana grfica se puede dividir en m particiones horizontales y n verticales, con
objeto de representar mltiples grficos en ella. Cada una de estas subventanas tiene sus
propios ejes, aunque otras propiedades son comunes a toda la figura. La forma general de
este comando es:
>> subplot(m,n,i)
donde m y n son el nmero de subdivisiones en filas y columnas, e i es la subdivisin que se
convierte en activa. Las subdivisiones se numeran consecutivamente empezando por las de
la primera fila, siguiendo por las de la segunda, etc. Por ejemplo, la siguiente secuencia de
comandos genera cuatro grficos en la misma ventana:
>> y=sin(x); z=cos(x); w=exp(-x*.1).*y; v=y.*z;
>> subplot(2,2,1), plot(x,y)
>> subplot(2,2,2), plot(x,z)
>> subplot(2,2,3), plot(x,w)
>> subplot(2,2,4), plot(x,v)
Se puede practicar con este ejemplo aadiendo ttulos a cada subplot, as como rtulos
para los ejes. Se puede intentar tambin cambiar los tipos de lnea. Para volver a la opcin
por defecto basta teclear el comando:
>> subplot(1,1,1)
MATLAB tiene la opcin de modificar los ejes. El comando bsico es el comando axis. Por
defecto, MATLAB ajusta la escala de cada uno de los ejes de modo que vare entre el
mnimo y el mximo valor de los vectores a representar. Este es el llamado modo "auto", o
modo automtico.
axis([xmin, xmax, ymin,
ymax])

define de modo explcito los valores mximo y


mnimo segn cada eje.

axis('auto')

devuelve el escalado de los ejes al valor por defecto o


automtico.

47

v=axis
axis('ij')
axis('xy')
axis('auto x')
axis('auto xz')
axis(axis)
axis('tight')
axis('equal')
axis('square')
axis('image')

axis('normal')
axis('on')
axis('off')

devuelve un vector v con los valores [xmin, xmax,


ymin, ymax].
utiliza ejes de pantalla, con el origen en la esquina
superior izquierda. y el eje j en direccin vertical
descendente.
utiliza ejes cartesianos normales, con el origen en la
esquina inferior izda. y el eje y vertical ascendente.
utiliza el escalado automtico slo en direccin x.
utiliza el escalado automtico slo en direcciones x, z.
mantiene los ejes en sus actuales valores, de cara a
posibles nuevas grficas aadidas con hold on
establece los mismos lmites para los ejes que para
los datos.
el escalado es igual en ambos ejes.
la ventana ser cuadrada.
la ventana tendr las proporciones de la imagen que
se desea representaren ella (por ejemplo la de una
imagen bitmap que se desee importar) y el escalado
de los ejes ser coherente con dicha imagen.
elimina las restricciones introducidas por 'equal' y
'square'.
restituye las etiquetas, los nmeros y los ejes.
elimina las etiquetas, los nmeros y los ejes.

Es posible tambin tener un control preciso sobre las marcas y los rtulos que aparecen en
los ejes, como por ejemplo en la forma siguiente:
>>x = -pi:.1:pi; y = sin(x);
>>plot(x,y)
>>set(gca,'XTick',-pi:pi/2:pi)
>>set(gca,'XTickLabel',{'-pi','-pi/2','0','pi/2','pi'})
Obsrvese cmo las propiedades se establecen sobre los ejes actuales, a los que se accede
con la funcin gca (get current axis).
La funcin line() permite dibujar una o ms lneas que unen los puntos cuyas coordenadas
se pasan como argumentos. Permite adems especificar el color, grosor, tipo de trazo,
marcador, etc. Es una funcin de ms bajo nivel que la funcin plot(), pero ofrece una
mayor flexibilidad. En su versin ms bsica, para dibujar un segmento de color verde entre
dos puntos, esta funcin se llamara de la siguiente manera:
>> line([xini, xend]', [yini, yend]', 'color', 'g')

48

Se puede tambin dibujar dos lneas a la vez utilizando la forma:


>> line([xini1 xini2; xend1 xend2], ([yini1 yini2; yend1 yend2]);
Finalmente, si cada columna de la matriz X contiene la coordenada x inicial y final de un
punto, y lo mismo las columnas de la matriz Y con las coordenadas y, la siguiente sentencia
dibuja tantas lneas como columnas tengan las matrices X e Y:
>> line([X], [Y]);
5.3 Control de ventanas grficas
La funcin figure crea una nueva ventana grfica numerada como le corresponda de
acuerdo con la cantidad de ventanas abiertas. El valor de retorno es dicho nmero. El
comando figure(n) hace que la ventana n pase a ser la ventana o figura activa. Si dicha
ventana no existe, se crea una nueva ventana con el nmero consecutivo que le
corresponda y que se puede obtener como valor de retorno del comando. La funcin close
cierra la figura activa, mientras que close(n) cierra la ventana o figura nmero n. El
comando clf elimina el contenido de la figura activa, es decir, la deja abierta pero vaca. La
funcin gcf devuelve el nmero de la figura activa en ese momento. El comando figure(gcf)
(get current figure) permite hacer visible la ventana de grficos desde la ventana de
comandos. La funcin figure tambin admite que se fijen algunas de sus propiedades, como
por ejemplo la posicin y el tamao con que aparecer en la pantalla. Por ejemplo, el
commando
>> figure('position',[left,botton, width,height])
abre una ventana cuya esquina inferior izquierda est en el punto (left,botton) respecto a
la esquina inferior izquierda de la pantalla (en pixels), que tiene una anchura de width
pixels y una altura de height pixels. Otra caracterstica muy importante de una ventana
grfica es la de representar animaciones utilizando la tcnica del doble buffer. De modo
sencillo, esta tcnica se puede explicar diciendo que es como si el ordenador tuviera dos
paneles de dibujo: mientras uno est a la vista, se est dibujando en el otro, y cuando el
dibujo est terminado este segundo panel se hace visible. El resultado del doble buffer es
que las animaciones y el movimiento se ven de modo perfecto, sin el parpadeo (flicker) tan
caracterstico cuando no se utiliza esta tcnica. Para dibujar con doble buffer en la ventana
activa basta ejecutar los comandos siguientes
>> set(gcf,'DoubleBuffer','on', 'Renderer','
5.3 Otras funciones grficas 2-D
Existen otras funciones grficas bidimensionales orientadas a generar otro tipo de grficos
distintos de los que produce la funcin plot() y sus anlogas. Algunas de estas funciones son
las siguientes (para ms informacin sobre cada una de ellas en particular, utilizar help
nombre_funcin):

49

bar()
barh()
bar3()
bar3h()
pie()

crea diagramas de barras.


diagramas de barras horizontales.
diagramas de barras con aspecto 3-D.
diagramas de barras horizontales con aspecto 3D.
grficos con forma de torta.

pie3()

grficos con forma de torta y aspecto 3-D

area()

similar plot(), pero rellenando en ordenadas de 0


a y.
funcin anloga a bar() sin lneas internas.
representa sobre una grfica mediante barras
valores de errores.
dibuja los elementos de un vector complejo
como un conjunto de vectores partiendo
de un origen comn.
dibuja los elementos de un vector complejo
como un conjunto de vectores partiendo
de orgenes uniformemente espaciados sobre el
eje de abscisas.
dibuja histogramas de un vector
histograma de ngulos (en radianes)
dibujo de campos vectoriales como conjunto de
vectores.

stairs()
errorbar()
compass()
feather()

hist()
rose()
quiver()

Por ejemplo, genrese un vector de valores aleatorios entre 0 y 10, y ejectense los
comandos:
>> x=[rand(1,100)*10];
>> plot(x)
>> bar(x)
>> stairs(x)
>> hist(x)
>> hist(x,20)
>> alfa=(rand(1,20)-0.5)*2*pi;
>> rose(alfa)
La funcin fplot admite como argumento un nombre de funcin o un nombre de archivo
*.m en el cual est definida una funcin de usuario. La funcin puede ser escalar o
vectorial. La forma general de esta funcin es la siguiente:

50

>>fplot('funcion', limites, 'cadena', tol),


donde 'funcion' representa el nombre de la funcin o del archivo *.m entre apstrofos
(cadena de caracteres), limites es un vector de 2 4 elementos, cuyos valores son
[xmin,xmax] o [xmin,xmax,ymin,ymax], 'cadena' tiene el mismo significado que en plot y
permite controlar el color, los markers y el tipo de lnea, tol es la tolerancia de error
relativo. El valor por defecto es 2e-03. El mximo nmero
de valores en x es (1/tol)+1
Esta funcin puede utilizarse tambin en la forma:
[x,y]=fplot('funcion', limites, 'cadena', tol)
y en este caso se devuelven los vectores x e y, pero no se dibuja nada. El grfico puede
obtenerse con un comando posterior por medio de la funcin plot. Vase un ejemplo de
utilizacin de esta funcin. Se comienza creando un archivo llamado mifunc.m en el
directorio G:\MATLAB que contenga las lneas siguientes:
function y = mifunc(x)
y(:,1)=200*sin(x)./x;
y(:,2)=x.^2;
y a continuacin se ejecuta el comando:
>> fplot('mifunc(x)', [-20 20], 'g')
Obsrvese que la funcin mifunc devuelve una matriz con dos columnas, que constituyen
las dos grficas dibujadas en color verde.
La funcin fill es una funcin especial para dibujar polgonos planos, rellenndolos de un
determinado color. La forma general es la siguiente:
>> fill(x,y,c)
que dibuja un polgono definido por los vectores x e y, rellenndolo con el color
especificado por c. Si es necesario, el polgono se cierra uniendo el ltimo vrtice con el
primero. Respecto al color:
Si c es un carcter de color ('r','g','b','c','m','y','w','k'), o un vector de valores [r g b], el
polgono se rellena de modo uniforme con el color especificado.
Si c es un vector de la misma dimensin que x e y, sus elementos se trasforman de
acuerdo con un mapa de colores determinado, y el llenado del polgono no uniforme en
este caso se obtiene interpolando entre los colores de los vrtices. Sobre este tema de los
colores, se volver ms adelante con un cierto detenimiento.
Este comando puede utilizarse tambin con matrices:
>> fill(A,B,C)
donde A y B son matrices del mismo tamao. En este caso se dibuja un polgono por cada
par de columnas de dichas matrices. C puede ser un vector fila de colores uniformes para
cada polgono, o una matriz del mismo tamao que las anteriores para obtener colores de
relleno por interpolacin. Si una de las dos, o A o B, son un vector en vez de una matriz, se

51

supone que ese vector se repite tantas veces como sea necesario para dibujar tantos
polgonos como columnas tiene la matriz. Considrese un ejemplo sencillo de esta funcin:
>> x=[1 5 4 2]; y=[1 0 4 3];
>> fill(x,y,'r')
>> colormap(gray), fill(x,y,[1 0.5 0.8 0.7])
5.4 Entrada de puntos con el ratn
Se realiza mediante la funcin ginput, que permite introducir las coordenadas del punto
sobre el que est el cursor, al clicar (o al pulsar una tecla). Algunas formas de utilizar esta
funcin son las siguientes:
[x,y] = ginput
lee un nmero indefinido de puntos cada
vez que se clica o se pulsa una
tecla cualquiera hasta que se termina
pulsando la tecla intro.
[x,y] = ginput(n)
lee las coordenadas de n puntos.
[x,y,bot] = ginput
igual que el anterior, pero devuelve tambin
un vector de enteros bot con
el cdigo ASCII de la tecla pulsada o el
nmero del botn del ratn (1, 2,
...) con el que se ha clicado
Como ejemplo de utilizacin de este comando, ejectense las instrucciones siguientes en la
ventana de comandos de MATLAB para introducir un cuadriltero arbitrario y dibujarlo de
dos formas:
>> clf, [x,y]=ginput(4);
>> figure(gcf), plot(x,y,'w'), pause(5), fill(x,y,'r')
donde se ha introducido el comando pause(5) que espera 5 segundos antes de continuar la
ejecucin. Este comando admite como argumento un tiempo con precisin de centsimas
de segundo.
5.5 Preparacin de pelculas o "movies"
Para preparar pequeas pelculas o movies se pueden utilizar las funciones movie, moviein
y getframe. Una pelcula se compone de varias imgenes, denominadas frames. La funcin
getframe devuelve un vector columna con la informacin necesaria para reproducir la
imagen que se acaba de representar en la figura o ventana grfica activa, por ejemplo con
la funcin plot. El tamao de este vector columna depende del tamao de la ventana, pero
no de la complejidad del dibujo. La funcin moviein(n) reserva memoria para almacenar n
frames. La siguiente lista de comandos creara una pelcula de 17 imgenes o frames, que
se almacenarn como las columnas de la matriz M:

52

M = moviein(17);
x=[-2*pi:0.1:2*pi]';
for j=1:17
y=sin(x+j*pi/8);
plot(x,y);
M(:,j) = getframe;
end
Una vez creada la pelcula se puede representar el nmero de veces que se desee con el
comando movie. Por ejemplo, para representar 10 veces la pelcula anterior, a 15 imgenes
por segundo, habra que ejecutar el comando siguiente (los dos ltimos parmetros son
opcionales):
movie(M,10,15)
Los comandos moviein, getframe y movie tienen posibilidades adicionales para las que
puede consultarse el Help correspondiente. Hay que sealar que en MATLAB no es lo
mismo un movie que una animacin. Una animacin es simplemente una ventana grfica
que va cambiando como consecuencia de los comandos que se van ejecutando. Un movie
es una animacin grabada o almacenada en memoria previamente.
5.6 Las ventanas grficas de MATLAB
Las ventanas grficas de MATLAB tienen muchas posibilidades, de mejorar el grfico
obtenido que a travs de sus mens y barras de herramientas. Por defecto slo aparece la
barra de herramientas de la lnea superior. Para hacer aparecer tambin la segunda barra
se ejecuta Camera Toolbar, en el men View.
En el men Edit, adems de los comandos referidos a la copia de figuras, aparecen los
comandos Figure Properties, Axes Properties, Current Object Properties y Colormap, que
abren paso a los correspondientes editores de propiedades. Tambin es posible cambiar
interactivamente el mapa de colores utilizado en una figura con el comando Edit/Colormap
se abre el cuadro de dilogo. El men Edit de las ventanas grficas ofrece tambin las
opciones estndar de Windows, permitiendo copiar, cortar y pegar los elementos
seleccionados de la figura si est activada. El men View permite hacer visibles u ocultar las
barras de herramientas Window Toolbar y Camera Toolbar. Estas barras de herramientas
disponen de numerosas opciones para trabajar con ventanas que contengan grficos 2-D y
3-D. La mejor forma de aprender es probar y acudir al Help cuando hay algo que no se
entiende. En men Insert permite aadir elementos a la figura activa, por ejemplo rtulos,
etiquetas, lneas, texto, etc. Por su parte, el men Tools permite realizar desde men
algunas de las operaciones tambin disponibles en las barras de herramientas. Finalmente,
el men Help permite acceder a la ayuda concreta que hace referencia a las ventanas
grficas.

53

6 GRFICOS TRIDIMENSIONALES
6.1. Dibujo simplificado de funciones 3-D
Existen algunas funciones simplificadas para el dibujo 3-D similares a la funcin ezplot en
2D. La funcin ezplot3 dibuja lneas paramtricas tridimensionales dadas por las
expresiones x(t), y(t) y z(t). Por defecto se utiliza el intervalo 0 < t < 2. Considrense las
siguientes posibilidades:
>> ezplot3(x,y,z);
>> ezplot3(x,y,z,[t1,t2]);
>> ezplot3(x,y,z,[t1,t2],'animate'); % dibuja la curva progresivamente
En las sentencias anteriores x, y, z pueden ser funciones annimas, handles funciones,
funciones inline o expresiones definidas como cadena de caracteres. Los archivos *.m y las
funciones inline deben escribirse de tal forma que admitan vectores de valores como
argumentos (vectorizados).
Otra funcin de dibujo 3-D rpido es ezsurf. Esta funcin utiliza la funcin surf para realizar
un dibujo 3-D de una funcin f(x,y). Por defecto se utilizan los intervalos 2*pi < x, y < 2*pi.
La funcin f se puede definir por medio de una expresin en la que aparezcan x e y definida
por medio de una cadena de caracteres, con una funcin convencional, o con funciones
annimas u online. A continuacin se dan algunas posibles formas de esta funcin:
>> ezsurf(f);
>> ezsurf(f, [a,b]);
>> ezsurf(f, [xmin,xmax,ymin,ymax]);
La funcin ezsurf permite tambin dibujar superficies paramtricas 3-D, por ejemplo en las
formas siguientes, con parmetros s y t:
>> ezsurf(x,y,z); % por defecto -2*pi < s,t < 2*pi
>> ezsurf(x,y,z, [a,b]);
>> ezsurf(x,y,z, [smin,smax,tmin,tmax]);
Con un parmetro ms, que es un nmero entero N se puede controlar la densidad del
mallado con el que se dibuja. Por defecto N=60. Con el argumento 'circ' se dibuja en un
dominio circular. A continuacin se incluyen algunos ejemplos tomados de la ayuda de
MATLAB:
>> ezsurf('s*cos(t)','s*sin(t)','t')
>> ezsurf('s*cos(t)','s*sin(t)','s')
>> ezsurf('exp(-s)*cos(t)','exp(-s)*sin(t)','t',[0,8,0,4*pi])

54

Otras funciones simplificadas para dibujo 3-D son ezcontour, ezcontourf, ezmesh, ezsurfc y
ezmeshc.
6.2 Otras forma de construir grficas tridimensionales
MATLAB tiene posibilidades de realizar varios tipos de grficos 3D.
anloga a su homloga bidimensional plot. Su forma ms sencilla es:

La funcin plot3 es

>> plot3(x,y,z)
dibuja una lnea que une los puntos (x(1), y(1), z(1)), (x(2), y(2), z(2)), etc. Al igual que en el
caso plano, se puede incluir una cadena de 1, 2 3 caracteres para determinar el color, los
markers, y el tipo de lnea:
>> plot3(x,y,z,s)
Tambin se pueden utilizar tres matrices X, Y y Z del mismo tamao:
>> plot3(X,Y,Z)
en cuyo caso se dibujan tantas lneas como columnas tienen estas 3 matrices, cada una de
las cuales est definida por las 3 columnas homlogas de dichas matrices.
Para dibujar una funcin de dos variables (z=f(x,y)) sobre un dominio rectangular se
construir una retcula o malla que se expresar mediante dos matrices. Sean x e y dos
vectores que contienen las coordenadas sobre cada eje a partir de la cual se construir la
retcula donde se va a dibujar la funcin. Despus hay que crear dos matrices X (cuyas filas
son copias de x) e Y (cuyas columnas son copias de y). Estas matrices se crean con la
funcin meshgrid,
>> [X,Y]=meshgrid(x,y);
Estas matrices representan respectivamente las coordenadas x e y de todos los puntos de la
retcula. La matriz de valores Z se calcula a partir de las matrices de coordenadas X e Y, con
la expresin Z=f(X,Y) , esto significa que los elementos de Z son funcin elemento a
elemento de los elementos de X e Y. Finalmente se dibuja con la funcin mesh
>> mesh(Z)
la funcin mesh dibuja en perspectiva una funcin en base a una retcula de lneas de
colores, rodeando cuadrilteros del color de fondo, con eliminacin de lneas ocultas, el
color depende del valor z de la funcin.
Otra opcin para graficar en 3D es usar la funcin

55

>> surf(Z)
En este caso en vez de lneas se obtiene una superficie faceteada, con eliminacin de lneas
ocultas. El color de las facetas depende tambin del valor de la funcin. La funcin surf
tiene tres posibilidades diferentes para la forma en que son representadas las facetas
o polgonos coloreados,
shading flat
shading interp
shading faceted

determina sombreado con color constante para cada polgono.


Este sombreado se llama plano o flat.
establece que el sombreado se calcular por interpolacin de
colores entre los vrtices de cada faceta.
consiste en sombreado constante con lneas negras superpuestas.
Esta es la opcin por defecto.

Para obtener el efecto deseado, basta poner la sentencia shading a continuacin de la


sentencia surf.
Una forma distinta de representar funciones tridimensionales es por medio de isolneas o
curvas de nivel. Como antes debe obtenerse la matriz de valores de la funcin en la
retcula Z como se ha hecho previamente y luego las funciones
>> contour(Z,n)
>> contour3(Z,n)
donde n representa el nmero de lneas de nivel. Si no se pone se utiliza un nmero por
defecto.
Otras posibles formas de estas funciones se detallan en la tabla.
contour(Z, val)
contour(u,v,Z,20)
contour(Z,20,'r--')
contourf(Z, val)
surfc
meshc

val es un vector de valores para las isolneas a dibujar.


se utilizan u y v para dar valores a los ejes de coordenadas.
se puede especificar el tipo de lnea como en la funcin plot.
anloga a contour(), pero rellenando el espacio entre lneas
hace lo mismo que surf, pero dibujando adems las lneas de
nivel en el plano XY.
hace lo mismo que mesh pero dibujando adems las lneas
de nivel en el plano XY

56

6.3 Utilizacin del color en grficos 3-D


En los dibujos realizados hasta ahora, se ha visto que el resultado adoptaba determinados
colores, pero todava no se ha explicado de dnde han salido. Ahora se ver qu sistema
utiliza MATLAB para determinar los colores. Un mapa de colores se define como una matriz
de tres columnas, cada una de las cuales contiene un valor entre 0 y 1, que representa la
intensidad de uno de los colores fundamentales: R (red o rojo), G (green o verde) y B (blue
o azul). La longitud por defecto de los mapas de colores de MATLAB es 64, es decir, cada
mapa de color contiene 64 colores, esta longitud puede modificarse.
Algunos mapas de colores estn predefinidos en MATLAB,
autumn
bone
colorcube
cool
copper
flag
gray
hot
hsv
spring
summer
winter

Vara suavemente desde el rojo, a travs del naranja hasta el


amarillo.
Es una escala de grises con una mayor cantidad de componente
azul.
Contiene un espaciado tan regular como es posible de colores en
RGB. Produce un contraste de colores.
Gama de colores entre el cyan y el magenta.
Gama de colores cobrizos.
Alterna los colores rojo, banco, azul y negro.
Gama de grises.
Gama de colores entre el negro y el banco pasando por el rojo el
naranja y el Amarillo.
Es la escala por defecto. Los colores comienzan con el rojo pasando
por el Amarillo, verde, cyan, blue,magenta y retornando al rojo.
Colores entre el magenta y el amarillo.
Colores entre el verde y el amarillo.
Colores entre el azul y el verde.

Otras opciones son jet, pink, prism. El colormap por defecto es jet. Para visualizar estos
mapas de colores, cambiando al mismo tiempo su longitud, se pueden utilizar los siguientes
comandos en la Command Window:
>> colormap(hot(128))
>> pcolor([1:129;1:129]')
donde la funcin pcolor permite visualizar por medio de colores la magnitud de los
elementos de una matriz (en realidad representa colores de celdas, para lo que necesita
que la matriz tenga una fila y columna ms de las necesarias; sa es la razn de que en el
ejemplo anterior a la funcin pcolor se le pasen 129 filas y 2 columnas).
El comando colormap acta sobre la figura activa, cambiando sus colores. Si no hay ninguna
figura activa, sustituye al mapa de color anterior para las siguientes figuras que se vayan a

57

dibujar. Cuando se desea dibujar una figura con un determinado mapa de colores se
establece una correspondencia (o un mapping) entre los valores de la funcin y los colores
del mapa de colores. Esto hace que los valores pequeos se dibujen con los colores bajos
del mapa, mientras que los valores grandes se dibujan con los colores altos. La funcin caxis
permite ajustar manualmente la escala de colores. Su forma general es:
caxis([cmin, cmax])
donde cmin y cmax son los valores numricos a los que se desea ajustar el mnimo y el
mximo valor de la escala de colores.
6.4 Otras funciones grficas 3D
Las siguientes funciones se derivan directamente de las anteriores, pero aaden algn
pequeo detalle y/o funcionalidad:
surfc

combinacin de surf, y contour en z=0

trisurf

similar a surf, dibuja una superficie 3-D a partir de los valores de una
funcin en una malla de tringulos.
Como mesh con plano de referencia en el valor mnimo y una
especie de cortina en los bordes del dominio de la funcin

meshz
surfl
light
colorbar
sphere

cylinder

para controlar la iluminacin determinando la posicin e intensidad


de un foco de luz.
crea un foco de luz en los ejes actuales capaz de actuar sobre
superficies 3-D. Se le deben pasar como argumentos el color, el
estilo (luz local o en el infinito) y la posicin.
aade el mapa de colores activo a la figura, redimensionando los
ejes para hacerle un lugar. Se puede colocar horizontal o
verticalmente
dibuja una esfera 3-D de radio unidad. Por defecto se utiliza un
faceteado de 20 (20 meridianos y 20 paralelos). Este nmero se
puede cambiar. Es posible recoger las coordenadas como valor de
retorno y multiplicarlas por un factor de escala.
dibuja una superficie cilndrica de radio 1 y altura 1, con 20 facetas
laterales. Este nmero se puede cambiar, como segundo argumento.
El primer argumento puede ser un vector que indica como vara el
radio en funcin de la altura del cilindro. Tambin es posible recoger
las coordenadas como valor de retorno y multiplicarlas por un factor
de escala.

58

6.5 Elementos generales: ejes, puntos de vista, lneas ocultas.


Las funciones surf y mesh dibujan funciones tridimensionales en perspectiva. La localizacin
del punto de vista o direccin de observacin se puede hacer mediante la funcin view, que
tiene la siguiente forma:
view(azimut, elev)
donde azimut es el ngulo de rotacin de un plano horizontal, medido sobre el eje z a partir
del eje x en sentido antihorario, y elev es el ngulo de elevacin respecto al plano (x-y).
Ambos ngulos se miden en grados, y pueden tomar valores positivos y negativos (sus
valores por defecto son -37.5 y 30). Tambin se puede definir la direccin del punto de vista
mediante las tres coordenadas cartesianas de un vector (slo se tiene en cuenta la
direccin):
view([xd,yd,zd])
En los grficos tridimensionales existen funciones para controlar los ejes, por ejemplo:
axis([xmin,xmax,ymin,ymax,zmin,zmax])
axis([xmin xmax ymin ymax zmin zmax cmin cmax])
Esta ltima funcin es una forma combinada de la funcin axis y de la funcin caxis,
explicada antes. Tambin se pueden utilizar las funciones siguientes: xlabel, ylabel, zlabel,
xlim, ylim, zlim, axis('auto'), axis(axis), etc. Las funciones mesh y surf disponen de un
algoritmo de eliminacin de lneas ocultas (los polgonos o facetas, no dejan ver las lneas
que estn detrs). El comando hidden activa y desactiva la eliminacin de lneas ocultas.
En el dibujo de funciones tridimensionales, a veces tambin son tiles los NaNs. Cuando
una parte de los elementos de la matriz de valores Z son NaNs, esa parte de la superficie no
se dibuja, permitiendo ver el resto de la superficie.

59

7 FUNCIONES DE FUNCIN
Para realizar clculo tales como obtener las races o los valores mnimos de una funcin,
hay que pasar el nombre de esta funcin como argumento a la funcin de MATLAB que va a
hacer los clculos. En esto consiste el concepto de funcin de funcin.
7.1 Races de ecuaciones escalares no lineales
La bsqueda de soluciones de ecuaciones escalares no lineales f(x)=0 se hace, en MATLAB,
mediante la funcin fzero.
fzero(funcion,x0)

[x,fval]=fzero(funcion,x0)

donde funcion es el nombre de una funcin que


evala la funcin f(x). f(x) puede ser un objeto inline
o bien una referencia a una funcion fun.m: @fun.
x0 es un valor "prximo" al cero que se busca.
devuelve la raz encontrada, x, y el valor de la
funcin en x (si el algoritmo no converge, x=NaN)

fzero(funcion,[a,b])

[a,b] tiene que ser un intervalo donde la funcin


cambia de signo.

fzero(@fun,x0,options,p1,p2,. . .)

options permite dar valores a una serie de


parmetros que intervienen en el clculo. Ver
documentacin de MATLAB para ms detalles. Si no
se necesita, se pone una matriz vaca: [] en su lugar.
p1,p2,... son parmetros que sern pasados como
argumentos a la funcin fun.m cuando sea llamada.

7.2 Clculo de extremos locales y globales


El clculo de mnimos relativos de funciones no lineales f : R n R se hace, con MATLAB,
mediante la funcin:
>> fminsearch(funcion,x0)
funcion es el nombre de una funcin que evala la funcin f(x) puede ser un objeto inline o
una referencia a una funcion fun.m: @fun y x0 es un valor "prximo" al mnimo que se
busca.
>> [x,fvalor]=fminsearch(funcion,x0)
devuelve el minimizador encontrado, x, y el valor de la funcin en x (si el algoritmo no
converge, x=NaN).
Cuando la funcin tiene parmetros se utiliza:

60

>> fminsearch(@fun,x0,options,p1,p2,...)
donde options permite dar valores a una serie de parmetros que intervienen en el
clculo. Ver documentacin de MATLAB para ms detalles. Si no se necesita, poner una
matriz vaca: [] en su lugar, p1,p2,... son parmetros que sern pasados como argumentos a
la funcin fun.m cuando sea llamada.
La bsqueda de mnimos absolutos de funciones escalares en un intervalo acotado se hace
mediante la funcin
>>fminbnd(funcion,x1,x2)
donde funcion es el nombre de una funcin que evala la funcin f(x) y x1, x2 son los
extremos del intervalo.
>> [x,fvalor]=fminbnd(funcion,x1,x2)
devuelve el minimizador x y el valor de la funcin en x. Tambin admite que la funcin
tenga parmetros:
>> fminbnd(@fun,x1,x2,options,p1,p2,...)
MATLAB tiene un toolbox o paquete especial (que debe ser adquirido aparte) con muchas
ms funciones orientadas a la optimizacin, es decir al clculo de valores mnimos de
funciones, con o sin restricciones.
7.3 Clculo de integrales definidas
El clculo numrico de integrales definidas de funciones de una variable real se hace en
MATLAB mediante la funcin:
>> quad(fun,a,b)
donde funcion es el nombre de una funcin que evala la funcin f(x), debe aceptar un
argumento vectorial, x, y devolver un argumento vectorial que es el integrando evaluado en
cada elemento de x.
>> quad(@fun,a,b,[],[],p1,p2,..)
permite pasar p1,p2,... como argumentos a la funcin fun(x,p1,p2,...)

61

7.4 Resolucin numrica de ecuaciones diferenciales ordinarias


MATLAB es capaz de calcular la evolucin en el tiempo de sistemas de ecuaciones
diferenciales ordinarias de primer orden, lineales y no lineales. Esto resulta de gran utilidad
a los ingenieros o futuros ingenieros interesados en la simulacin.
MATLAB dispone de varias funciones para resolver numricamente Problemas de Valor
Inicial (PVI) para Ecuaciones Diferenciales Ordinarias (EDO) que se expresan
y' = f ( x, y ) en [ t 0 , t f ]

y( t 0 ) = y 0

ode45
ode23
ode113
ode15s
ode23s
ode23t
ode23tb

estn basadas en algoritmos explcitos de tipo Runge-Kutta.


implementa un algoritmo PECE (predictor-corrector) de orden
variable.
es un mtodo de multipaso y orden variable basado en frmulas de
diferenciacin numrica.
est basado en una frmula modificada de Rosenbrock de orden 2.
es una implementacin de la regla del trapecio usando un
interpolante "libre".
es una implementacin de TR-BDF2, una frmula de Runge-Kutta
implcita.

Para la mayora de los casos ser suficiente con utilizar ode45 o bien ode23. Para casos
difciles, ver la documentacin de MATLAB. La utilizacin de todas estas funciones ode** es
similar. Lo indicado a continuacin para ode23 es vlido para cualquier otra
>> ode23(funcion,[t0,tf],y0)
funcion es el nombre de una funcin que evala el segundo miembro de la ecuacion, f(t,y).
Puede ser un objeto inline o una referencia a una m-funcin fun.m: @fun. [t0,tf] es el
intervalo en el que se quiere calcular la solucin, y0 es el valor de la condicin inicial usada
de esta forma, la funcin ode23 calcula la solucin numrica y la dibuja.
Usada en esta forma,
>> [t,y]=ode23(funcion,[t0,tf],y0)
la funcin ode23 calcula (numricamente) la solucin del problema, devolviendo dos
vectores, t e y, que proporcionan la aproximacin de la solucin del problema. Si se desea
expresamente conocer los valores de la solucin en unos determinados puntos
[t0,t1,t2,...,tf] se puede usar la orden ode** como sigue

62

>> ode23(funcion,[t0,t1,t2,...,tf],y0)
Las funciones ode** se pueden utilizar, tambin, en esta forma,
>> ode23(@fun,[t0,tf],y0,options,p1,p2,...)
donde options permite dar valores a una serie de parmetros que intervienen en
el clculo. Ver documentacin para ms detalles. Si no se necesita, poner una matriz vaca
[] en su lugar, p1,p2,... son parmetros que sern pasados como argumentos a la funcin
fun.m cuando sea llamada.

Vous aimerez peut-être aussi