Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PROGRAMACIÓN DE
MATLAB
2010
Dante Pinto Jeria
2
Dante Pinto Jeria
CAPÍTULO I
PRIMEROS PASOS CON MATLAB
1.1 INTRODUCCIÓN.-
El nombre del programa Matlab viene de Matrix Laboratory (Laboratorio de Matrices),
para Matlab todos los objetos son considerados como matrices.
Este programa es una herramienta de cálculo, fundamentalmente, numérico. Aunque
también puede realizar cálculos simbólicos.
Donde se presentan:
3
Dante Pinto Jeria
Se debe quitar la marca de Use system colors, luego en Text se selecciona el color blanco y
en Background. Luego se hace clic en Apply y luego en OK.
ans =
3420
>> 2+3
ans =
Si es que no se quisiera mostrar los resultados, se debe poner un punto y coma al final de la
línea.
>> 78/3;
>>
El resultado es almacenado internamente, pero no se lo muestra por pantalla. Esto es muy
útil cuando no queremos que se muestren resultados intermedios, o que se llene la pantalla
con números que son irrelevantes.
4
Dante Pinto Jeria
ans =
0.4286
ans =
0.428571428571429
El resultado tiene ahora 15 decimales.
ans =
39/40
5
Dante Pinto Jeria
1.2.4 Ayuda.-
Se puede obtener ayuda sobre un comando o una función tecleando help seguido del
nombre del comando sobre el cual se desea la ayuda. Por ejemplo, si es que se quisiera
conseguir ayuda sobre el comando format.
1.2.5 Variables.-
Matlab puede almacenar valores en variables, al igual que cualquier otro lenguaje de
programación, siempre y cuando el nombre de la variable no sea una palabra reservada de
Matlab. El programa discrimina entre mayúsculas y minúsculas. Para asignar un valor a una
variable simplemente se teclea:
>> x=24
x=
24
Se pueden asignar también múltiples variables en una sola línea, utilizando punto y comas
para separar las mismas.
>> y=34;z=24;g=21;
>>
Para ver las variables que se encuentran en el libro de trabajo actual se puede utilizar el
comando who
>> who
a ans g x y z
6
Dante Pinto Jeria
g 1x1 8 double
x 1x1 8 double
y 1x1 8 double
z 1x1 8 double
regresa el nombre de la variable, su tamaño y el tipo de datos que almacena
Para abrir el espacio de trabajo, guardado con anterioridad, se utiliza File luego Open
7
Dante Pinto Jeria
CAPÍTULO II
MANEJO DE MATRICES
2.1 INTRODUCCIÓN.-
Una matriz es un arreglo rectangular de elementos. Un caso particular de matriz es un
vector, cuando tiene una sola dimensión. Puede haber vectores fila o vectores columna.
Una forma de introducir una matriz, en Matlab, es utilizando corchetes y dentro de ellos las
filas separadas por ; (punto y coma) y las columnas separadas por espacios.
a=
1 2 3
4 5 6
7 8 9
>> b=[-1:.5:1;-1:.5:1]
b=
-1.0000 -0.5000 0 0.5000 1.0000
-1.0000 -0.5000 0 0.5000 1.0000
También se puede modificar un elemento de una matriz mediante los índices de la siguiente
manera
>> b(2,1)=8
b=
-1.0000 -0.5000 0 0.5000 1.0000
8.0000 -0.5000 0 0.5000 1.0000
También se puede acceder a un elemento de una matriz mediante un solo índice que se
constituye en una referencia continua.
8
Dante Pinto Jeria
>> b(4)=15
b=
-1.0000 -0.5000 0 0.5000 1.0000
8.0000 15.0000 0 0.5000 1.0000
Matlab tiene incorporada una función de generación de cuadrados mágicos, que no son otra
cosa que matrices cuadradas, que tienen la propiedad de que la suma de cada fila y cada
columna, asimismo que la suma de las diagonales dan un mismo número.
Así por ejemplo:
>> magic(4)
ans =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
Estos cuadrados mágicos tienen siglos de antigüedad, un ejemplo muy conocido de ellos
aparece en el grabado del alemán Alberto Durero llamado Melancolía I, el cual se lo puede
ver también en Matlab, tecleando:
>> load durer;image(X);colormap(map);axis image
9
Dante Pinto Jeria
En esta imagen aparece un cuadrado mágico en la esquina superior derecha. Para ver el
detalle del mismo se puede teclear:
>> load detail;colormap(hot);image(X)
Que es la misma matriz mágica que presenta Matlab, pero con las columnas centrales
intercambiadas, esto lo hizo Durero, para que aparezca en la parte inferior la fecha en la que
se realizó el grabado 1514.
10
Dante Pinto Jeria
De la matriz
>> a=magic(4)
a=
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
borrar la cuarta fila.
>> a(4,:)=[]
a=
16 2 3 13
5 11 10 8
9 7 6 12
Los dos puntos indican todo, lo que quiere decir que se hace referencia a toda la fila o a
toda la columna.
>> a=magic(5)
a=
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
11
Dante Pinto Jeria
>> a(3,6)=8
a=
17 24 1 8 15 0
23 5 7 14 16 0
4 6 13 20 22 8
10 12 19 21 3 0
11 18 25 2 9 0
Como se puede apreciar, los elementos faltantes son llenados con ceros.
12
Dante Pinto Jeria
Para sumar los elementos de la diagonal secundaria se utiliza el comando fliplr, que cambia
de izquierda a derecha las filas de una matriz.
>> sum(diag(fliplr(a)))
ans =
34
13
Dante Pinto Jeria
a=
1 2 3 4
5 6 7 8
9 10 11 12
a una matriz 6*2, se procede:
>> reshape(a,6,2)
ans =
1 3
5 7
9 11
2 4
6 8
10 12
ans =
1 2 1 2 1 2
2 3 2 3 2 3
1 2 1 2 1 2
2 3 2 3 2 3
14
Dante Pinto Jeria
ans =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
C(m*p)=A(m*n)*B(n*p)
15
Dante Pinto Jeria
>> a
a=
1 2 3
4 5 6
>> b
b=
7 8
9 10
11 12
>> a*b
ans =
58 64
139 154
A-1*A=A*A-1=I
Calcular la inversa de la siguiente matriz y comprobar el resultado.
>> a=magic(5)
a=
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> b=inv(a)
b=
-0.0049 0.0512 -0.0354 0.0012 0.0034
0.0431 -0.0373 -0.0046 0.0127 0.0015
-0.0303 0.0031 0.0031 0.0031 0.0364
0.0047 -0.0065 0.0108 0.0435 -0.0370
0.0028 0.0050 0.0415 -0.0450 0.0111
16
Dante Pinto Jeria
>> b*a
ans =
1.0000 -0.0000 0 -0.0000 0.0000
0.0000 1.0000 0 0.0000 0.0000
0 0.0000 1.0000 0.0000 0.0000
0.0000 0.0000 -0.0000 1.0000 0.0000
0.0000 0.0000 0.0000 0.0000 1.0000
>> det(a)
ans =
-360
>> rref(magic(3))
ans =
1 0 0
0 1 0
0 0 1
>> rank(magic(3))
ans =
3
>> min(magic(4))
ans =
4 2 3 1
18
Dante Pinto Jeria
>> min(min(magic(4)))
ans =
1
>> rand(2,3)
ans =
0.3816 0.7952 0.4898
0.7655 0.1869 0.4456
>> randn(3,4)
ans =
0.6277 -0.8637 -1.1135 -0.7697
1.0933 0.0774 -0.0068 0.3714
1.1093 -1.2141 1.5326 -0.2256
AX=B
Para resolver un sistema de ecuaciones lineales se pueden utilizar dos métodos.
1) X= A-1 B
2) X=A\B
Así, por ejemplo, resolver el sistema
19
Dante Pinto Jeria
x1-4 x2 + x3=10
3x1+3x2- 2x3=20
x1+6x2+3x3=30
de las tres formas, para ello primero se guardan los coeficientes n las variables A y B
>> A=[1 -4 1;3 3 -2;1 6 3];B=[10;20;30];
Primera forma
>> X=inv(A)*B
X=
9
1
5
Segunda forma
>> X=A\B
X=
9.0000
1.0000
5.0000
20
Dante Pinto Jeria
También funciona con potencias, así por ejemplo, con la misma matriz a anterior
>> a.^2
ans =
1 4 9
16 25 36
49 64 81
Y=
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
Dante Pinto Jeria
22
Dante Pinto Jeria
Ahora si es que queremos importar a la variable b los datos de la hoja2 del archivo amgia
de Excel, anteriormente guardado, se procede:
>> b=xlsread('c:\magia.xlsx','Hoja2','C3:G7')
b=
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
Ejemplo2.2: Dada una matriz mágica de 5*5 sumar todos los elementos de las columnas
impares.
23
Dante Pinto Jeria
>> a=magic(5);
>> sum(sum(a(1:2:end,:)))
ans =
195
>> [m ind]=min(a(:,1:2:end))
m=
3 2 10
ind =
2 3 4
>> mean(a(3:3:end,:)')'
ans =
24
Dante Pinto Jeria
62.4444
50.7778
52.0000
>> find(a==max(max(a)))
ans =
50
25
Dante Pinto Jeria
CAPÍTULO III
GRÁFICOS
3.1 INTRODUCCIÓN.-
Matlab tiene muchas rutinas de alto nivel para gráficas. En Matlab las variables
independientes no son generadas de manera automática, sino que el usuario debe
generarlas.
Los gráficos que genera Matlab pueden ser clasificados como en dos y tres dimensiones.
Si se desea mantener un gráfico anterior y sobreponer un gráfico posterior, se debe tecleat
el comando
>> hold on;
Se mantienen los gráficos anteriores, hasta que se teclea
>>hold off;
Los colores y tipos de línea vienen dados según las siguientes tablas:
y amarillo
m magenta
c cyan
r rojo
g verde
b azul
w blanco
k negro
- Continua
-- Línea cortada
-. Línea y punto
* Estrellas
. Puntitos
s Cuadrados
26
Dante Pinto Jeria
o círculos
: Punteado
x Marca
+ Mas
^ Triángulo hacia arriba
v Triángulo hacia abajo
> Triángulo a la derecha
< Triángulo a la izquierda
d Diamante
p Pentagrama
h Hexagrama
Ejemplo3.1:
>> x=0:pi/100:3*pi;y=sin(x);
>> plot(x,y,'k-','LineWidth',2);
0.8
0.6
0.4
0.2
-0.2
-0.4
-0.6
-0.8
-1
0 1 2 3 4 5 6 7 8 9 10
Ejemplo3.2:
>> plot(x,y,'r:','LineWidth',3);
27
Dante Pinto Jeria
0.8
0.6
0.4
0.2
-0.2
-0.4
-0.6
-0.8
-1
0 1 2 3 4 5 6 7 8 9 10
Ejemplo3.3: Graficar el seno y el coseno, con una rejilla, con un título, una leyenda, una
etiqueta en x y una en y
>> x=0:pi/100:3*pi;y1=sin(x);y2=cos(x);
>> plot(x,y1,'r-',x,y2,'b--');legend('seno','coseno');title('Dos gráficas, de 0 a 2\pi');xlabel('Eje
X');ylabel('Eje Y');grid on;
Dos gráficas, de 0 a 2
1
seno
0.8 coseno
0.6
0.4
0.2
Eje Y
-0.2
-0.4
-0.6
-0.8
-1
0 1 2 3 4 5 6 7 8 9 10
Eje X
Para que aparezca el símbolo π se pone dentro de las comillas simples ’…\pi’
28
Dante Pinto Jeria
Ejemplo3.4: Graficar el logo que aparece en la carátula de este texto, cuya ecuación es
r=sin(5t/8), con 0≤ t ≤ 16 π
29
Dante Pinto Jeria
-1
-2
-3
-4 -3 -2 -1 0 1 2 3 4
Ejemplo3.6: Realizar un gráfico, modificando los ejes y las marcas de los ejes.
> 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'})
1
0.8
0.6
0.4
0.2
-0.2
-0.4
-0.6
-0.8
-1
-pi -pi/2 0 pi/2 pi
30
Dante Pinto Jeria
plotyy(X1,Y1,X2,Y2)
plotyy(X1,Y1,X2,Y2,función)
plotyy(X1,Y1,X2,Y2,'funcion1','funcion2')
[AX,H1,H2] = plotyy(...)
Ejemplo3.7:
x = 0:0.01:20;
y1 = 200*exp(-0.05*x).*sin(x);
y2 = 0.8*exp(-0.5*x).*sin(10*x);
[AX,H1,H2] = plotyy(x,y1,x,y2,'plot');
200 0.8
150 0.6
100 0.4
50 0.2
0 0
-50 -0.2
-100 -0.4
-150 -0.6
-200 -0.8
0 2 4 6 8 10 12 14 16 18 20
150 0.6
100 0.4
50 0.2
0 0
-50 -0.2
-100 -0.4
-150 -0.6
-200 -0.8
31
0 2 4 6 8 10 12 14 16 18 20
Dante Pinto Jeria
8
10
6
10
4
10
2
10
0
10
0 1 2 3 4 5 6 7 8 9 10
32
Dante Pinto Jeria
Ejemplo3.10:
x = logspace(-1,2);
loglog(x,exp(x),'r-s','LineWidth',1);
grid on;
50
10
40
10
30
10
20
10
10
10
0
10
-1 0 1 2
10 10 10 10
33
Dante Pinto Jeria
90
1
120 60
0.8
0.6
150 30
0.4
0.2
180 0
210 330
240 300
270
3.2.6 Función compass.-
La función brújula, grafica flechas saliendo del origen. La sintaxis es:
compass(U,V)
compass(Z)
compass(...,EspecLinea)
compass(manejador_ejes,...)
h = compass(...)
Ejemplo3.12: Realizar la gráfica tipo brújula de los valores propios de una matriz.
>> Z = eig(randn(20,20));
compass(Z);set(gcf,'Color',[1,1,1])
90
5
120 60
4
3
150 30
2
180 0
210 330
240 300
270
34
Dante Pinto Jeria
Ejemplo3.13:
>>line([0 1],[0 1],'Color','r','LineWidth',4)
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
Ejemplo3.14:
>> x = -4:0.1:4;
y = randn(10000,1);
hist(y,x)
35
Dante Pinto Jeria
450
400
350
300
250
200
150
100
50
0
-5 -4 -3 -2 -1 0 1 2 3 4 5
Ejemplo3.15: Cambiar el color del anterior gráfico de manera que sea rojo con bordes
blancos.
>> h = findobj(gca,'Type','patch');
set(h,'FaceColor','r','EdgeColor','w')
450
400
350
300
250
200
150
100
50
0
-5 -4 -3 -2 -1 0 1 2 3 4 5
36
Dante Pinto Jeria
bar(manejador_ejes,...)
barh(manejador_ejes,...)
h = bar(...)
barh(...)
h = barh(...)
Ejemplo3.16:
>> x = -2.9:0.2:2.9;
bar(x,exp(-x.*x),'r')
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
-3 -2 -1 0 1 2 3
Ejemplo3.17:
>> x = -2.9:0.2:2.9;
barh(x,exp(-x.*x),'b')
3
-1
-2
-3
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
37
Dante Pinto Jeria
Ejemplo3.18:
>> pie([1 2 1.4 4 1.5 3])
8%
23%
16%
11% 12%
31%
22%
33%
28%
6%
38
Dante Pinto Jeria
Ejemplo3.20:
>> xdato = [2 2 0 2 5;
2 8 2 4 5;
8 8 2 4 8];
ydato = [4 4 4 2 0;
8 4 6 2 2;
4 0 4 0 0];
zdato = ones(3,5);
patch(xdato,ydato,zdato,'w')
8
0
0 1 2 3 4 5 6 7 8
39
Dante Pinto Jeria
5 6 1; ...
7 8 9; ...
11 10 4 ];
>> p=patch('Faces',caras,'Vertices',verts,'FaceColor','r');
8
0
0 1 2 3 4 5 6 7 8
40
Dante Pinto Jeria
10
0
0 1 2 3 4 5 6 7 8 9 10
indices =
1 2 4
2 5 4
2 3 5
4 5 6
1 4 7
4 8 7
4 6 8
7 8 9
1 7 10
7 11 10
7 9 11
10 11 12
12 11 13
11 14 13
11 9 14
13 14 15
coorde =
2.0000 5.0000
1.0000 2.5000
0 0
3.5000 3.0000
2.5000 0.5000
5.0000 1.0000
5.0000 5.0000
6.5000 3.0000
8.0000 5.0000
3.5000 7.0000
6.5000 7.0000
5.0000 9.0000
41
Dante Pinto Jeria
7.5000 9.5000
9.0000 7.5000
10.0000 10.0000
0.35
0.3
0.25
Amplitude
0.2
0.15
0.1
0.05
0
0 1 2 3 4 5 6 7 8
Time (sec)
42
Dante Pinto Jeria
Impulse Response
0.3
0.25
0.2
0.15
Amplitude 0.1
0.05
-0.05
0 1 2 3 4 5 6 7 8
Time (sec)
0.5
Imaginary Axis
-0.5
-1
-1.5
-2.5 -2 -1.5 -1 -0.5 0 0.5
Real Axis
43
Dante Pinto Jeria
subplot(m,n,P)
subplot(h)
subplot('Position',[left bottom width height])
subplot(..., prop1, value1, prop2, value2, ...)
h = subplot(...)
Ejemplo3.26:
>> subplot(2,2,[1 3])
subplot(2,2,2)
subplot(2,2,4)
1 1
0.9 0.8
0.6
0.8
0.4
0.7
0.2
0.6
0
0 0.5 1
0.5
0.4 1
0.8
0.3
0.6
0.2
0.4
0.1 0.2
0 0
0 0.5 1 0 0.5 1
Ejemplo3.27:
>> subplot(2,2,1);subplot(2,2,2);subplot(2,2,3);subplot(2,2,4)
44
Dante Pinto Jeria
Ejemplo3.28:
>> [X,Y] = meshgrid(-2:.1:2, -2:.1:2);
Z = X .* exp(-X.^2 - Y.^2);
mesh(X,Y,Z)
0.5
-0.5
2
1 2
0 1
0
-1 -1
-2 -2
Se puede hacer una animación en tiempo real de la gráfica, haciendo clic en el ícono
45
Dante Pinto Jeria
Y luego con las flechas del teclado o con el ratón y presionando el botón izquierdo, se hace
rotar la figura.
0.5
-0.5
2
1 2
0 1
0
-1 -1
-2 -2
0.5
-0.5
2
1 2
0 1
0
-1 -1
-2 -2
46
Dante Pinto Jeria
Ejemplo3.31:
>> [X,Y] = meshgrid(-2:.1:2, -2:.1:2);
Z = X .* exp(-X.^2 - Y.^2);
surf(X,Y,Z)
0.5
-0.5
2
1 2
0 1
0
-1 -1
-2 -2
47
Dante Pinto Jeria
40
30
20
10
0
1
0.5 1
0 0.5
0
-0.5
-0.5
-1 -1
Ejemplo3.33:
>> [x,y] = meshgrid(-3:1/8:3);
z = peaks(x,y);
surfl(x,y,z);
shading interp
colormap(gray);
axis([-3 3 -3 3 -8 8])
48
Dante Pinto Jeria
-5
2
3
2
0 1
0
-2 -1
-2
-3
Ejemplo3.34:
>>[X,Y] = meshgrid([-2:.25:2]);
Z = X.*exp(-X.^2-Y.^2);
contour(X,Y,Z,30)
2
1.5
0.5
-0.5
-1
-1.5
-2
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
49
Dante Pinto Jeria
Ejemplo3.35:
>> [X,Y] = meshgrid([-2:.25:2]);Z = X.*exp(-X.^2-Y.^2);
[C,h] = contour(interp2(Z,4));
text_handle = clabel(C,h);
set(text_handle,'BackgroundColor',[1 1 .6],'Edgecolor',[.7 .7 .7])
250
0
-0.1 0.1
200
2
-0
0.
.2
150
-0 .2
-0 .1
-0 .3
0.2
0.1
0.3
.4
0.4
0.1
-0.1
-0
0.3
-0 .3
-0 .1
0.1
0
100
0.2
-0 .2
50 -0.1 0.1
0
1.5
0.5
-0.5
-1
-1.5
-2
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
50
Dante Pinto Jeria
Ejemplo3.37:
>> [X,Y] = meshgrid([-2:.25:2]);
Z = X.*exp(-X.^2-Y.^2);
contour3(X,Y,Z,30)
surface(X,Y,Z,'EdgeColor',[.8 .8 .8],'FaceColor','none')
grid off
view(-15,25)
colormap cool
0.5
-0.5
2
1.5 2
0 0.5 1
-2 -1.5 -1 -0.5
-2
51
Dante Pinto Jeria
CAPÍTULO IV
52
Dante Pinto Jeria
53
Dante Pinto Jeria
La convolución es
>>c = conv(u,v)
c=
10 40 100 160 170 120
[q,r] = deconv(c,u)
q=
10 20 30
r=
0 0 0 0 0 0
54
Dante Pinto Jeria
1 -4 2 4 1
55
Dante Pinto Jeria
1.3320
p=
1.5737
-1.1644
-0.4093
k=
-1.2500
Debe hacerse notar que el resultado está normalizado para el coeficiente líder en el
denominador.
56
Dante Pinto Jeria
num/den =
50
-----------------------
s^3 + 7 s^2 + 20 s + 50
57
Dante Pinto Jeria
parallel
sys = parallel(sys1,sys2)
sys = parallel(sys1,sys2,inp1,inp2,out1,out2)
sys = parallel(sys1,sys2,'nombre')
58
Dante Pinto Jeria
B=
1
0
0
C=
0 1 0
D=
0
Ejemplo4.20: Obtenga la función de transferencia del sistema definido por las siguientes
ecuaciones en el espacio de estados:
59
Dante Pinto Jeria
>> D=[0];
>> [num,den]=ss2tf(A,B,C,D)
num =
0 0.0000 25.0000 5.0000
den =
1.0000 5.0000 25.0000 5.0000
>> printsys(num,den)
num/den =
8.8818e-015 s^2 + 25 s + 5
--------------------------
s^3 + 5 s^2 + 25 s + 5
60
Dante Pinto Jeria
Ejemplo4.22:
>> syms x;limit('sin(x)/x',x,0)
ans =
1
diff(expr) deriva una expresión simbólica expr con respecto a su variable libre (sin
ningún valor asignado) determinada por symvar.
Ejemplo4.23:
>> syms x;
>> diff('sin(x)^3',x)
ans =
3*cos(x)*sin(x)^2
int(expr) realiza la integral indefinida de expr con respecto a su variable simbólica definida
por symvar.
61
Dante Pinto Jeria
Ejemplo4.24: Integrar
>> sym x;
>> int((6*x+1)*sin(sqrt(3*x^2+x-1))/sqrt(3*x^2+x-1))
ans =
(-2)*cos((3*x^2 + x - 1)^(1/2))
ans =
3*x^2 + 2
62
Dante Pinto Jeria
Ejemplo4.27:
>>syms x y;
>>expand(cos(x+y))
ans =
cos(x)*cos(y) - sin(x)*sin(y)
Ejemplo4.28:
>>syms a b;
>>expand(exp((a+b)^2))
ans =
exp(2*a*b)*exp(a^2)*exp(b^2)
Ejemplo4.29:
>>syms t;
>>expand([sin(2*t), cos(2*t)])
ans =
[ 2*cos(t)*sin(t), cos(t)^2 - sin(t)^2]
Ejemplo4.31:
>>syms x y;
>>factor(x^3-y^3)
ans =
(x - y)*(x^2 + x*y + y^2)
Ejemplo4.32:
>>syms a b;
>>factor([a^2 - b^2, a^3 + b^3])
ans =
[ (a - b)*(a + b), (a + b)*(a^2 - a*b + b^2)]
63
Dante Pinto Jeria
d=
5
Ejemplo4.34:
>>syms x y;
>>[n,d] = numden(x/y + y/x)
n=
x^2 + y^2
d=
x*y
Ejemplo4.35:
>>syms a b
>>A = [a, 1/b]
[n,d] = numden(A)
A=
[a, 1/b]
n=
[a, 1]
d=
[1, b]
Ejemplo4.37:
>>syms a b c;
>>simplify(exp(c*log(sqrt(a+b))))
ans =
(a + b)^(c/2)
Ejemplo4.38:
>>S = [(x^2 + 5*x + 6)/(x + 2), sqrt(16)];
64
Dante Pinto Jeria
>>R = simplify(S)
R=
[ x + 3, 4]
>>g = cos(3*acos(x));
>>g = simple(g)
g=
4*x^3 - 3*x
Ejemplo4.41:
>>syms a b;
>>subs(cos(a) + sin(b), {a, b}, {sym('alpha'), 2})
ans =
sin(2) + cos(alpha)
Ejemplo4.42:
Suponiendo que a = 980 y C2 = 3 existen en el workspace.
The statement
65
Dante Pinto Jeria
a = 980; C2 = 3; subs(y)
ans =
3/exp(980*t)
Ejemplo4.44:
>>dsolve('Dx = -a*x')
ans =
C2/exp(a*t)
Ejemplo4.45:
>>dsolve('Df = f + sin(t)')
ans =
C4*exp(t) - sin(t)/2 - cos(t)/2
Ejemplo4.46:
>>dsolve('(Dy)^2 + y^2 = 1','s')
ans =
1
-1
cosh(C7 + s*i)
cosh(C11 - s*i)
Ejemplo4.47:
>>dsolve('Dy = a*y', 'y(0) = b')
ans =
b*exp(a*t)
Ejemplo4.48:
>>dsolve('D2y = -a^2*y', 'y(0) = 1', 'Dy(pi/a) = 0')
ans =
(1/exp(a*t*i))/2 + exp(a*t*i)/2
Ejemplo4.49:
>>z = dsolve('Dx = y', 'Dy = -x')
66
Dante Pinto Jeria
z=
x: [1x1 sym]
y: [1x1 sym]
z.x
ans =
C20*cos(t) + C19*sin(t)
z.y
ans =
C19*cos(t) - C20*sin(t)
ans =
1/(s^2 + 1)
Ejemplo4.51:
>> syms x t w;laplace(cos(t*w),x)
ans =
x/(w^2 + x^2)
>> ilaplace(g)
ans =
exp(t)
67
Dante Pinto Jeria
Ejemplo4.53:
>> ilaplace(t^(-sym(5/2)),x)
ans =
(4*x^(3/2))/(3*pi^(1/2))
ans =
pi*(2*heaviside(-w) - 1)*i
ans =
1/(2*pi*(- 3 + x*i)^2)
ans =
z/(z - 2)
Ejemplo4.57:
68
Dante Pinto Jeria
>> ztrans(sin(k*n),w)
ans =
(w*sin(k))/(w^2 - 2*cos(k)*w + 1)
ans =
2^n
Ejemplo4.59:
>> iztrans(exp(x/z),z,k)
ans =
x^k/factorial(k)
4.2.19 MuPad.-
Matlab 2010, tiene incorporada una caja de herramientas (toolbox), que contiene el
programa de álgebra computarizada (CAS) MuPad.
Para cargar esta caja de herramientas se debe teclear
>>mupad
Este programa permite realizar diferentes cálculos simbólicos y gráficas muy elaboradas.
Tiene su propia sintaxis independiente de Matlab.
69
Dante Pinto Jeria
70
Dante Pinto Jeria
Asignar = :=
Supresión de la salida ; :
Inf infinity
pi PI
i I
NaN undefined
fix trunc
log ln
asin arcsin
71
Dante Pinto Jeria
acos arccos
atan arctan
asinh arcsinh
acosh arccosh
atanh arctanh
acsc arccsc
asec arcsec
acot arccot
acsch arccsch
asech arcsech
acoth arccoth
besselj besselJ
bessely besselY
besseli besselI
besselk besselK
lambertw lambertW
sinint Si
cosint Ci
eulergamma EULER
conj conjugate
72
Dante Pinto Jeria
catalan CATALAN
laplace transform::laplace
ilaplace transform::invlaplace
ztrans transform::ztrans
iztrans transform::invztrans
73
Dante Pinto Jeria
MATLABvar = getVar(notebook_manejador,'variable');
Por ejemplo, si nm es el manejador del notebook, z es la variable en el notebook de MuPad,
y u es la variable en el espacio de trabajo de Matlab, se introduce.
u = getVar(nb,'z')
74
Dante Pinto Jeria
CAPÍTULO V
PROGRAMACIÓN EN CÓDIGO M
5.1 INTRODUCCIÓN.-
El lenguaje de programación de Matlab se llama código M. Este lenguaje tiene las mismas
estructuras básicas de programación de cualquier otro lenguaje, es decir, bucles y
condicionales, entradas y salidas, manejo de funciones y procedimientos.
Otra forma es teclear en la línea de comandos del espacio de trabajo de Matlab, la palabra
edit seguida del nombre que se le quiere asignar al programa.
>>edit primero
Luego aparece un mensaje que indica que el archivo no existe y pregunta si es que
debemos crearlo, a lo que se responde que sí.
75
Dante Pinto Jeria
>> primero
Hola Mundo Cruel
>>
Para editar un programa se debe teclear lo mismos que s hizo para crearlo, es decir, edit
seguido del nombre del programa.
76
Dante Pinto Jeria
Ejemplo5.1:
>> a=input('Introduzca el valor de la hipotenusa: ')
a=
5
a=
0.8889
Ejemplo5.3:
>> respuesta = input('¿Quiere mas? S/N : ', 's');
>> respuesta
respuesta =
s
c=
9
La función sprintf da formato a una cadena de texto, donde se encuentren los indicadores
%i reemplaza el correspondiente valor, en este caso a y b. Esta función es muy similar a la
77
Dante Pinto Jeria
función printf del lenguaje C. Los caracteres de conversión, que se pueden usar y que
siguen después del símbolo %, son d, i, o, u, x, X, f, e, E, g, G, c, s.
if expresion1
declaraciones1
elseif expresion2
declaraciones2
else
declaraciones3
end
Ejemplo5.6: Escribir un programa que indique si un año es bisiesto. Para esto se debe
considerar lo siguiente: un año es bisiesto si es múltiplo de 4 excepto que también sea
múltiplo de 100 y lo anterior queda descartado si también es múltiplo de 400. Así, por
ejemplo el año 2000 es múltiplo de 4 por tanto en primera instancia decimos que es
bisiesto, pero como también es múltiplo de 100 decimos que no es bisiesto, pero en
definitiva al ver que es múltiplo de 400 concluimos que si es bisiesto.
La tabla de verdad es la siguiente, donde a, b y c indican la multiplicidad respecto 4,100 y
400.
a b c (a^~b)v(a^c)
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 0
1 0 0 1
78
Dante Pinto Jeria
1 0 1 1
1 1 0 0
1 1 1 1
%_Programa bisiesto
%_Dante Pinto Jeria, P-10-X-2010
Este programa utiliza la función mod, que devuelve el residuo de la división de los dos
argumentos, así por ejemplo: mod(5,2) da como resultado 1.
1
0.9000
0.8000
0.7000
0.6000
0.5000
0.4000
0.3000
0.2000
0.1000
0
79
Dante Pinto Jeria
Ejemplo5.8: Realizar un programa que dibuje líneas entrecruzadas. Usar dos bucles for
anidados.
%_Programa figura, para dibujar líneas entrecruzadas
%_Dante Pinto Jeria, P-6-X-2010
clc;
alpha=input('Introduzca un numero de 3 a 30:');
if alpha<3 || alpha>30
alpha=15;
end
alpha=360/alpha;
for i=0:alpha:360
for j=i:alpha:360
x1=cosd(i);
y1=sind(i);
x2=cosd(j);
y2=sind(j);
line([x1 x2],[y1 y2],'Color',[1,0,0]);
end
end
axis equal;axis off;set(gcf,'Color',[1,1,1]);
80
Dante Pinto Jeria
Ejemplo5.9: Realizar un programa que muestre una película con los cambios que se le
hacen a una superficie en 3D.
%_Programa peli, realiza una animación de los cambios que se hacen
%_a una gráfica
%_Dante Pinto Jeria
%_P-11-10-2010
Z = peaks; surf(Z);
axis tight
set(gca,'nextplot','replacechildren');
% Graba la película
for j = 1:20
surf(sin(2*pi*j/20)*Z,Z)
F(j) = getframe;
end
% Reproduce la película 10 veces
movie(F,10)
-5
40
30 40
20 30
20
10 10
-5
40
30 40
20 30
20
10 10
81
Dante Pinto Jeria
k=0;
for n=1:3:10
n10=10*n;
x=linspace(-2,2,n10);
y=x./(1+x.^2);
k=k+1;
subplot(2,2,k)
plot(x,y,'k')
title(sprintf('Gráfico %g. Trazado con n = %g puntos.',k,n10))
xlabel('x')
ylabel('y')
axis([-2,2,-.8,.8])
grid
pause(3);
end
0.5 0.5
0 0
y
-0.5 -0.5
-2 -1 0 1 2 -2 -1 0 1 2
x x
Gráfico 3. Trazado con n = 70 puntos. Gráfico 4. Trazado con n = 100 puntos.
0.5 0.5
0 0
y
-0.5 -0.5
-2 -1 0 1 2 -2 -1 0 1 2
x x
82
Dante Pinto Jeria
Ejemplo5.11: Realizar un programa que forme una matriz mágica impar. Las matrices
mágicas son aquellas que suman el mismo número en filas, columnas y diagonales. Utilizar
el algoritmo de Loubere.
clc;
n=input('Introduzca el numero impar, del tamaño de la matriz: ');
n = floor(real(double(n(1))));
if mod(n,2)==0
disp('EL NUMERO INTRODUCIDO NO ES IMPAR');
else
M=rand(n)*0;c=1;I=n;J=ceil(n/2);M(I,J)=c;
while c<n^2,
c=c+1;I=I+1;J=J-1;
if I>n && J<1
I=I-2;J=J+1;
end
if I>n && J>0
I=1;
end
if I<=n && J==0
J=n;
end
if M(I,J)~=0
I=I-2;J=J+1;
end
M(I,J)=c;
end
disp(sprintf('La matriz mágica de tamaño %g, es:',n));
disp(M);
end
La función floor da como resultado el redondeo hacia abajo, así por ejemplo, floor(5/2) da
como resultado 2. La función ceil da como resultado el redondeo hacia arriba, así por
ejemplo ceil(5/2) da como resultado 3.
83
Dante Pinto Jeria
9 2 25 18 11
3 21 19 12 10
22 20 13 6 4
16 14 7 5 23
15 8 1 24 17
Ejemplo5.12:
>> indicador= 'Bueno';
switch lower(indicador)
case {'bueno','regular'}
disp('Es aceptable')
case 'malo'
disp('Es malo')
case 'excelente'
disp('Es excelente')
otherwise
disp('No sé qué es lo que sea')
end
Es aceptable
84
Dante Pinto Jeria
Las funciones son procedimientos que recogen datos de entrada, los procesan y devuelven
un resultado. La estructura de una función es la siguiente:
declaraciones
end
Las variables dentro de la función, son variables locales, es decir, solo tienen valides dentro
de la función, fuera de ella no valen nada. Si es que se desearía que las variables tengan
valor fuera de la función, se las debe declarar como variables globales en el entorno en el
que se llama a la función.
Para ello se utiliza el comando global seguido del nombre de la variable.
ans =
0
Ejemplo5.14: Para el anterior ejemplo, definir la variable salida como global, para
recuperar su valor.
>> global salida;bisies(2012);
>> salida
salida =
1
Ejemplo5.15: Realizar una función que dados como datos el número de filas de una matriz
y el índice relativo, devuelva la fila y la columna a la que pertenece ese índice.
85
Dante Pinto Jeria
Así en la anterior matriz si se le da como datos 2 (que es el número de filas y 10 (el índice)
la función devolverá fila=2 y columna=5.
>> [f,c]=indice(2,10)
f=
2
c=
5
Ejemplo5.16: Realizar una función que se llame bueno y permita la entrada de un valor y
realice xvalor: si el número de entradas es menor que 4,3,2 asigne valores por omisión; si el
llamado a la función se lo realiza de la forma bueno() dibuje la gráfica; si el llamado se lo
realiza mediante la forma [x0,y0]=bueno() saque los valores.
Aquí se utilizan las variables nargin y nargout, que indican el número de entradas y
salidas de la función respectivamente.
86
Dante Pinto Jeria
La variable nargin indica con cuantos argumentos se llama a la función, así por ejemplo, si
se llama bueno(2,3) nargin dará como resultado 2, bueno(1,1,2) dará como resultado 3.
La variable nargout indica con cuantos argumentos se invoca la salida, así por ejemplo,
[x0,y0]=bueno(1), dará como resultado 2; mientras que bueno(1) dará como resultado 0.
>> bueno(2)
4
3.5
2.5
1.5
0.5
0
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
>> [x0,y0]=bueno(2,-2,2,1)
x0 =
-2 -1 0 1 2
y0 =
4 1 0 1 4
87
Dante Pinto Jeria
CAPÍTULO VI
6.1 INTRODUCCIÓN.-
Matlab permite la creación de interfaces gráficas. De manera muy similar a lenguajes como
Visual Basic, Visual C, etc.
Par entrar al entorno de diseño de las GUI se pueden seguir cualquiera de los siguientes
pasos:
a) Ir a File, New y GUI.
88
Dante Pinto Jeria
89
Dante Pinto Jeria
En el cuadro de diálogo que aparece, se quita la marca del campo Add comments for newly
generated callback functions, luego se presiona Apply y OK. Esto evita que en el entorno de
programación de los GUI, se generen comentarios de manera automática. Estos
comentarios muchas veces confunden y llenan toda la pantalla.
Haciendo clic con el botón derecho del ratón, sobre el componente, se despliega el cuadro
de diálogo siguiente:
90
Dante Pinto Jeria
El campo Property Inspector da salida al cuadro de diálogo de las propiedades del control.
Aquí se pueden realizar los cambios que se crean convenientes, como el color, el mensaje
desplegado, etc.
91
Dante Pinto Jeria
También haciendo clic con el botón derecho del ratón sobre el componente se da acceso a
View Callbacks.
92
Dante Pinto Jeria
Debajo del la línea resaltada se puede añadir el código correspondiente, que estará asociado
a este componente.
Funcionamiento de la GUI.
Un programa GUI tiene dos partes: un archivo .m y un archivo .fig. El archivo .m es el que
contiene el código fuente y el .fig tiene la parte gráfica. Para ejecutar un programa GUI
simplemente se teclea, en el espacio de trabajo de Matlab, el nombre del mismo. Así, por
ejemplo, si se ha guardado con el nombre de prueba.fig, simplemente se escribe:
>>prueba ENTER.
handles.output = hObject;
guidata(hObject, handles);
Esta instrucción debe estar siempre al final de cualquier subrutina. Garantiza que cualquier cambio
de propiedades y valores de variables quede almacenado.
Si, por ejemplo, dentro de una subrutina una operación dio como resultado una variable
valor, para utilizar esta variable desde el programa o desde otra subrutina se la debe guardar
de la siguiente manera:
93
Dante Pinto Jeria
handles.valor=valor;
guidata(hObject,handles);
La primera línea añade la variable valor a la estructura de datos de la aplicación apuntada por
handles y la segunda línea guarda el valor.
numero=get(handles.input1_editText,'String');
set(handles.text1,'String',numero)
Ejemplo6.1: Crear una interfaz gráfica de usuario, que permita la entrada de una función de
x y realice la integral simbólica de esa función.
Primero se crea la interfaz gráfica con dos Static Text, un Edit Text y dos Push Button. Se
cambian los colores y nombres mediante el Property Inspector, para que quede de la
siguiente manera:
94
Dante Pinto Jeria
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Outputs from this function are returned to the command line.
function varargout = integra_OutputFcn(hObject, eventdata, handles)
95
Dante Pinto Jeria
varargout{1} = handles.output;
Lo que está resaltado con amarillo es el código que se añade, el resto es generado
automáticamente por el programa.
La ejecución de este programa da como resultado:
96
Dante Pinto Jeria
Ejemplo6.2: Realizar una GUI que simule el juego “craps” de lanzamiento de dos dados.
Las reglas del juego son las siguientes:
Un jugador gana si saca 7 u 11 en el primer lanzamiento de un par de dados, pierde si saca
2,3 ó 12 en el primer lanzamiento. Sin embargo, si en el primer lanzamiento saca un
4,5,6,8,9 ó 10 continúa tirando el dado hasta obtener el número que obtuvo en el primer
lanzamiento o hasta obtener un 7. Si obtiene su primer número antes de obtener un 7, gana;
en otro caso pierde. Calcular la probabilidad que el jugador gana en dos o menos
lanzamientos.
Lo primero es diseñar la interfaz gráfica, para ello se insertan en el área de diseño cuatro
Static Text, dos Push Button. Y se cambian los colores y los textos como se muestra a
continuación.
97
Dante Pinto Jeria
Luego, debajo del código generado automáticamente por el programa, se añade el código
fuente asociado a cada uno de los Push Button, para ello usamos los View Callbacks
if indi1==1
a=fix(rand(1,1)*6)+1;
b=fix(rand(1,1)*6)+1;
c=num2str(a);
set(handles.primero,'String',c);
d=num2str(b);
set(handles.segundo,'String',d);
fin=0;
set(handles.informe,'String','');
indi = indi+1;
if indi==1
if a+b==2 || a+b==3 || a+b==12
set(handles.informe,'String','PERDISTE');
fin=1;
indi1=0;
end
if a+b==7 || a+b==11
set(handles.informe,'String','GANASTE');
fin=1;
indi1=0;
end
if fin == 0
suma=a+b;
98
Dante Pinto Jeria
end
else
if a+b==7
set(handles.informe,'String','PERDISTE');
indi1=0;
else
if a+b==suma
set(handles.informe,'String','GANASTE');
indi1=0;
end
end
end
end
guidata(hObject,handles);
99
Dante Pinto Jeria
CAPÍTULO VII
USO DE SIMULINK
7.1 INTRODUCCIÓN.-
Simulink es un programa añadido a Matlab. Sirve para programar visualmente un sistema
dinámico (el cual está gobernado por ecuaciones diferenciales) y observar los resultados.
Simulink está conformado por bibliotecas de bloques de construcción, estos bloques se
conectan unos con otros a través de líneas, las cuales transmiten la información. Simulink,
es en esencia un tipo de lenguaje orientado a bloques.
La principal ventaja es la disponibilidad de plantillas de construcción de bloques, las cuales
evitan la necesidad de escribir código para pequeños procesos matemáticos.
Para entrar al entorno de Simulink se pueden realizar cualquiera de los siguientes pasos:
100
Dante Pinto Jeria
Se arrastran estos bloques a la ventana de diseño y luego se conectan con líneas. Una
manera rápida de conectar bloques es marcar el bloque de partida y luego presionando la
tecla control hacer clic con el botón izquierdo en el bloque destino.
10
1
Dante Pinto Jeria
Luego se guarda este pequeño modelo, con algún nombre, en este caso IntegradorBasico. Y
102
Dante Pinto Jeria
Como se puede apreciar, el coseno está desplazado hacia arriba en una unidad. Para
corregir esto se debe hacer doble clic en el ícono del integrador en la ventana de diseño.
Aquí se debe cambiar el campo Initial condition, y cambiarlo de cero a -1, para desplazar
hacia abajo el resultado. Luego presionar Apply y OK.
Haciendo correr de nuevo el simulador y presionando la autoescala, nuevamente, resulta:
10
3
Dante Pinto Jeria
Se puede utilizar los controladores PID para gobernar (controlar) brazos robóticos como el
mostrado en la figura
104
Dante Pinto Jeria
Una pelota es puesta sobre una viga y puede rodar a través de ella. El brazo robótico hace
que la viga suba o baje un ángulo α. El brazo está unido a un mecanismo circular que puede
rotar un ángulo θ. Cuando se va cambiando el ángulo α, la gravedad ocasiona que la pelota
vaya rodando por la viga. Por tanto se necesita diseñar un controlador que regule la
posición de la pelota, de manera que esta no se salga de la viga.
Para esta aplicación se asume que la pelota rueda sin deslizamiento y que la fricción entre
la viga y la pelota es despreciable. Las constantes y variables para este ejemplo están
definidas como sigue:
10
5
Dante Pinto Jeria
La ecuación que relaciona el ángulo de la viga, con el ángulo del brazo es aproximada por:
Reagrupando, se halla la función de transferencia del ángulo θ(s) del brazo a la posición de
la pelota R(s).
106
Dante Pinto Jeria
a) Función de transferencia
m = 0.111;
R = 0.015;
g = -9.8;
L = 1.0;
d = 0.03;
J = 9.99e-6;
K = (m*g*d)/(L*(J/R^2+m));
num = [-K];
den = [1 0 0];
printsys(num,den)
10
7
Dante Pinto Jeria
0.21
----------
s^2
De esta gráfica se ve claramente que el sistema es inestable en lazo abierto, causando que la
pelota ruede fuera de la viga. Por tanto se requiere de algún método para controlar la
posición de la pelota.
b) En el espacio de estados.
H = -m*g/(J/(R^2)+m);
A=[0 1 0 0
0 0 H 0
0 0 0 1
108
Dante Pinto Jeria
0 0 0 0];
B=[0;0;0;1];
C=[1 0 0 0];
D=[0];
La respuesta a una entrada paso de 0.25m puede ser vista mediante:
step(A,B*.25,C,D)
Para modificar las propiedades de los bloques, se hace doble clic en el bloque y en la
ventana que aparece se hacen los cambios deseados.
110
Dante Pinto Jeria
Se modificó el sumador, para que los signos sean + - (mas y menos) en el campo List of
signs
También se modificó el bus, para que tenga tres entradas, en el campo Number of inputs
11
1
Dante Pinto Jeria
112
Dante Pinto Jeria
Los parámetros por omisión son: P=1; I=1; D=0. Para el sintonizado del PID se presiona
Tune, y aparece, después de un momento de cálculos
Aquí aparece el sistema ya estable, pero con un tiempo de 2 segundos, si es que nos parece
muy grande, lo modificamos con la barra deslizable. En este caso lo modificamos para un
segundo.
11
3
Dante Pinto Jeria
114
Dante Pinto Jeria
Si es que se quiere sacar los resultados al espacio de trabajo de Matlab, se debe añadir en la
ventana de diseño de Simulink, un bloque que saque datos al workspace . Ese bloque es To
workspace y se encuentra en Sinks.
11
5
Dante Pinto Jeria
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
La variable dependiente es una estructura, para acceder a los valores se pone:
salida.signals.values
La variable independiente se encuentra almacenada en tout.
116