to get the file

Anuncio
Introducción a Matlab∗
Enero 2005
Resumen
Este documento presenta una introducción a Matlab dirigida a usuarios que
no han trabajado nunca con Matlab. Las principales características de Matlab
así como la creación de programas son explicadas. El documento trata de
introducir al usuario en los distintos temas explicados sin profundizar en ellos.
El documento incluye una lista de referencias que el usuario puede utilizar para
ampliar sus conocimientos sobre el programa.
∗
Escrito por Abel Elizalde para la asignatura Evaluación de políticas públicas (CEMFI). Varios
ejemplos utilizados proceden de una versión anterior escrita por Javier Mencia.
Índice General
1 Entorno de trabajo
1
2 Definición de variables
3
3 Vectores y matrices
3.1 Acceso a elementos de una matriz . . . . . . . . . . . . . . . . . . . .
3.2 Operaciones matriciales . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3 Arrays multidimensionales . . . . . . . . . . . . . . . . . . . . . . . .
4
6
7
9
4 M-file: escritura de programas
9
5 Utilización de la ayuda
11
6 Uso de funciones incluidas en Matlab
12
7 Funciones propias
15
8 Bucles
8.1 Condición if
8.2 Bucle for . .
8.3 Bucle while .
8.4 switch . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
17
17
18
18
19
9 Otras funciones
20
10 Gráficos
22
11 Debug: depurar programas
22
12 Tipos de variables
24
13 Ejercicios
13.1 Encontrar un punto fijo . . . . . . . . . . . . . . . . . . . . . . . . . .
13.2 Evaluar funciones lineales a trozos . . . . . . . . . . . . . . . . . . . .
28
28
29
Referencias
31
1
Entorno de trabajo
El entorno operativo de Matlab se compone de una serie de ventanas que presentamos
a continuación. Aunque el reparto de estas ventanas en la pantalla puede cambiarse,
generalmente aparecen en la misma posición.1
Figura 1: Entorno de trabajo Matlab.
Las ventanas que forman parte del entorno de trabajo de Matlab son:
1. Command Window: se utiliza para introducir órdenes directamente por el
usuario (seguidas de enter). Los resultados de las órdenes introducidas se muestran en esta misma pantalla. Cuando las órdenes se envían desde un programa
previamente escrito, que en Matlab recibe el nombre de M-file, los resultados
también aparecen en esta ventana.
2. Command history: las órdenes introducidas en la ventana command window
quedan grabadas en esta ventana, de forma que, haciendo doble click sobre ellas
1
La posición por defecto de las ventanas puede reestablecerse utilizando: View → Desktop
layout → Default.
1
Figura 2: Command window.
las podemos volver a ejecutar. De la misma forma, si nos situamos en la ventana
command window, en el espacio reservado para introducir nuevas órdenes, i.e.
inmediatamente después de >>, y presionamos la tecla ↑, podemos acceder a
órdenes introducidas con anterioridad.
Figura 3: Command history.
3. Workspace: esta ventana contiene las variables (escalares, vectores, matrices,
...) creadas en la sesión de Matlab. La ventana workspace nos proporciona
información sobre el nombre, dimensiones, tamaño y tipo de variable. Existen
dos opciones para eliminar una variable:
2
(a) Introducir en command window el comando clear seguido del nombre de
la variable.
(b) Seleccionar la variable en el workspace y borrarla directamente con la tecla
delete.
Figura 4: Workspace.
Haciendo doble click en una variable se accede al contenido de dicha variable,
pudiendo modificar sus valores.
4. Current directory: las operaciones de Matlab utilizan el directorio seleccionado
en current directory (a través del botón para explorar) como punto de referencia. Por ejemplo, si guardamos una serie de variables con el comando save, se
guardan en el directorio en el que estemos trabajando. Lo mismo ocurre cuando
cargamos datos con el comando load: el ordenador busca los datos en el fichero
en el que estemos trabajando.
2
Definición de variables
Para crear una variable en Matlab, simplemente se ha de introducir, en la ventana
command window, el nombre de la variable y su valor. Por ejemplo:
a = 3;
3
(1)
Para buscar el
directorio deseado
Figura 5: Current directory.
hace que, en el espacio de trabajo workspace, se cree una variable escalar con valor 3.
Cualquier orden posterior puede hacer uso de esta variable por medio de una llamada
a “a”, por ejemplo:
(2)
b = exp (a) ;
crea una nueva variable “b” cuyo valor es el exponencial de la variable “a”.
El punto y coma ; después de una orden no es necesario. Si no ponemos el punto
y coma, el resultado de la orden aparece en la pantalla command window. En caso
contrario la orden se ejecuta pero su resultado no aparece en pantalla.
3
Vectores y matrices
De la misma forma que se definen variables escalares pueden definirse vectores (arrays
de 1 dimensión) y matrices (arrays de 2 dimensiones). Por ejemplo, para definir la
matriz


1 2

M =
 3 4 
5 6
4
(3)
basta con teclear
(4)
M = [1, 2; 3, 4; 5, 6];
donde los términos de una misma fila aparecen separados por comas, y el punto y
coma hace de separador entre filas. Para trasponer M, basta teclear
M0
(5)
Existen una serie de funciones que definen matrices estándar como:
• Matriz de unos de dimensión N1 xN2 :
ones(N1 , N2 ) ;
• Matriz de ceros de dimensión N1 xN2 :
zeros(N1 , N2 ) ;
• Matriz identidad de dimensión N1 xN1 :
eye(N1 ) ;
• linspace(primer elemento, último elemento, número de elementos igualmente espaciados) .
Por ejemplo:
(6)
linspace (0, 1, 5) ;
crea el vector fila
h
0 0.25 0.5 0.75 1
i
(7)
• La orden
M = [primer elemento : paso : último elemento] ;
(8)
crea un vector fila que va desde “primer elemento” hasta “último elemento”
dando saltos de la magnitud indicada por “paso”. Por ejemplo
M = [1 : 0.5 : 3] ;
genera el vector fila
M=
h
1 1.5 2 2.5 3
5
i
(9)
3.1
Acceso a elementos de una matriz
Imaginemos que hemos definido la matriz


1 2

M = 3 4 

5 6
(10)
Dicha matriz aparecerá en el workspace y puede ser utilizada hasta que se borre.
• Para acceder al elemento (i, j) de la matriz M tecleamos
M (i, j)
(11)
Si no ponemos punto y coma al final de la orden el valor obtenido aparecerá en
pantalla. También podemos asignar dicho valor a un escalar:
a = M (i, j) ;
(12)
• Para acceder a la fila i de la matriz M tecleamos
M (i, :)
(13)
M (1, :)
(14)
h
(15)
Por ejemplo:
nos devolverá el vector fila
1 2
i
• Para acceder a la columna j de la matriz M tecleamos
M (:, j)
(16)
• También podemos acceder a un rango determinado de la matriz. La orden
M (i1 : i2 , j1 : j2 )
6
(17)
nos permite acceder a los elementos de la matriz M situados desde la fila i1 a
la fila i2 y desde la columna j1 hasta la columna j2 . Por ejemplo
M (2 : 3, 1 : 1)
(18)
nos devolvería el vector columna2
3
5
3.2
(19)
Operaciones matriciales
Matlab permite operar con matrices utilizando funciones como:
• Multiplicar, sumar y restar matrices A y B (siempre que tengan las dimensiones
adecuadas):
A ∗ B;
(20)
A + B;
(21)
A − B;
(22)
• Inversa de la matriz A :
inv (A) ;
(23)
det (A) ;
(24)
A0 ;
(25)
• Determinante de la matriz A :
• Traspuesta de la matriz A :
2
Cuando el rango al que deseemos acceder vaya hasta la última fila ó columna podemos utilizar
end en lugar del número de la fila ó columna. La orden anterior podría escribirse como
M (2 : end, 1 : 1) ;
7
• Valores y vectores propios de los elementos de la matriz A :
(26)
eig (A) ;
• Descomposición de cholesky de la matriz A :
chol (A) ;
(27)
• Elementos de la diagonal de la matriz A :
(28)
diag (A) ;
• Suma y producto, por columnas, de los elementos de la matriz A :3
sum (A) ;
(29)
prod (A) ;
(30)
• Matlab también permite operar “elemento a elemento” entre matrices. Imaginemos las matrices
A =
B =
"
"
1 3
5 7
2 4
6 8
#
#
(31)
(32)
Matlab nos permite multiplicar, dividir, ... dichas matrices elemento a elemento.
Para ello debemos poner un punto delate del operador que deseemos utilizar:
Operación
Orden
Multiplicación A. ∗ B
División
A./B
Potencia
A.ˆB
Resultado#
2 12
30 56
"
#
0.5000 0.7500
0.8333 0.8750 #
"
1
81
15625 5764801
3
"
(33)
Para obtener la suma y producto por filas utilizaríamos las mismas funciones pero sobre la
matriz transpuesta:
sum (A0 ) ;
prod (A0 ) ;
8
• Concatenación de matrices
A=
"
2
3
#
(34)
La orden
B = [A, A + 3; A ∗ 2, A − 1] ;
genera la matriz



B=

3.3
2
3
4
6
5
6
1
2





(35)
(36)
Arrays multidimensionales
Matlab permite crear arrays de más de dos dimensiones. Por ejemplo, la orden
A = zeros(2, 2, 3);
(37)
crea un array de tres dimensiones: un cubo formado por tres matrices de dimensión
2x2.
4
M-file: escritura de programas
M-files, también llamados scripts, permiten al usuario escribir un conjunto de órdenes
en un editor de texto (incluido en el programa Matlab) para ejecutarlas posteriormente en el orden en el que se han escrito. En lugar de introducir las órdenes una a
una en el command window o ventana de comandos las órdenes se escriben una tras
otra en un M-file que posteriormente se ejecuta.
Para abrir un M-file: File → New → M-file. Los M-files se guardan (File
→ Save) en el directorio en el que estemos trabajando (fijado en la ventana current
directory) con extensión .m. El comando save guarda las variables que se encuentren
en el workspace con extensión .mat. Tanto los M-files como los ficheros de datos,
creados previamente, se abren desde la ventana current directory haciendo doble click
sobre ellos.
9
Un componente principal de cualquier programa son los comentarios, es decir,
texto que ayuda a interpretar (al lector) lo que el programa está haciendo pero que
Matlab no lee como órdenes. En un M-file, cualquier texto que aparezca tras el signo
% es interpretado por Matlab como un comentario y por lo tanto no se ejecuta. Es
recomendable introducir comentarios en los programas M-file para, cuando se revisan
los códigos, ayudar al lector a saber que es lo que el programa está haciendo. Los
comentarios aparecen en color verde en los M-file.
Una práctica bastante útil al comenzar un M-file es escribir, en primer lugar, los
comandos clc y clear. clc “limpia” la pantalla command window y clear borra
todas las variables que hubiera en el workspace.4 La orden clear borra todas las
variables que se encuentren en el workspace.
Ejemplo de M-file:
% Ejemplo de M-file
clc
% para limpiar los resultados de command window
clear
% para borrar las variables del workspace
% Creamos una matriz A
A = [1, 2; 3, 4];
% Creamos otra matriz B que sea la traspuesta de A
B = A0 ;
% Mostramos B en la pantalla del command window
B
%
%
%
%
Guardamos las dos matrices creadas A y B en un fichero llamodo
matrices_A_B. El fichero tendrá extensión .mat y se guarda en el
directorio en el que nos encontremos (fijado en la ventana
current directory).
(38)
save matrices_A_B;
% Borramos de la memoria de Matlab las variables del workspace
clear
% Cargamos de el fichero matrices_A_B previamente creado
load(‘matrices_A_B.mat’);
% Mostramos A en la pantalla del command window
A
% Fin del M-file
Para ejecutar un M-file hay dos opciones: pulsamos F5 o el botón Run, ver Figura
4
En el caso de que el M-file que esteis escribiendo vaya a hacer uso de variables previamente
creadas, simplemente no pongais la orden clear al principio del M-file.
10
(6), situado en la botonera superior del M-file.
Figura 6: Boton Run.
5
Utilización de la ayuda
Una de las principales ventajas de Matlab con respecto a similares programas consiste
en la gran cantidad de información que el usuario puede obtener del funcionamiento
del programa y de los comandos a través de la ayuda (Menú Help). Para programar
en Matlab es necesario saber manejarse en el entorno de trabajo y saber utilizar la
ayuda. Cualquier duda sobre como utilizar una función o cual es el comando para
realizar una determinada operación puede resolverse utilizando la ayuda.
El menú Help contiene, además de dos aplicaciones para introducir al usuario el
entorno de trabajo (Help → Using the Desktop and Help → Using the Command
Window), una pestaña llamada Matlab Help.
Matlab Help permite al usuario buscar información de tres formas diferentes:
1. La pestaña Contents permite ver un índice con todas las aplicaciones y Toolboxes 5 de Matlab.
2. La pestaña Index permite buscar, por orden alfabético, en el índice de materias
de Matlab, información sobre palabras clave (comandos, ordenes, ... ). Por
5
Matlab dispone de Toolboxes, que comercializa de forma separada al programa, sobre gran cantidad de materias: optimización, financial toolbox, financial derivatives toolbox, partial differential
equations toolbox, statistics toolbox, GARCH toolbox, ... Cada toolbox contiene funciones predefinidas
de la materia que trata. Documentación (en PDF) de cada toolbox está disponible en la pestaña de
la toolbox y en www.mathworks.com. Las Toolboxes han dado a Matlab gran parte del valor añadido
y del prestigio del que ahora disfruta.
11
Figura 7: Matlab Help.
ejemplo, si escribimos plot obtenemos información sobre dicho comando, que
se utiliza para hacer gráficos.
3. La pestaña Search busca en toda la documentación de ayuda de Matlab las
palabras introducidas.
6
Uso de funciones incluidas en Matlab
Para utilizar las funciones que Matlab incorpora, lo mas conveniente es consultar la
ayuda. Las funciones constan de una serie de variables de entrada (inputs) que deben
ser proporcionados por el usuario y una serie de variables de salida (outputs) como
resultado de la ejecución de la función.
A modo de ejemplo, analizamos la función regress que permite realizar regresión
lineal. Si tecleamos regress en la pestaña Index de ayuda de Matlab obtenemos
información sobre como utilizar la función. A continuación presentamos el resultado
de dicha búsqueda:
12
Statistics Toolbox
regress
Multiple linear regression
Syntax
b = regress(y,X)
[b,bint,r,rint,stats] = regress(y,X)
[b,bint,r,rint,stats] = regress(y,X,alpha)
Description
b = regress(y,X) returns the least squares fit of y on X by solving the linear model
for
, where:
y is an n-by-1 vector of observations
X is an n-by-p matrix of regressors
is a p-by-1 vector of parameters
is an n-by-1 vector of random disturbances
[b,bint,r,rint,stats] = regress(y,X) returns an estimate of in b, a 95% confidence
interval for in the p-by-2 vector bint. The residuals are returned in r and a 95% confidence interval
for each residual is returned in the n-by-2 vector rint. The vector stats contains the R2 statistic
along with the F and p values for the regression.
[b,bint,r,rint,stats] = regress(y,X,alpha) gives 100(1-alpha) % confidence
intervals for bint and rint. For example, alpha = 0.2 gives 80% confidence intervals.
Examples
Suppose the true model is
where I is the identity matrix.
X = [ones(10,1) (1:10)']
X =
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
1
10
y = X * [10;1] + normrnd(0,0.1,10,1)
y =
11.1165
12.0627
13.0075
14.0352
14.9303
16.1696
17.0059
18.1797
19.0264
20.0872
[b,bint] = regress(y,X,0.05)
b =
10.0456
1.0030
bint =
9.9165
10.1747
0.9822
1.0238
Compare b to [10 1]'. Note that bint includes the true model values.
Reference
[1] Chatterjee, S. and A. S. Hadi. Influential Observations, High Leverage Points, and Outliers in
Linear Regression. Statistical Science, 1986. pp. 379- 416.
refline
regstats
Generalmente las funciones pueden tener una o varias variables de entrada y una
o varias variables de salida. En este caso la función regress tiene dos variables de
entrada obligatorias: un vector columna y de datos sobre la variable dependiente, de
dimensión nx1, y una matriz X, de dimensión nxp, que contiene (por columnas) p
variables independientes. Si no incluimos ningúna otra variable de entrada, la función
regress devuelve (en una de las variables de salida) un intervalo de confianza al 95%
de los parámetros estimados. Si, por el contrario, incluimos una tercera variable de
entrada alpha, el intervalo de confianza es del (1 − alpha) %. Este ejemplo ilustra el
hecho de que muchas funciones de Matlab tienen un número de variables de entrada
variable.
Respecto a las variables de salida, si escribimos
b = regress(y, X);
(39)
solamente obtenemos una variable de salida b con los parámetros estimados. Por el
contrario, si escribimos
[b, bint, r, rint, stats] = regress(y, X);
(40)
obtenemos un conjunto de variables de salida: b, bint, r, rint, stats que recogen,
entre otras cosas un intervalo de confianza para los parámetros estimados (bint), los
errores de la regresión (r), el R2 de la regresión, ...
Al igual que con los variables de entrada, las funciones de Matlab pueden generar
un número variable de variables de salida, dependiendo de como se escriba la orden.
Para utilizar de forma eficiente dichas funciones el menú de ayuda de Matlab nos
proporciona información sobre dichas funciones, sus variables de entrada y variables
de salida.
7
Funciones propias
En ocasiones nos interesa utilizar funciones que Matlab no tiene predefinidas. Por
ejemplo, supongamos que necesitamos evaluar, en repetidas ocasiones la siguiente
15
función:
√
x+y
f (x, y) = x + y +
.
2
2
3
(41)
Definiremos una función propia en un M-file nuevo que debe acompañarse al
directorio de trabajo (current directory) en el que estemos trabajando cada vez que
evaluemos la función. Por ejemplo, si en un M-file necesitamos evaluar dicha función,
el M-file donde hemos definido la función debe estar en el mismo directorio de trabajo
que el M-file donde la estamos utilizando.
La siguiente figura contiene el código que el M-file que define la función f (x, y)
debe contener:
% Función propia 1
function resultado = f(x, y)
% variables de entrada: x e y
% variable de salida: resultado
(42)
% operaciones
resultado = (xˆ2) + (yˆ3) +sqrt ((x + y) /2) ;
donde la función sqrt es una función que Matlab incorpora para calcular raíces
cuadradas.
La palabra function precede a la forma de la función:
resultado = f (x, y) ,
(43)
donde x e y son los variables de entrada y resultado es la variable que la función
devuelve como resultado. La última línea del M-file calcula el valor de la variable
resultado utilizando las variables de entrada.
Una vez está definida la función, si tecleamos en el command window (o escribimos
en un M-file):
a = f (c, d) ;
(44)
la función asignará a la variable a el valor de la función f (·) evaluada en el punto (c, d).
Como puede observarse, no es necesario, al evaluar una función, usar las variables con
los mismos nombres que aparecen en la definición de la función.
16
Pueden crearse funciones propias con un número variable de variables de entrada
y variables de salida. La utilización de funciones propias con varias variables de salida
cumple en Matlab la misma función que las denominadas subrutinas cumplen en otros
programas como Fortran. Información acerca de estas opciones puede encontrarse en
el menú ayuda de Matlab, tecleando “passing variable numbers of arguments” en la
pestaña Search.
El uso de funciones propias es la manera más limpia de programar. Otra de las
ventajas de escribir funciones propias en M-files separados del programa principal es
la posibilidad de utilizar dichas funciones en otros programas.
8
Bucles
La mejor forma de saber cómo funciona un bucle y cual es su sintaxis es utilizar la
ayuda de Matlab. En esta sección presentamos algunos de los más utilizados.
8.1
Condición if
Forma general:
if (condición 1)
órdenes a ejecutar si condición 1 se satisface
elseif (condición 2)
órdenes a ejecutar si condición 2 se satisface
...
else
órdenes a ejecutar si no se satisface ninguna de las condiciones anteriores
end
(45)
Ejemplo:
if (a > b)
c = a;
else
c=b
end
17
(46)
Para evaluar las condiciones se utilizan operadores lógicos como:
Operador
>
>=
<
<=
==
~=
&
|
~
8.2
Descripción
Mayor que
Mayor o igual que
Menor que
Menor o igual que
Igual que
Distinto que
Si
O
No
(47)
Bucle for
Forma general:
for contador=inicio : fin
órdenes a ejecutar
end
(48)
Ejemplo: M-file función factorial
8.3
function h = f un_f actorial(n)
if (n == 0)
h = 1;
else
h = 1;
for i=1:n
h = h ∗ i;
end
end
% final del if
(49)
while (condición)
órdenes a ejecutar
end
(50)
Bucle while
Forma general:
18
Ejemplo: bucle while que encuentra el menor número entero n cuyo factorial es
mayor que 1000000, utilizando la función f un_f actorial(·) definida previamente en
un M-file.
n = 1;
while (f un_f actorial(n) < 1000000)
n = n + 1;
end
8.4
(51)
switch
switch es útil cuando tenemos varios if anidados. El comando switch evalúa una
variable, y en función del valor de dicha variable, realiza un conjunto de acciones u
otro. En el siguiente ejemplo, la variable a es evaluada por switch en la primera línea
del código. Si el valor de la variable a es 1, se realizan las operaciones incluidas en el
apartado case 1, si el valor de la variable a es 2, se realizan las operaciones incluidas
en el apartado case 2, ... Si la variable a no toma ninguno de los valores especificados
en los distintos case se ejecutan las órdenes que aparecen en el apartado otherwise.
Forma general:
switch a
case 1
órdenes a ejecutar si a = 1
case 2
órdenes a ejecutar si a = 2
case 3
órdenes a ejecutar si a = 3
...
otherwise
órdenes a ejecutar si a no toma ninguno
de los valores especificados en los distintos case
end
Comando break
El comando break termina la ejecución de un bucle.
19
(52)
Interrupción de programas en marcha
Para interrumpir un programa mientras se está ejecutando seleccionamos el command window y pulsamos Control + C.
9
Otras funciones
A continuación presentamos algunas funciones, a modo de ejemplo, que pueden resultar útiles a la hora de escribir programas. Consultar la ayuda de Matlab para obtener
una descripción detallada.
• beep
Produce un sonido cada vez que se ejecuta. Muy útil cuando se deja a correr
un programa y uno se pone a hacer otras cosas pero quiere enterarse de cuando
termina el programa: poner un beep al final del programa y subir el volumen
de los altavoces.
• tic y toc
tic pone el cronómetro de Matlab en marcha, y toc lo para, imprimiendo por
pantalla el tiempo transcurrido desde que tic se ejecutó. Útil para controlar
tiempos de ejecución.
• fprintf(‘escribir texto’)
Imprime “escribir texto” en la pantalla.
• size(matriz)
Devuelve las dimensiones de una matriz.
• rand(n, m)
Genera una matriz de dimensión nxm de números aleatorios a partir de una
distribución normal [0, 1] .
20
• randn(n, m)
Similar a rand pero utilizando una normal estándar.
• sort(vector o matriz)
Ordena de mayor a menor los elementos de un vector o matriz.
Otras funciones
• sum: suma los elementos de un vector o matriz.
• mean: calcula la media de los elementos de un vector o matriz.
• var: calcula la varianza de los elementos de un vector o matriz.
• std: calcula la desviación típica de los elementos de un vector o matriz.
• max: calcula el máximo de los elementos de un vector o matriz.
• min: calcula el mínimo de los elementos de un vector o matriz.
Funciones de densidad, distribución e inversa de la función de distribución
Las siguientes funciones calculan, para la distribución de probabilidad normal estándar, la densidad, función de distribución e inversa de la función de distribución de
un punto x:
• normpdf(x)
• normcdf(x)
• norminf(x)
Similares funciones para otras distribuciones de probabilidad también están disponibles.
21
10
Gráficos
Otro de los puntos fuertes de Matlab son los gráficos, tanto en dos como en tres
dimensiones. La función plot se utiliza para hacer gráficos en dos dimensiones y las
funciones plot3, mesh, surface, contour, ... se utilizan para hacer gráficos en tres
dimensiones. El libro Hanselman y Littlefield (2001), citado en la bibliografía, tiene
varios capítulos muy buenos sobre la realización de gráficos.
11
Debug: depurar programas
Cometer errores a la hora de escribir código es inevitable. Por ello, Matlab, al igual
que otros programas similares, incluye una aplicación llamada “debugger” destinada
a ayudar al usuario a depurar sus códigos.
El debugger se aplica sobre los programas escritos en Matlab, esto es, sobre los
M-files donde se ha escrito cualquier tipo de código. En el caso de que exista un
error en el código, al ejecutar el M-file, Matlab detiene su ejecución en el punto donde
se encuentra el error e imprime en la pantalla del command window el tipo de error
y la línea del M-file donde se encuentra, de forma que podemos ir a dicha línea de
código en el M-file y corregir el error. Por ejemplo, en el ejemplo de M-file que
utilizamos en (38), imaginemos que, en la tercera línea de código, en lugar de escribir
el comando clear olvidamos la letra “r” y escribimos solo clea. Al ejecutar el M-file
nos aparecería el siguiente error:
??? Undefined function or variable ’clea’.
On line 4 ==> clea
(53)
En cada línea del M-file, situado a la derecha del mismo (justo después de los
números que indican el número de línea), aparece una barrita horizontal. Haciendo
click sobre dicha barra fijamos un “breakpoint”, que queda marcado por un punto
rojo sobre la barra:
Al fijar un breakpoint y ejecutar el programa (Run) se ejecutan todas las órdenes anteriores al breakpoint, deteniéndose la ejecución del programa en el break22
Figura 8: Breakpoint.
point. Cuando eso ocurre, una flecha verde se sitúa al principio de la línea donde está
situado el breakpoint, como puede verse en la Figura (8). La flecha verde indica la
línea del programa hasta la cual se han ejecutado las órdenes.
Al fijar un breakpoint y ejecutar el programa, su ejecución se para en el breakpoint y, en ese momento, utilizando el workspace o el command window, podemos
ver los valores de cada variable o introducir órdenes en el command window. Esta
aplicación es muy útil para comprobar que órdenes situadas dentro del código generan
los resultados deseados.
Una vez la ejecución se detiene en el breakpoint y aparece la flecha verde al principio de la línea tenemos varias opciones:
1. Detener la ejecución,
2. poner de nuevo el programa a ejecutarse desde el breakpoint hasta el final del
M-file (o hasta el siguiente breakpoint), o
3. ir ejecutando orden por orden a partir del breakpoint.
La Figura (9) muestra los botones del M-file que realizan estas acciones. Para
borrar un breakpoint podemos hacer click sobre él o presionar uno de los botones que
aparecen en la botonera del M-file, que borra todos los breakpoints que haya en el
M-file.
Podemos fijar tantos breakpoints como queramos.
23
Ejecutar
siguiente orden
Continuar ejecución
hasta el final del Mfile o hasta el
siguiente breakpoint
Borrar
breakpoints
Detener
ejecución
Figura 9: Botones para depurar un programa.
12
Tipos de variables
Matlab, a diferencia de otros programas, no requiere al usuario a declarar las variables
antes de utilizarlas. De la misma forma, tampoco es necesario declarar el tipo de
cada variable (entero, real, complejo, carácter, ...): cuando una nueva variable se crea
Matlab le asigna el tipo que le corresponda. Por ejemplo:
• Si escribimos
a = 2.4;
(54)
Matlab considera la variable como real.
• Si escribimos
a = 2 + 3i;
(55)
Matlab considera la variable como compleja.
• Si escribimos
a = ‘texto’;
24
(56)
Matlab considera la variable de tipo texto o carácter (char).
Aunque esta característica de Matlab puede parecer conveniente por su sencillez
tiene varios inconvenientes. Por ejemplo, al no declarar todas las variables al principio
de cada programa generalmente se pierde la cuenta del número (y nombre) de todas
las variables creadas, lo que puede ocasionar problemas.
Variables globales y locales
Por defecto todas las variables creadas en Matlab son variables locales, esto es, solo
pueden utilizarse en el M-file en el que se crean. Por ejemplo, en la función f (x, y)
definida en la sección de funciones propias (42), las variables x, y y resultado solo
pueden utilizarse dentro del M-file que define la función f (x, y). Una vez que la
función ha sido evaluada dichas variables desaparecen de la memoria.
Las variables globales pueden utilizarse en todo momento. Para ello, es necesario
declarar la variable como global en todos los M-files donde se quiera utilizar. Por
ejemplo, consideremos la definición alternativa de la función f (x, y) que fue definida
en (42):
% Función propia 1 con variable global
function resultado = f(x, y)
% variables de entrada: x e y
% variable de salida: resultado
(57)
global e;
% declaración de la variable global e
% operaciones
e = sqrt ((x + y) /2) ;
resultado = (xˆ2) + (yˆ3) +e;
Cada vez que se evalúa la función f (·), la variable e toma el valor
q
x+y
,
2
donde x
e y son las variables de entrada introducidos por el usuario. Para definir una variable
global en un M-file o en el command window tecleamos
global e;
25
(58)
A continuación nos situamos en el command window y definimos la variable e
como global, esto es
>> global e;
(59)
Después evaluamos la función f (x, y), por ejemplo
>> f (1, 1)
(60)
lo que nos da un resultado de 3. Al mismo tiempo que la función f (x, y) se ha
ejecutado, hemos asignado el valor
q
1+1
,
2
a la variable global e. Como la hemos
declarado global en el command window, ahora podemos acceder a ella. Si tecleamos
en el command window
>> e
(61)
e=1
(62)
obtenemos su valor en pantalla:
En lugar de definir la variable global e en el command window lo podríamos haber
hecho en cualquier M-file que estemos utilizando.
En el ejemplo que acabamos de ver, la variable global toma su valor cuando la
función propia se ejecuta para poder ser utilizado fuera de dicha función propia, es
decir, en el programa principal. En este caso hemos utilizado la variable global como
variable de salida.
También podemos utilizar la variable global como variable de entrada. Podemos
definir en el programa principal (o command window) una variable como global y
utilizarla en una función propia sin necesidad de pasarla como variable de entrada de
la función propia. Imaginemos que definimos la función (42) de la siguiente forma:
√
x+y
2
3
f (x, y) = x + y +
+ e,
(63)
2
26
donde e será una variable global. El M-file que define dicha función sería:
% Función propia 1 con variable global
function resultado = f(x, y)
% variables de entrada: x e y
% variable de salida: resultado
global e;
(64)
% declaración de la variable global e
% operaciones
resultado = (xˆ2) + (yˆ3) + sqrt ((x + y) /2) +e;
Si declaramos la variable e como global en el programa principal (o en el command
window) y le asignamos un determinado valor:
>> global e;
>> e = 2;
(65)
cada vez que ejecutemos la función f (·) definida en (64) la variable e tomará valor
2 y el resultado se verá modificado en consecuencia. Nótese que, aunque la variable
global e se utiliza en la ejecución de la función propia f (·), no es una variable de
entrada de dicha función.
27
13
13.1
Ejercicios
Encontrar un punto fijo
El objetivo es encontrar un punto fijo x∗ para la función f (x) = a + b · x donde x
y a son matrices de 5x5 y b es un número real. Consideramos que hemos llegado al
punto fijo cuando la distancia entre dos iteraciones x (n) y x (n + 1) sea menor que
un número real arbitrariamente pequeño llamado distance.
1. Dar valores a los parámetros b y distance. Tomamos b = 0.95 y distance = 10−6 .
2. Abrir los ficheros matrixa y matrix0 (tienen formato .txt) donde se hallan la
matriz a y una matriz inicial x (0) y cargarlos en memoria.
3. Escribir una función f (x) como una rutina (función propia) separada. La matriz
a y el número real b habrán sido definidos como variables globales y por tanto
no serán dados como variables locales (de entrada) en esta rutina.
4. Escribir una rutina para la función de distancia. Dicha función toma como
variables de entrada dos matrices de 5x5 y entrega un número real no negativo.
Se puede tomar, por ejemplo, la distancia máxima entre los elementos de las
dos matrices.
5. Hacer un bucle while para evaluar la función f (x) de manera repetida sobre
los resultados previos: x (1) = f (x (0)), x (2) = f (x (1)), x (3) = f (x (2)),
etc. Mostrar por pantalla la distancia entre cada paso junto con el número de
iteración, y guardar las iteraciones y las distancias en dos vectores.
6. Condición de salida: cuando la distancia entre dos repeticiones sea menor que
distance, salir del bucle.
7. Guardar en un fichero la matriz con el punto fijo x∗ .
8. Representar en un gráfico la evolución del criterio distancia para cada iteración.
28
13.2
Evaluar funciones lineales a trozos
El objetivo de este ejercicio es evaluar una función lineal a trozos en un punto determinado. Se trata de una función que se comporta de forma lineal en intervalos
previamente determinados. Con este tipo de funciones se pueden obtener aproximaciones bastante exactas para cualquier función más general.
En nuestro caso, disponemos de dos vectores: x y gx.
• El vector x indica los extremos de cada intervalo, o en otras palabras los puntos
en los que cambia la pendiente de la función.
• El vector gx contiene el valor de la función en cada uno de los puntos que se
encuentran en el vector x.
Con los datos de estos dos vectores tenemos la información suficiente para evaluar
la función en cualquier punto. Por ejemplo, la Figura (10) muestra que para evaluar
una función de este tipo en el argumento z, hay que encontrar, en primer lugar,
los componentes de x anterior y posterior a z (x (i) y x (i + 1), respectivamente).
Finalmente, por interpolación lineal, se obtiene el resultado buscado.
g (z) = gx (i) +
gx (i + 1) − gx (i)
(z − x (i)) .
x (i + 1) − x (i)
(66)
En el ejemplo, los vectores x y gx se encuentran guardados dentro de los ficheros
con el mismo nombre, x y gx (en formato .txt). Estos vectores se cargan en memoria
con la orden “load function.mat” en el M-file que define la función g (·).
29
g (x )
g ( x (i + 1 ))
¿ g (z ) ?
g ( x (i ))
x (i )
z
Figura 10: Función a trozos.
.
30
x (i + 1 )
Referencias
[1] “Getting Started with Matlab”, The MathWorks, www.mathworks.com.
[2] Hanselman, D., y Littlefield, B., 2001, “Mastering Matlab 6: A Comprehensive
Tutorial and Reference”, Prentice Hall.
Para hacernos una idea de las posibilidades que Matlab ofrece solamente hace
falta echarle un vistazo al índice de contenidos de Hanselman y Littlefield (2001),
disponible en la biblioteca:
1. Getting started.
2. Basic features.
3. The Matlab desktop.
4. Script M-files.
5. Arrays and array operations.
6. Multidimensional arrays.
7. Cell arrays and structures.
8. Character strings.
9. Relational and logical operators.
10. Control flow: for loops, while loops, if loops, switch loops
11. Function M-files.
12. M-file debugging and profiling.
13. File and directory management.
14. Set, bit and base functions.
31
15. Time computations.
16. Matrix algebra.
17. Data analysis.
18. Data interpolation.
19. Polynomials.
20. Cubic splines.
21. Fourier analysis.
22. Optimization.
23. Numerical integration and differentiation.
24. Differential equations.
25. Two dimensional graphics.
26. Three dimensional graphics.
27. Using color and light.
28. ...
32
Descargar