Documentos de Académico
Documentos de Profesional
Documentos de Cultura
R2008a
MATLAB es un sistema abierto al cual el usuario puede incorporar nuevas funciones para
su utilizacin en aplicaciones particulares. Existen tambin libreras de funciones
MATLAB, denominadas Toolboxes, que permiten resolver problemas especficos en
diversas reas de ciencia e ingeniera. Actualmente existen Toolboxes en reas tales como
Control, Procesamiento de Seales, Identificacin, Procesamiento de Imgenes, Redes
Neuronales, etc.
Captulo
En ste primer captulo, esperamos que el alumno se familiarice con los comandos bsicos
de MATLAB de forma de poder realizar el tratamiento de los datos obtenidos en los
captulos siguientes.
1.
ENTORNO DE TRABAJO
Operaciones Bsicas
8
2
1
INTRODUCCIN
El programa MATLAB (el nombre corresponde a la abreviatura Matrix Laboratory) es una
potente herramienta de clculo numrico y visualizacin grfica de uso muy difundido
entre los cientficos para el desarrollo de su tarea de investigacin. Tiene la gran ventaja de
ser un lenguaje de alto nivel que integra, en un nico ambiente software, rutinas de clculo,
visualizacin y programacin. El programa es de fcil uso ya que los problemas se pueden
formular usando una notacin matemtica standard. La representacin bsica de los datos
en MATLAB es en forma matricial.
3
4
Clculo numrico.
Desarrollo de algoritmos.
Modelado, simulacin y desarrollo de prototipos.
Anlisis y visualizacin de datos.
Construccin de grficas.
6
Figura 01: Entorno de trabajo del programa MATLAB.
La pantalla de entrada de MATLAB (Figura 01) constituye el marco de trabajo general del
programa. Los elementos ms importantes de esta pantalla de inicio son los siguientes:
1
2
3
4
5
7
8
2.
COMANDOS BSICOS
Al iniciar el programa MATLAB se desplegar una ventana desde donde se ejecutan los
diferentes comandos (ver figura 2).
El programa MATLAB se inicia por defecto en el directorio c:\MATLAB\work. Antes de
comenzar a trabajar es conveniente cambiarse al directorio de trabajo. Para verificar en que
directorio se est trabajando se utiliza el comando: pwd.
pwd
who
whos
what
close
clf
demo
help
exit / quit
save
load
delete
3.
VARIABLES
&
[ ]
( )
,
Nombre de la variable
pi
iyj
Significado
inf
eps
NaN
realmin
realmax
1.0000e-006
No es nmero
Menor nmero: 2-1022
Mayor nmero: (2-e)21023
a) Variables numricas.
Por defecto son de doble precisin. Se puede trabajar con diferentes tipos de nmeros y
expresiones numricas, que abarcan todo el campo de los nmeros enteros, racionales,
reales y los complejos, y se utilizan en argumentos de funciones.
Las operaciones aritmticas en MATLAB se definen de acuerdo con las convenciones
matemticas estndar.
x+y
xy
x * y xy
x/y
x^y
Ejemplo:
Suma
Diferencia
Producto
Divisin
Potencia
format: Modifica el formato numrico de los valores desplegados por MATLAB donde
la funcin afecta solo la visualizacin en pantalla y no cmo los computa o almacena
MATLAB.
format long
format short
ans =
7
format long e
>> a=3.5*i
format short e
a =
format long g
format short g
format bank
format rat
0 + 3.5000i
format +
ans =
format hex
1.0000e+100
Ejemplo:
1
2
7
Obtener el valor de la siguiente expresin:
0.25 3 1 3
12
>> (2^12+1/7)/(0.25-3*(1-3^0.5))
ans =
1.6745e+003
ans =
1.581818181818182e+001
>> format short e; 174/11
c = cadena de caracteres
Ejemplo:
ans =
1.5818e+001
>> a='hola'
a =
ans =
hola
15.8181818181818
c) Variables matriz
En MATLAB se define las matrices introduciendo entre corchetes todos sus vectores
fila separados por un punto y coma. Los vectores se pueden introducir separando sus
componentes por espacios en blanco o por comas.
ans =
15.818
Ejemplo:
>> format bank; 174/11
Una variable matricial de dimensiones 3x3 se puede introducir las dos siguientes
formas:
ans =
1 2 3
Sea la matriz M 4 5 6
7 8 9
15.82
>> format hex; 174/11
ans =
ans =
51/20
7
2
5
8
3
6
9
a) Funciones Trigonomtricas
M =
1
4
7
2
5
8
Funcin
sin(x)
asin(x)
cos(x)
acos(x)
tan(x)
atan(x)
csc(x)
sec(x)
cot(x)
3
6
9
0.6948
0.3171
0.9502
0.0344
0.4387
0.3816
0.7655
0.7952
0.1869
0.4898
0.4456
0.6463
Significado
Seno de x
Arcoseno de x
Coseno de x
Arcocoseno de x
Tangente de x
Arcotangente de x
Cosecante de x
Secante de x
Cotangente de x
Ejemplo:
>> sin(pi/2)
(El comando rand crea una matriz del tamao especificado, en este caso 4 x 4, formada
por nmeros aleatorios entre 0 y 1.)
d) Variables simblicas
Se definen entre , por ejemplo: sym 'x', 'y'
Por ms informacin sobre este tema consultar el help de MATLAB: Data Types in
MATLAB.
4.
FUNCIONES MATEMTICAS
MATLAB dispone de una gama muy completa de funciones predefinidas, la mayora de las
cuales estudiaremos ms adelante. Dentro del grupo de las funciones con argumento real
que ofrece MATLAB, las ms importantes son las siguientes:
ans =
1
>> x=[1 2 3;9 8 7];
>> sin(x)
ans =
0.8415
0.4121
0.9093
0.9894
0.1411
0.6570
b) Funciones hiperblicas
Funcin
sinh(x)
cosh(x)
tanh(x)
Inversa
asinh(x)
acosh(x)
atanh(x)
csch(x)
sech(x)
coth(x)
acsch(x)
asech(x)
acoth(x)
ceil(x)
round(x)
fix(x)
rem(x)
sign(x)
min(x)
max(x)
sort(x)
real(x)
imag(x)
sum(x)
Ejemplo:
>> x=[1.5 1.2 1.6; 1.3 1.1 1.8];
>> y=sech(x)
y =
0.4251
0.5074
0.5523
0.5993
0.3880
0.3218
Ejemplo:
>> z=tanh(x)
>> round(2.574)
z =
ans =
0.9051
0.8617
0.8337
0.8005
0.9217
0.9468
>> round(2.4)
ans =
Significado
Funcin exponencial en base e (e^x)
Funcin logaritmo en base e de x
Funcin logaritmo en base 10 de x
Funcin logaritmo en base 2 de x
Funcin potencia en base 2 de x
Funcin raz cuadrada de x
2
>> ceil(2.574)
ans =
3
>> ceil(2.4)
Significado
Valor absoluto del real x
El mayor entero menor o igual que el real x
ans =
3
9
Ejemplo:
>> max(y)
ans =
5
ans =
>> sum(y)
3
11
0
ans =
Ejemplo:
>> x=3+2i;
>> imag(x)
e) Nmeros aleatorios
MATLAB trata perfectamente la generacin automtica de nmeros aleatorios. Veamos
a continuacin las funciones ms importantes de generacin de nmeros aleatorios.
ans =
2
Funcin
rand
>> real(x)
ans =
rand(n)
3
rand(m,n)
Ejemplo:
>> y=[2 1 5];
>> sort(y)
randn
ans =
1
Ejemplo:
>> min(y)
ans =
ans =
1
10
Significado
Devuelve un nmero decimal aleatorio distribuido
uniformemente en el intervalo [0, 1]
Devuelve una matriz de dimensin nxn cuyos elementos son
nmeros decimales aleatorios distribuidos uniformemente en
el intervalo [0, 1]
Devuelve una matriz de dimensin mxn cuyos elementos son
nmeros decimales aleatorios distribuidos uniformemente en
el intervalo [0, 1]
Devuelve un nmero decimal aleatorio distribuido segn una
normal con media 0 y varianza 1.
0.7094
>> rand(2,3)
0.7547
-0.4326
-1.6656
ans =
0.2760
0.6797
0.6551
0.1626
0.1190
0.4984
-4
21
c =
>> randn(2,3)
>> d=3.*x, e=2./x, f=2.\y
ans =
d =
0.1253
0.2877
5.
-1.1465
1.1909
1.1892
-0.0376
15
e =
OPERADORES
Matriz
+
*
/
\
^
Vector
+
.*
./
.\
.^
0.4000
0.5000
0.6667
0.5000
1.0000
3.5000
f =
a) Operadores aritmticos
Escalar
+
*
/
\
^
12
Descripcin
Suma o adicin
Resta
Multiplicacin
Divisin hacia la derecha
Divisin hacia la izquierda
Potencia
g =
5.0000
2.0000
0.4286
5.0000
2.0000
0.4286
h =
Ejemplo:
i =
25
16
10
b =
32
11
16
16
2187
b) Operadores relacionales
Menor (para complejos slo afecta a partes reales)
Menor o igual (slo afecta a partes reales)
Mayor (slo afecta a partes reales)
Mayor o igual (slo afecta a partes reales)
Igualdad (afecta a los nmeros complejos)
Desigualdad (afecta a los nmeros complejos)
<
<=
>
>=
==
=
c) Operadores lgicos
A
A&B
A|B
Xor(A,B)
Ejemplo:
>> A=3:9
A =
3
>> P=(A>4)&(A<7)
P =
0
Captulo
logm(A)
sqrtm(A)
transpose(A) o A
inv(A)
det(A)
rank(A)
trace(A)
Ejemplo:
Considere una matriz cuadrada de orden 4 formada por nmeros aleatorios distribuidos
uniformemente en el intervalo [0, 1] y calcule su determinante, rango, inversa, transpuesta
y traza.
Arreglos y Matrices
>> A=rand(4)
A =
INTRODUCCIN
MATLAB trabaja esencialmente con matrices de nmeros reales o complejos. Las
matrices 1 1 son interpretadas como escalares y las matrices fila o columna como
vectores.
0.8147
0.9058
0.1270
0.9134
>> det(A)
Por defecto todas las variables son matriciales y nos podemos referir a un elemento con
dos ndices. Aun as, conviene saber que la matriz est guardada por columnas y que nos
podemos referir a un elemento empleando slo un ndice, siempre que contemos por
columnas. Insistiremos bastante en este detalle, porque tiene fuertes implicaciones para
entender el funcionamiento de bastantes aspectos de MATLAB.
1.
ans =
-0.0261
>> rank(A)
ans =
MATRICES NUMERICAS
MATLAB permite trabajar con matrices numricas de forma muy cmoda y extensa. La
tabla que se presenta a continuacin muestra las funciones matrices numricas que pueden
realizarse con el mdulo bsico de MATLAB.
4
>> inv(A)
ans =
13
0.6324
0.0975
0.2785
0.5469
0.9575
0.9649
0.1576
0.9706
0.9572
0.4854
0.8003
0.1419
3.0761
-1.8442
-1.9337
0.5345
14.7235
1.0366
-14.6497
1.4378
9.6445
1.8711
-9.0413
-0.4008
-2
-4
-6
3
5
7
>> A'
ans =
ans =
0.8147
0.6324
0.9575
0.9572
0.9058
0.0975
0.9649
0.4854
0.1270
0.2785
0.1576
0.8003
0.9134
0.5469
0.9706
0.1419
>> trace(A)
-1
-2
0
4
5
9
ans =
-2
3
-4
5
-6
7
1.2118
>> A'*A % matriz 2x3 * matriz 3x2
Advertencia. Hay que tener una cierta precaucin con la funcin rank para calcular el
rango de una matriz, ya que lo hace de forma numrica. Para matrices con enteros de
tamao razonable el resultado suele ser exacto. En otros casos, MATLAB puede obtener un
rango incorrecto por culpa de los redondeos; aun as, MATLAB suele avisar si encuentra
una cierta proximidad a un defecto de rango.
2.
Con las operaciones suma (+) y producto (*) entre matrices hay que poner atencin en que
las dimensiones de las matrices sean las adecuadas para realizar dichas operaciones.
Ejemplo:
14
ans =
56
-68
-68
83
>> u=[1 2 3]
A =
u =
Hay que tener tambin cuidado con el smbolo de trasposicin. Cuando una matriz A es
compleja, con A' se calcula su traspuesta conjugada. Para calcular la traspuesta sin
conjugar hay que hacer:
>> v=[4 5 6]
v =
El producto de un vector columna por un vector fila (de cualquier tamao) produce una
matriz genrica de rango unidad:
a1
a1b1
a
2 b b b a2 b1
1
2
m
an
an b1
ans =
32
>> u'*v % columna por fila = matriz de rango unidad
ans =
4
8
12
5
10
15
6
12
18
Ejemplo:
>> ones(3)
ans =
ans =
6
a2 b2
an b2
a1bm
a2 bm
an bm
Hay instrucciones para crear matrices llenas de ceros, llenas de unos, diagonales, o la
identidad (en ingls la letra I se pronuncia igual que eye):
-3
a1b2
-3
El ejemplo anterior muestra cmo se puede hacer el producto escalar de dos vectores. Si
ambos son vectores fila u*v' realiza la operacin, ya que devuelve una matriz 1 X 1, que en
MATLAB es indistinguible de un escalar (un nmero). La expresin
1
1
1
1
1
1
1
1
1
>> zeros(3,5)
ans =
realiza la misma operacin (dot abrevia el concepto de dot product, que es como se suele
llamar en ingls al producto escalar), sin preocuparse de si los vectores son fila o columna.
0
0
0
0
0
0
0
0
0
0
0
0
15
0
0
0
0
1
2
4
6
3
5
7
0
0
-4
ans =
4
>> A(2,3)
??? Attempted to access A(2,3); index out of bounds
because size(A)=[3,2].
ans =
>> A(:,1) % vector columna con la primera columna de A
1
4
ans =
0
4
2
4
6
>> A(2,:) % vector fila con la segunda fila de A
ans =
3.
Ya hemos indicado que las matrices en MATLAB se guardan por columnas y que se puede
buscar un elemento siempre con un nico ndice. Esta es la simple razn por la que en los
vectores (donde no hay ms que una dimensin a la hora de colocar los elementos, sea en
fila o en columna) no hace falta ms que un ndice para buscar un elemento.
Ejemplo:
>> A=[2 3;4 5;6 7]
16
2
A =
ans =
-3.0000
1.0000
-7.0000
Ejemplo:
ans =
>> A(3,4)=1
A =
2.0000
1.0000
0.5000
ans =
4
-3.0000
1.0000
-7.0000
0
0
0
0
0
1.0000
ans =
3
Ejemplo:
La matriz vaca es la matriz que no tiene ningn elemento. Se escribe entre corchetes (es
decir, [ ]) y puede ser muy til a la hora de borrar filas o columnas de una matriz dada,
como se ve en el siguiente ejemplo,
A =
2.0000
-4.0000
0.5000
-3.0000
5.0000
-7.0000
A =
1
2
17
2
1
-3
>> B=[1 3 1 0 -1; 2 1 0 1 7; 0 0 1 3 4;0 0 2 1 9]
MATLAB puede trabajar con grupos de filas y columnas (no necesariamente consecutivos)
o concatenar matrices para formar matrices ms grandes siempre que los tamaos sean
compatibles.
>> A = diag([1 2 3]);
>> [A,ones(3,2)] % ampliar con columnas
ans =
1
0
0
0
2
0
0
0
3
1
1
1
1
1
1
B =
1
2
0
0
3
1
0
0
>> B(2:3,2:4)
columnas
1
0
1
2
%
0
1
3
1
segunda
-1
7
4
9
a
tercera
filas
0
2
0
0
1
0
0
0
3
0
0
1
ans =
1
0
0
1
1
3
ans =
2
B =
ans =
1
-1
1
0
1
2
0
1
3
1
ans =
2
segunda
1
2
0
0
ans =
cuarta
A =
ans =
7
1
2
1
0
1
2
4.
ans =
0
3
3
1
1
1
3
0
0
0
1
1
6
4
3
4
-1
-1
ans =
1.6667
-0.3333
>> A*ans
ans =
ans =
1
7
-2
-2
3.0000
1.0000
De una forma muy simple se pueden localizar los valores mximo y mnimo en una matriz,
as como su localizacin.
3
4
6
ans =
ans =
>> min(x)
ans =
-7
ans =
>> [cual,donde]=max(x)
-7
cual =
>> A=[-2 4 7; 5 -6 -4;-2 -7 -9]
5
A =
donde =
-2
5
-2
4
>> A=[1 2 3;5 7 -1;2 3 4;1 1 1];
>> max(A) % da un vector fila con los maximos de cada columna
ans =
5
7
-4
-9
-2
-2
5
-7
-6
4
-9
-4
7
El orden descendente se puede obtener a partir del ascendente con cambios de posiciones
de los elementos, pero tambin con un doble cambio de signo:
cual =
5
4
-6
-7
4
-sort(-A) % orden descendente
donde =
2
20
La orden find sirve para encontrar las posiciones de una matriz que cumplen alguna
condicin. Al igual que muchas otras funciones de MATLAB, la orden devuelve resultados
distintos segn el nmero de argumentos de salida que se soliciten.
>> A=[-1 2 5;3 0 -1]
A =
-1
3
2
0
5
-1
21
bar(Y)
bar(x,Y)
barh(X,y)
Captulo
hist(Y)
hist(Y,k)
pie(X)
Grficos
errorbar(x,y,e)
stem(Y)
stairs(X,Y)
INTRODUCCIN
El mdulo bsico de MATLAB ofrece una gama amplia de opciones a la hora de realizar
representaciones grficas. Permite realizar grficos de curvas planas y superficies,
posibilitando la agrupacin y superposicin de ellas. Tambin es posible trabajar colores,
rejillas, marcos, leyendas, ttulos, rtulos, etc., en grficos. Las representaciones de
funciones pueden realizarse en coordenadas implcitas, explicitas y paramtricas.
MATLAB es, por tanto, un software matemtico con elevadas prestaciones grficas, lo que
lo distingue de muchos otros paquetes de clculo simblico.
1.
GRFICOS BASICOS 2D
rose(Y)
Ejemplo:
3
5
Represente en un grfico de barras los valores de un vector y 10 . (Figura 3)
1
2
>> y=[3 5 10 1 2]';
>> bar(y)
10
9
>> x=-5:0.2:5;
>> bar(x,exp(-x.*x))
8
7
6
5
>> x=-5:0.2:5;
>> y=exp(-x.*x);
>> bar(x,y)
4
3
2
0.9
0.8
Figura 3.
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
-6
2
-4
-2
Figura 5.
A continuacin representamos el mismo grfico para barras horizontales
1
0
10
>> x=-5:0.2:5;
>> y=exp(-x.*x);
>> barh(x,y)
Figura 4.
23
1500
2
1000
-2
500
-4
-6
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0
-4
-2
Figura 6.
Figura 8.
>> y=randn(10000,1);
>> hist(y)
3000
2500
2000
1500
33%
1000
28%
500
0
-4
-2
Figura 7.
24
6%
Figura 9.
0.6
>> x=-3:0.1:3;
>> stairs(x,exp(-x.^2))
0.4
0.5
0.3
1
0.2
0.1
0.8
0
0.6
-0.1
-5
Figura 11.
0.2
0
-3
-2
-1
>> y=randn(100,1);
>> stem(y)
Figura 10.
Ahora representamos (Figura 11) un grafico de errores para la funcin de densidad de
una distribucin normal (0,1), con variable definida en 40 puntos entre -4 y 4, siendo
definidos los errores por 40 valores aleatorios uniformes (0,10).
>>
>>
>>
>>
0.4
x=-4:0.2:4;
y=(1/sqrt(2*pi))*exp(-(x.^2)/2);
e=rand(size(x))/10;
errorbar(x,y,e)
3
2
1
0
-1
-2
20
40
60
Figura 12.
25
80
100
0.5
plot(x,y)
plot(Y)
plot(X,Y,S)
line(x,y)
ezplot(f,[xmin,xmax])
fplot(f,[xmin,xmax])
-0.5
-1
Figura 13.
0.5
Ejemplo:
Queremos dibujar la grfica de la funcin y = sen(x) en el intervalo [0,2] (Figura13):
-0.5
-3
>> x=0:pi/100:2*pi;
>> y=sin(x);
>> plot(x,y)
-1
Figura 14.
-2
x2
>> x=-3:0.01:3;
>> y=x.*exp(-x.^2);
>> plot(x,y)
26
Cuadrcula.
Si queremos que aparezca una cuadrcula sobre el dibujo, utilizaremos el comando
grid on. El aspecto del dibujo sera ahora como el de la Figura 15. Para desactivar la
cuadrcula habr que escribir grid off.
>> fplot('x.*exp(-x.^2)',[-3,3])
>> grid on
Carcter
y
m
c
r
g
b
w
k
Color
Amarillo
Magenta
Cyan
Rojo
Verde
Azul
Blanco
Negro
0.5
0.4
0.3
0.2
0.1
0
-0.1
-0.2
-0.3
>> x=-3:0.2:4;
>> y=sin(x).^3-x;
>> plot(x,y,'r+');
-0.4
-0.5
-3
-2
-1
Figura 15.
Color y trazo
0
-1
-2
Carcter
.
+
*
O
X
Descripcin
Punto
Ms
Asterisco
Circunferencia
Equis (x-marcas)
Lnea
-:
-.
Descripcin
Continua
Guiones
Punteada
Guiones y punto
-3
-4
-5
-3
-2
-1
Figura 16.
27
Los ejes que aparecen por defecto en una grfica tambin se pueden modificar. Con el
comando axis([a b c d]), conseguiremos que la grfica aparezca en la regin a x
2, y c y d.
0.8
>> fplot('abs(cos(x))',[-2,2],'o')
>> axis([0 2 -1 1])
0.4
0.2
0
-2
0.5
-1.5
-1
-0.5
0.5
1.5
Figura 17.
-0.5
>> fplot('abs(cos(x))',[-2,2],'o')
-1
0.5
1.5
Figura 19.
0.8
0.6
0.4
Zoom
0.2
0
-2
-1.5
-1
-0.5
Figura 18.
Ejes
28
0.5
1.5
MATLAB permite manejar correctamente las anotaciones sobre los grficos tales
como: ttulos, etiquetas, leyendas, etc.
Grfico de y=f(x)
5
0
xlabel(texto)
ylabel(texto)
zlabel(texto)
legend(cadena1,
cadena2, )
legend(off)
text(x,y,text)
text(x,y,z,text)
gtext(text)
y=-x 2+sin(x)
-5
-10
Y
title(texto)
-15
-20
-25
-30
-2
-1
Figura 20.
Grafiquemos de la funcin y x sen( x) en el intervalo [-2,5] con las siguientes
2
caractersticas (Figura 20): ttulo, rotulo de los eje, rejilla y rotulo de la funcin.
>>
>>
>>
>>
>>
>>
>>
>>
x=-2:0.05:5;
y=-x.^2+sin(x);
plot(x,y,'-')
text(2.7,-4,'y=-x^2+sin(x)')
title('Grfico de y=f(x)')
xlabel('X')
ylabel('Y')
grid on
plot(x,y,x,z)
subplot(m,n,p)
En el siguiente ejemplo se representan sobre los mismos ejes las grficas de las
funciones y sen( x 2 ) e y log x , colocndose el texto de cada ecuacin
adecuadamente dentro del grfico, as como el titular del grfico y de los ejes (Figura
21).
29
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
x=linspace(0,2,30);
y=sin(x.^2);
plot(x,y)
text(1,0.8,'y=sin(x^2)')
hold on %mantiene la figura anterior
z=log(sqrt(x));
plot(x,z)
text(1,-0.1,'y=log(sqrt(x))')
xlabel('Eje X')
ylabel('Eje Y')
title('Grfico senoidal y logartmico')
z=sin(x+pi/3);
hold off
plot(x,y,'r-',x,z,'b--')
legend('sin(x)','sin(x+pi/3)')
xlabel('Eje de Abscisas')
ylabel('Eje de Ordenadas')
title('Grficas trigonomtricas')
Grficas trigonomtricas
sin(x)
sin(x+pi/3)
0.5
Eje de Ordenadas
0.5
-0.5
0
Eje Y
y=log(sqrt(x))
-1
-0.5
3
4
Eje de Abscisas
0.5
1
Eje X
1.5
Figura 21.
Otra forma de hacerlo es dibujar desde el principio dos grficas juntas, por ejemplo,
vamos a dibujar las grficas de las funciones y sen( x) e y sen( x ) en la
Figura 22.
-1
-1.5
>>
>>
>>
>>
>>
>>
>>
subplot(2,2,1);
ezplot('sin(x)',[-2*pi,2*pi])
subplot(2,2,2);
ezplot('cos(x)',[-2*pi,2*pi])
subplot(2,2,3);
ezplot('csc(x)',[-2*pi,2*pi])
subplot(2,2,4);
fill3(X,Y,Z,c)
sin(x)
cos(x)
-1
-1
meshgrid(x,y)
mesh(x,y,z)
-5
0
x
csc(x)
-5
-5
-5
-5
0
x
0
x
sec(x)
meshc(x,y,z)
meshz(x,y,z)
surf(x,y,z)
-5
0
x
surfc(x,y,z)
Figura 23.
2.
surfl(x,y,z)
GRFICOS 3D
waterfall(x,y,z)
MATLAB dispone de una gran variedad de formatos para dibujar grficas de funciones de
dos variables y una componente. En general se emplean colores para resaltar las alturas, en
una gradacin tpica de clculo cientfico que escala las alturas del azul al rojo (de menor a
mayor).
En el cuadro siguiente se presentan los comandos de MATLAB ms comunes en la
representacin de grficos de lneas 3D.
contour(x,y,z)
definidas en s.
Dibuja una regin poligonal cuyos vrtices son los
elementos de los vectores columna x, y, z. El parmetro c
contiene el color a graficar.
Crea arreglos bidimensionales a partir de los arreglos x e
y, para elaborar la grfica de una superficie explicita
z=f(x,y).
Representa una superficie explicita z=f(x,y) con los
arreglos x, y e z.
Representa una superficie explicita z=f(x,y) con los
arreglos x, y e z; proyectando las curvas de nivel en el
plano xy.
Representa una superficie explicita z=f(x,y) con los
arreglos x, y e z; cerrando la grfica con las fronteras del
dominio.
Grfica una superficie explicita z=f(x,y) con los arreglos x,
y e z; pintando cada una de las celdas.
Grfica una superficie explicita z=f(x,y) con los arreglos x,
y e z; proyectando las curvas de nivel en el plano xy.
Grfica una superficie explicita z=f(x,y) con los arreglos x,
y e z; considerando una iluminacin en formato bsico.
Grfica una superficie explicita z=f(x,y) en forma de
cascada.
Grfica las curvas de nivel de la superficie explicita
z=f(x,y).
Nota: Cuando se van a emplear funciones de dos variables, necesitaremos cruzar una lista
de valores (x1, x2, , xn) con otra (y1, y2, , yn). Esto lo hace la orden meshgrid. Si:
x = (x1, x2, , xn), y = (y1, y2, , yn)
la instruccin
[u v]=meshgrid(x,y)
x1
x
u 1
x1
x2 xn
x2 xn
x2 xn
y1
y
v 1
y1
y2 yn
y2 yn
y2 yn
As u(i,j) = xj y v(i,j) = yi, Recorriendo en paralelo las matrices u y v se obtienen, por tanto,
todos los pares (xi, yj).
Ahora representaremos otra la funcin z = f(x,y) haciendo uso de los comandos siguientes
(Figura 25):
>>
>>
>>
>>
>>
>>
t=-6:0.2:8;
x=t;
y=3-t;
z=cos(t);
plot3(x,y,z)
grid on
Ejemplo:
Representemos las hlice paramtrica x(t) = Sen(t), y(t) = Cos(t), z(t) = t para valores de t
entre 0 y 10 separados /50 (Figura 24).
1
0.5
>>
>>
>>
>>
t=0:pi/50:10*pi;
plot3(sin(t),cos(t),t)
grid on
axis square
0
-0.5
-1
10
5
40
0
-5
30
-5
10
Figura 25.
20
10
0
1
0
-1 -1
Figura 24.
32
-10
>>
>>
>>
>>
>>
>>
>>
t=-6:0.2:8;
x=t;
y=3-t;
z=cos(t);
c=[1 0.8 0.1];
fill3(x,y,z,c)
grid on
Grfico en 3D
0.5
0.5
0
-0.5
10
-0.5
-1
10
5
0
-5
-10
-5
-10
10
>>
>>
>>
>>
x2 y 2
x y
2
10
-5
Figura 27.
Figura 26.
Sen
-10
>>
>>
>>
>>
[x,y]=meshgrid(-7.5:0.5:7.5);
z=sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2);
surfc(x,y,z)
title('Grfico en 3D - curvas de nivel')
[x,y]=meshgrid(-7.5:0.5:7.5);
z=sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2);
surf(x,y,z)
title('Grfico en 3D')
1
0.5
>> [x,y]=meshgrid(-2:0.2:2)
-0.5
10
en remplazo de:
>> xa=-2:0.2:2;
>> ya=-2:0.2:2;
>> [x,y]=meshgrid(xa,ya);
-10
33
-10
-5
10
Figura 28.
Continuando con este ejemplo, representamos el grfico de malla (Figura 29).
1
[x,y]=meshgrid(-7.5:0.5:7.5);
z=sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2);
mesh(x,y,z)
title('Grfico en 3D - malla')
0.5
>>
>>
>>
>>
Grfico en 3D - malla
-0.5
10
0
0.5
-10
-10
-5
10
Figura 30.
0
-0.5
10
0
-10
-10
-5
10
Figura 29.
Y ahora lo representamos con la opcin de cortina o teln inferior (Figura 30) y le
agregamos algunas caractersticas al grfico.
z x2 y 2 9
>>
>>
>>
>>
[x,y]=meshgrid(-3:0.2:3);
z=x.^2-y.^2-9;
surf(x,y,z)
title('x^2-y^2-9')
34
[x,y]=meshgrid(-7.5:0.5:7.5);
z=sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2);
meshz(x,y,z)
title('Grfico en 3D - frontera')
xlabel('X')
ylabel('Y')
zlabel('Z')
>> ezsurf('x.^2-y.^2-9',[-2,2],[-2,2])
x -y -9
>>
>>
>>
>>
-6
[x,y]=meshgrid(-3:0.2:3);
z=x.^2-y.^2-9;
contour(x,y,z)
title('Grfico de contorno de: z=x^2-y^2-9')
-8
-10
-12
2
0
y
-2
-2
-1
-1
Figura 31.
-2
-3
-3
-2
-1
2 2
x -y -9
Figura 33.
Y ahora visualizamos el grfico de contorno 3D y es como sigue (Figura 34):
-4
-6
>>
>>
>>
>>
-8
-10
[x,y]=meshgrid(-3:0.2:3);
z=x.^2-y.^2-9;
contour3(x,y,z,20)
title('Grfico de contorno con 20 niveles')
-12
2
0
y
-2
-2
-1
Figura 32.
35
Figura 35.
0
-5
-10
-15
-20
2
0
-2
-2
Figura 34.
Finalmente representamos el grafico de cascada de la funcin anterior (Figura 35).
>>
>>
>>
>>
[x,y]=meshgrid(-3:0.2:3);
z=x.^2-y.^2-9;
waterfall(x,y,z)
title('Grfico de cascada de: z=x^2-y^2-9')
2 2
0
-5
-10
-15
-20
5
0
-5
36
-4
-2
emplearse cualquier editor de ficheros ASCII. Una primera forma de hacerlo seria
ejecutando la orden
>> edit
Captulo
De esta forma se abre una nueva ventana en la que podemos teclear el conjunto de rdenes
en MATLAB por ejecutar (vase la Figura 36).
Funciones y Ficheros
INTRODUCCIN
Hasta el momento nos hemos ocupado del trabajo con MATLAB en modo interactivo, sin
embargo como ya se ha comentado tambin es posible trabajar en modo programado
utilizando para ello los llamados mficheros. Estos son ficheros de texto con extensin .m
que contienen instrucciones en MATLAB los cuales se ejecutan desde la pantalla de
comandos (Command Window).
Hay dos tipos elementales de mficheros:
Figura 36: Ventana de editor de texto.
Los scripts estn formados simplemente por una serie de instrucciones en MATLAB
que se ejecutan como si estuviramos en modo interactivo;
Las mfunciones son el equivalente en MATLAB a las subrutinas (procedimientos)
de los lenguajes de programacin tradicionales.
Hay distintas formas crear y/o editar un nuevo m-fichero, a continuacin explicamos cmo
se hara utilizando el editor de MATLAB (en un entorno WINDOWS), aunque podra
37
Otra forma de generar un nuevo mfichero sera siguiendo los siguientes pasos:
1. seleccionar del men principal la opcin: File / New / Mfile (vase la figura 37)
2. escribir el conjunto de instrucciones en MATLAB
3. guardar el fichero (File / Save as... ) con extensin .m.
Podemos elegir la carpeta dnde guardarlo, por defecto se guarda en la carpeta work
dentro de la carpeta de MATLAB. En general es conveniente guardar los ficheros en la
carpeta en la que se est trabajando. En caso contrario, para algunas situaciones que
emplearemos posteriormente, hace falta modificar el llamado path, que indica al sistema
operativo dnde buscar nuevos documentos.
1.
SCRIPTS
38
0.8
0.6
Con esta ejecucin del programa prueba.m se han generado dos nuevas variables, x e y. Las
cuales pueden ser listadas con el comando whos
0.4
0.2
0
>> whos
Name
-0.2
Size
Bytes
1x63
1x63
504
504
Class
Attributes
-0.4
x
y
-0.6
-0.8
-1
double
double
Otra utilidad de los scripts es como fichero de datos o parmetros. Por ejemplo, creamos un
mfichero llamado datos.m que contenga las siguientes rdenes de asignacin:
Figura 38.
datos.m
% Fichero de datos
tiempo=[0:0.2:1];
posicion=[1.3, 1.4, 1.2, 1.1, 1.0, 1.6];
media=sum(posicion)/length(tiempo);
disp(media) % Muestra en pantalla la media
Al ejecutar en MATLAB
>> datos
1.2667
Nos muestra en pantalla como resultado el valor de media y aparecen tres variables (en la
ventana Current Directory): tiempo (vector), posicion (vector) y media (escalar). Si ya
existan, se les asigna un nuevo valor. Si no, se crean nuevamente.
Figura 39.
A la hora de programar es recomendable documentar los programas de forma que se
facilite su lectura. Ese es el objeto de las dos primeras lneas de comentarios del script
races. En ellas se aclara qu es lo que se hace concretamente, adems estas lneas se
incorporan al sistema de ayuda de MATLAB, de modo que
39
2.
FUNCIONES
Cuando los parmetros de salida son ms de uno, se sitan entre corchetes y separados por
comas. Si los parmetros de entrada son ms de uno, se separan por comas. El cuerpo de la
funcin es la sintaxis que la define, y debe incluir comandos o instrucciones que asignen
valores a los parmetros de salida.
A continuacin se definir la funcin fun1(x)=x^3-2x+cosx, creando el correspondiente mfichero de nombre fun1.m.
95.2214
Ejecutamos la funcin:
>> mifuncion(0,1)
ans =
0
Figura 40.
40
>> mifuncion(3,2)
ans =
1
Observamos que hay un cierto inconveniente con que la funcin no est vectorizada.
Vamos a hacer un pequeo arreglo, vectorizamos para poder evaluar la funcin para
vectores.
mifuncion.m
function f=mifuncion(x,y)
% Definicin de una funcion con 2 variables de entrada
f=y.*(1-y)+x;
media =
1.6667
En este caso slo debemos vectorizar el producto (.*) pues la suma ya es una operacin que
se realiza de forma vectorizada. Ahora si hacemos lo siguiente:
ans =
0
Observa tambin que en esta ltima modificacin de mifuncion.m hemos aadido la orden
return con lo que se vuelve al modo interactivo. A diferencia de lo que ocurre con otros
lenguajes de programacin esta instruccin no es necesaria al final de la definicin de la
funcin. Su empleo es comn cuando se quiere salir de la funcin si se cumple algn tipo
de condicin (lo veremos en la seccin sobre estructuras de programacin).
No hay ningn problema en que una mfuncin llame a otra mfuncin, siempre que no
se entre en un ciclo recursivo, es decir, que siguiendo el rastro de llamadas de una funcin
a otra funcin regresemos a la original. La recursividad existe en MATLAB pero hay que
tratarla de una manera especial.
Ahora modifiquemos la funcin de tal forma que ahora calcule el promedio de los valores
de f.
3.
mifuncion.m
function f=mifuncion(x,y)
% Definicin de una funcion con 2 variables de entrada
f=y.*(1-y)+x;
promedio=sum(f)/length(x);
return
%opcional
En la definicin de una funcin (al igual que en cualquier lenguaje de programacin) los
nombres de las variables son mudos, es decir, se entienden y definen nicamente dentro del
fichero, sin relacin con las variables exteriores. La nica excepcin la forman las variables
declaradas como globales en ambos contextos. Para ello es preciso definir las variables
como globales con el comando global, cuya sintaxis es la siguiente:
4
41
global x y z
ans =
7
>> a
a =
4
Ahora hacemos una prueba de ejecucin. En el contexto de la consola, 'a' es una variable
global. No obstante, como sta no ha sido declarada as en la funcin fun2, ni el valor en
consola se importa a la funcin, ni el valor dentro de la funcin se exporta.
>>
>>
>>
>>
>> a=3;
>> fun2(3.5)
global a
a=[2 4];
y=3;
x=fun2(y)
Las variables globales son variables de entrada y salida simultneamente sin que aparezcan
en ninguna de las dos listas (listas de argumentos de entrada ni de salida).
Una utilidad tpica de las variables globales es poder transmitir listas largas de parmetros
de la consola a una subrutina o al revs, sin incluirlas en las definiciones de las funciones.
Las variables globales se definen y emplean nicamente en el contexto donde estn
declaradas.
Pueden estar perfectamente definidas en un grupo de mfunciones y no en la consola. En
tal caso, no podemos acceder a su valor en consola, pero s en cualquier funcin que las
declare.
x =
6
>> a
Por ejemplo, adems de la funcin fun2 anterior, construimos otra funcin, llamada glob.
a =
2
glob.m
Ahora cambiamos la funcin para que a sea variable global dentro de la funcin tambin.
function y=glob(x)
global a
y=a*x;
fun2.m
function y=fun2(x)
global a
a=4;
y=2*x;
En este caso, tras ejecutar la funcin, el valor de la variable 'a' pasa a ser a=4.
>> global a
42
sparse
speye(5)
int8, uint8,
int16, uint16,
int32, uint32
char
Uint8(magic(3))
cell
structure
user class
a.day = 12
a.color = red;
a.mat = magic(3);
Inline(sin(x))
java class
function handle
Java.awt.Frame
@humps
ans =
12
Al igual que todas las variables empleadas en una sesin estn almacenadas en la memoria
a la que se accede desde la consola (en el workspace), todas las variables globales estn
almacenadas en una memoria global a la que se puede acceder parcialmente a travs del
comando global
4.
TIPOS DE DATOS
hola
char
NUMERIC
- int8, uint8, int16, uint16, int32, uint32
- single
- double
sparse
cell
structure
- user class
function handle
5.
Ejemplo
3*10^38
3*10^300
5+6i
GESTION DE FICHEROS
Figura 41.
A continuacin se detallan los distintos tipos de datos:
Tipo de dato
single
double
Descripcin
Precisin numrica simple.
Doble precisin numrica.
what
dir
ls
43
Descripcin
abre la ventana de edicin y el fichero indicado
si el fichero no existe, se crea en blanco
(igual)
visualiza en pantalla el contenido del fichero
sin editarlo (as no se puede modificar)
(igual)
borra el mfichero indicado;
requiere que no est abierto en la ventana de
edicin
lista todos los mficheros en el directorio actual
lista todos los archivos en el directorio actual
(igual)
cd
cd path
which ejem
44
Captulo
solicita un dato que es introducido en la variable a. El dato puede ser de cualquier tipo,
sea un escalar, una matriz, etc. La introduccin del dato se interrumpe una vez se pulse
la tecla Enter, salvo que se hayan introducido puntos suspensivos antes.
>> b=input('Matriz: ')
Matriz: [3 2 1;... % no hemos terminado (puntos suspensivos)
1 -1 2]
Programacin en Matlab
b =
INTRODUCCIN
3
1
2
-1
1
2
Ahora ingresemos una variable de tipo texto (carcter), para esto tecleamos las comillas
antes de introducir una variable carcter, ya que fijamos el tipo de la variable que
pedimos a carcter ('s' hace referencia al tipo string).
>> input('Nombre:
Nombre: Juan
','s')
ans =
1.
ESTRUCTURAS DE CONTROL
Juan
ejemplo2.m
%Ejemplo sencillo de instrucciones Salida - Entrada
%Suma, diferencia, producto y divisin de dos nmeros
a=input('Ingrese 1 nmero: ');
b=input('Ingrese 2 nmero: ');
sum=a+b;
dif=a-b;
prod=a*b;
div=a/b;
fprintf('%4d %4d %6d %8.3f',sum,dif,prod,div)
En la ventana de comandos:
>> ejemplo2
Ingrese 1 nmero: 5
Ingrese 2 nmero: 6
11
-1
30 0.833
46
end
Veamos un ejemplo el m-fichero de nombre mayor.m para mostrar el mayor entre dos
nmeros:
if condicin
sentencias1
else
sentencias2
end
mayor.m
else
end
% Ejemplo de decisin
% Mayor de dos nmeros
a=input('Ingrese el primer dato: ');
b=input('Ingrese el segundo dato: ');
if a>b
resp=a;
else
resp=b;
end
disp(resp);
Ejecutando, tenemos:
>> mayor
Ingrese el primer dato: 8
Ingrese el segundo dato: 11
11
Ahora implementemos una funcin que determine si un nmero ingresado es par, impar
o negativo.
end
end
condicion.m
function condicion(n)
% Ejemplo de decisin anidada
% Par, impar, postivo, negativo
if n<0
A='n es negativo'
elseif rem(n,2)==0
A='n es par'
else
A='n es impar'
end
47
fibo.m
function a=fibo(n)
%Generar n trminos de la sucesin de Fibonacci
a=ones(1,n); % reserva ya la memoria necesaria
for i=3:n
a(i)=a(i-1)+a(i-2);
end
c. El bucle FOR
La instruccin de repeticin ms empleada es for, que se utiliza para crear bucles.
Nota, no obstante, que MATLAB permite hacer bucles implcitos gracias a la creacin
automtica de listas y a la sectorizacin de muchas operaciones. Esto permite que
muchas operaciones que en un lenguaje de programacin tradicional se realizaran con
bucles, en MATLAB se pueden hacer mucho ms eficientemente sin ellos.
La estructura de un for es:
for variable = inicio:incremento:fin
sentencias
end
Como de costumbre si no ponemos el incremento, se toma el valor por defecto, que es
la unidad. La lista
for variable = inicio:fin
se crea al inicio de la ejecucin del for y seguidamente se va recorriendo por la
variable. La lista puede ser de cualquier tipo de nmeros.
>> fibo(3)
ans =
1
1
>> fibo(12)
ans =
1
1
89
144
48
13
12
21
34
55
Veamos ahora un ejemplo en la cual utilizamos doble for, para definir una matriz de
Hilbert, de orden (m,n).
matriz.m
function A=matriz(m,n)
% Definicin de una matriz de Hilbert a medida
for i=1:m
for j=1:n
A(i,j)=1/(i+j-1);
end
end
Ejecutando:
>> matriz(4,5)
0.5000
0.3333
0.2500
0.2000
0.3333
0.2500
0.2000
0.1667
0.2500
0.2000
0.1667
0.1429
0.2000
0.1667
0.1429
0.1250
e. SWITCH CASE
d. Bucle WHILE
Esta sentencia permite ejecutar de forma repetitiva un comando o grupo de comandos
un nmero determinado de veces mientras se cumple una condicin lgica. La sintaxis
general de este bucle es:
while condicin
sentencias
end
Implemente un m-fichero que permita calcular el mayor nmero cuyo factorial no
exceda a 10100.
mientras.m
%Nmero cuyo factorial < 10^100
n=1;
while factorial(n)<1.e100
n=n+1;
end
disp(n)
otherwise
sentencias %Ejecuta si expresin no cumple
%Ningn caso
end
A continuacin se presenta un ejemplo que devuelve -1, 0 1, u otro nmero segn la
entrada.
sele.m
La orden break se utiliza para terminar la ejecucin de los bucles for y while.
Sale del bucle ms interno en el que est contenido.
function sele(n)
%Indica -1, 0, 1 u otro numero
switch n
case -1
disp('menos uno');
case 0
disp('cero');
case 1
disp('uno');
otherwise
disp('otro valor');
end
>> sele(1)
uno
>> sele(15)
otro valor
2.
>> [promedio,mediana]=estat([10,20,3,4,5,6])
SUBFUNCIONES
promedio =
8
Las funciones definidas mediante m-ficheros pueden contener cdigo para ms de una
funcin. La funcin principal en el m-fichero se denomina funcin primaria, que es
precisamente la funcin que invoca el m-fichero. Pero adicionalmente puede subfunciones
colgando de la funcin primaria y que slo son visibles para dicha funcin primaria o para
otra subfuncin dentro del mismo m-fichero. Cada subfuncin comienza con su propia
lnea de definicin de funcin.
Como ejemplo, implementemos una funcin calcule la media y la mediana como
subfunciones.
estat.m
function [prom,med]=estat(u)
%Funcin primaria
% ESTAT calcula la media y la mediana como funciones internas
n=length(u);
prom=media(u,n);
med=mediana(u,n);
function a=media(v,n)
% Calcula la media
a=sum(v)/n;
mediana =
5.5000
3.
ESTRUCTURA DE DATOS
Una estructura de datos es una agrupacin de arrays del mismo tipo dentro de un array
superior. La idea bsica de una estructura de datos (existen en muchos lenguajes de
programacin de alto nivel) es la de un fichero, donde cada ficha contiene varios registros.
El nmero de registros por ficha es fijo y el tipo de registro guardado tambin, aunque en el
caso de que un registre guarde una matriz, distintas fichas pueden contener esos registros
con distinta longitud.
Los siguientes ejemplos pueden emplearse para hacerse una idea de cmo funcionan las
estructuras de datos en MATLAB a su nivel ms bsico. La orden save puede guardar
estructuras de datos
% Subfuncion
struc.m
50
numero de elementos
ans =
2
ans =
24
ans =
26
edades =
24
26
edades =
24
Ejecutando, tenemos:
>> struc
26
calificaciones =
persona =
nombre: 'Juancho'
edad: 24
notas: [10 5.5000 7 14]
ans =
10.0000
persona =
1x2 struct array with fields:
nombre
edad
notas
2
5.5000
7.0000
10.0000
2.0000
14.0000
media =
9.1250
ans =
51
5.5000
7.0000
14.0000
4.0000
5.0000