Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Este grfico est bastante pobre y se puede mejorar bastante. Por cierto, una
de las cosas que menos me gusta, es que las cifras significativas cambian en
los ejes.
figure(1)
hold on
box on
plot(t,y,'-','LineWidth',2,'Color',[1 0 0])
axis ([0 4 0 1.5])
xlabel('x')
ylabel('y')
title('y = 1.2 \cdot sin (2\pi /12 \cdot (t + \phi))')
set(gca,'XTick',[0:1:4])
set(gca,'XTickLabel',{'0','1','2','3','4'})
set(gca,'YTick',[0:0.5:1.5])
set(gca,'YTickLabel',{'0.0','0.5','1.0','1.5'})
set(gca,'Fontsize',10)
set(gca,'XGrid','on','YGrid','on')
legend({'\phi = 0'},2,'FontSize',10,'EdgeColor',[1 1 1]);
Otras posibilidades que tenemos, son el rea bajo la curva, barras para cada
punto, o una curva en forma de escalera:
t = [0.5:0.5:3.5]';
y = 1.2*sin(2*pi*t/12);
figure(1)
area(t,y,'FaceColor',[0.17 0.50 0.34]);
figure(1)
bar(t,y,'FaceColor',[0.7 0.8 1]);
figure(1)
stairs(t,y,'Color',[0.6 0.2 0],'LineWidth',2);
Por ltimo, muestro dos ejemplo de cmo representar varias curvas distintas,
usando un bucle for. Fjate, cmo defino la leyenda y los distintos colores para
cada curva.
phi = [0 1 2 3 4 5 6];
n = length(phi);
colores = [1 0 0; 1 0.6 0.2; 0.75 0.75 0; 0.17 0.51 0.34; 0.04 0.52 0.78; 0 0.75
0.75; 0.48 0.06 0.89];
t = [0:0.01:4]';
q = cell(1,n);
figure(2)
hold on
box on
for i=1:1:n
y = 1.2*sin(2*pi*(t+phi(i))/12);
plot(t,y,'-','LineWidth',2,'Color',colores(i,:))
q(i) = {['\phi = ' mat2str(phi(i))]};
end
axis([0 4 -1.5 1.5])
xlabel('x')
ylabel('y')
title('y = 1.2 \cdot sin (2\pi /12 \cdot (t + \phi))')
set(gca,'XTick',[0:1:4])
set(gca,'XTickLabel',{'0','1','2','3','4'})
set(gca,'YTick',[-1.5:0.5:1.5])
set(gca,'YTickLabel',{'-1.5','-1.0','-0.5','0.0','0.5','1.0','1.5'})
set(gca,'Fontsize',10)
set(gca,'XGrid','on','YGrid','on')
legend(q,3,'FontSize',10)
phi = [0:0.5:7.5];
phitext = {'0.0','0.5','1.0','1.5','2.0','2.5',...
'3.0','3.5','4.0','4.5','5.0','5.5',...
'6.0','6.5','7.0','7.5'}
n = length(phi);
colores = [1 0 0; 1 0.6 0.2; 0.75 0.75 0; 0.17 0.51 0.34; 0.04 0.52 0.78; 0 0.75
0.75; 0.48 0.06 0.89];
t = [0:0.01:4]';
nt = length(t);
q = cell(1,n);
figure(1)
set(0,'DefaultAxesColorOrder',colores, 'DefaultAxesLineStyleOrder','-|--|:')
hold on
box on
y = zeros(nt,n);
for i=1:1:n
y(:,i) = 1.2*sin(2*pi*(t+phi(i))/8);
q(i) = {['\phi = ' cell2mat(phitext(i))]};
end
plot(t,y)
axis([0 4 -1.5 1.5])
xlabel('x')
ylabel('y')
title('y = 1.2 \cdot sin (2\pi /8 \cdot (t + \phi))')
set(gca,'XTick',[0:1:4])
set(gca,'XTickLabel',{'0','1','2','3','4'})
set(gca,'YTick',[-1.5:0.5:1.5])
set(gca,'YTickLabel',{'-1.5','-1.0','-0.5','0.0','0.5','1.0','1.5'})
set(gca,'Fontsize',10)
legend(q,'Location','EastOutside','FontSize',10)
- En este segundo caso, defino la secuencia de colores y tipo de curvas, que
van a ir teniendo las curvas. Luego, calculo una matriz con todas las curvas.
- En la leyenda, los valores de phi los calculo como strings, para poner
correctamente las cifras significativas.
xlim(axes1,x1lim);
ylim(axes1,y1lim);
box(axes1,'on');
hold(axes1,'all');
plot(t,y1,'Parent',axes1,'LineWidth',1);
ylabel(y1string,'Color',color1);
axes2 = axes('Parent',figure1,...
'YTick',y2ticks,'YTickLabel',y2tickslabel,...
'XTick',x1ticks,'XTickLabel',x1tickslabel,...
'ColorOrder',[color1; color2],...
'YColor',color2,...
'Color','none',...
'Fontsize',10,...
'YAxisLocation','right');
xlim(axes2,x1lim);
ylim(axes2,y2lim);
hold(axes2,'all');
plot(t,y2,'Parent',axes2,'LineWidth',1);
ylabel(y2string,'Color',color2);
xlabel(x1string);
title('sinusoidales');
Nota: El eje de las x est pintado solo en "axes2". En "axes1" puse "'XTick',[]"
para que no escribiera nada. De no hacerlo as, el eje de las x se escribira dos
veces, uno sobre el otro, y quedara un poco feo.
Cmo dibujar crculos y polgonos regulares
Para dibujar un crculo con Matlab, una posibilidad muy fcil, es hacerlo en
coordenadas polares. Es decir:
R = 1;
tita = (0:0.01:2.01*pi);
x = R*cos(tita);
y = R*sin(tita);
figure(1)
plot(x,y,'-b')
axis equal
axis([-1.5 1.5 -1.5 1.5])
set(gca,'XTick',[-1.5:0.5:1.5])
set(gca,'XTickLabel',{'-1.5','-1.0','-0.5','0.0','0.5','1.0','1.5'})
set(gca,'YTick',[-1.5:0.5:1.5])
set(gca,'YTickLabel',{'-1.5','-1.0','-0.5','0.0','0.5','1.0','1.5'})
set(gca,'Fontsize',10)
Por cierto, el valor de "tita" lo llevo hasta 2.01*pi, en vez de hasta solo 2.00*pi,
para que el crculo se cierre (y no quede un pequeito espacio en blanco).
Adems, he puesto "axis equal" para evitar que Matlab distorsione los ejes.
n = 5;
R = 1;
tita = [0:(2*pi/n):2*pi];
x = R*cos(tita);
y = R*sin(tita);
figure(1)
plot(x,y,'-b')
axis equal
axis([-1.5 1.5 -1.5 1.5])
set(gca,'XTick',[-1.5:0.5:1.5])
set(gca,'XTickLabel',{'-1.5','-1.0','-0.5','0.0','0.5','1.0','1.5'})
set(gca,'YTick',[-1.5:0.5:1.5])
set(gca,'YTickLabel',{'-1.5','-1.0','-0.5','0.0','0.5','1.0','1.5'})
set(gca,'Fontsize',10)
Para evitar que el pentgono est girado, podemos hacer que el valor de "tita"
empiece en /2:
n = 5;
R = 1;
tita = [0:(2*pi/n):2*pi]+pi/2;
x = R*cos(tita);
y = R*sin(tita);
Ahora ya es muy fcil hacer muchas figuras. Por ejemplo, una estrella de 5
puntas:
n = 5;
R = 1;
tita = [0:(4*pi/n):4*pi]+pi/2;
x = R*cos(tita);
y = R*sin(tita);
Hay que tener cuidado, porque las ecuaciones anteriores no estn definidas si
vale /4 (/2) o mltiplos. En esos casos, hay que girar la curva directamente
de la forma:
% giro de 1/4 tau (1/2 pi) radianes
x1 = -y;
y1 = x;
% giro de 2/4 tau (pi) radianes
x2 = -x;
y2 = -y;
% giro de 3/4 tau (3/2 pi) radianes
x3 = y;
y3 = -x;
figure(3)
hold on
box on
plot(x,y,'-b')
plot(x1,y1,'-m')
plot(x2,y2,'-r')
plot(x3,y3,'-k')
legend('original','girada 1/4 \tau','girada 2/4 \tau', 'girada 3/4 \tau')
box on
plot(x,y,'-','LineWidth',2,'Color',[0.5 0.05 0.9])
axis equal
axis([-1.5 1.5 -2.5 0.5])
set(gca,'XTick',[-1.5:0.5:1.5])
set(gca,'XTickLabel',{'-1.5','-1.0','-0.5','0.0','0.5','1.0','1.5'})
set(gca,'YTick',[-2.5:0.5:0.5])
set(gca,'YTickLabel',{'-2.5','-2.0','-1.5','-1.0','-0.5','0.0','0.5'})
set(gca,'Fontsize',10)
Nota: La lnea "axis equal" es importante para que Matlab no deforme el
tamao de los ejes, como suele hacer por defecto
Por ltimo, si queremos aadir los ejes, podemos hacerlo directamente as:
plot([-2 2],[0 0],'--','Color',[0.5 0.5 0.5])
plot([0 0],[-3 2],'--','Color',[0.5 0.5 0.5])
-2 < x < 2
-1 < y < 2.5
Podemos definir el punto de vista del observador con la funcin "view". Por
ejemplo:
view([1 0 0])
Tambin podemos poner un foco de luz, para que la figura se vea ms bonita
light('Position',[0,2,50]) % Posicin del foco de luz
lighting phong % Para suavizar la luz
material metal % Distintos tipos de brillo (shiny, dull, metal...)
En vez de usar el comando "surf", podemos usar otro tipo de funciones. Por
ejemplo:
f1
f2
v1
v2
v3
Primero, defino la matriz de datos, los ejes "x" e "y", y el estilo de colores:
A = [1 2 3; 4 5 6];
xticks = {'v1','v2','v3'};
yticks = {'f1','f2'};
estilo = 'copper';
Algunos estilos de colores posibles son 'default', 'copper', 'cool', 'spring',
'summer', 'autumn', 'winter'...
for(j=1:1:ny)
X = [0 1; 0 1];
Y = [ny-1 ny-1; ny ny];
X = X + (i-1);
Y = Y - (j-1);
B = ones(2,2)*A(j,i);
surface(X,Y,B);
end
end
axis([0 nx 0 ny])
colormap(estilo)
set(gca,'XTick',[0.5:1:nx])
set(gca,'XTickLabel',xticks)
set(gca,'YTick',[0.5:1:ny])
set(gca,'YTickLabel',yticks)
set(gca,'Fontsize',10)
box on
Nota: Para girar el vector de strings "yticks" 180, he usado dos veces el
comando "rot90".
alfa es un vector de tamao 3x1, formado por los coeficientes del polinomio:
y = alfa[1]x2 + alfa[2]x + alfa[3]
En este caso, alfa vale:
alfa =
-0.3143
4.0857 -0.0800
0.6864
En vez de usar "fminsearch" y tener que crear una funcin objetivo, podramos
haber usado directamente la funcion "lsqcurvefit". Pero la verdad, es que el
mtodo anterior me suele funcionar mejor.
[u,f] = lsqcurvefit(@(u,x) f01(u,x),[1,1],x,y)
donde [1 1] son los valores iniciales de u(1) y u(2), con los que la funcin
empieza a tantear. Por cierto, cuando escribimos @(u,x), hay que poner
primero el vector de parmetros a estimar, y segundo la variable
independiente.
Por ltimo, representamos tanto los puntos reales como la curva obtenida:
xx = [0:0.1:6];
yy = f01(u,xx);
figure(1)
hold on
box on
plot(xx,yy,'-','Color',[1 0.6 0.78],'LineWidth',2)
plot(x,y,'o','MarkerSize',5,'Color',[0.48 0.06 0.89],'MarkerFaceColor',[0.48 0.06
0.89])
legend({'real','estimado'},1,'EdgeColor',[1 1 1]);
axis([0 6 0 3])
set(gca,'XTick',[0:2:6])
set(gca,'YTick',[0:1:3])
set(gca,'Fontsize',10)
Nota: He usado 'EdgeColor',[1 1 1] para que la leyenda no est encerrada en
una caja. Y 'MarkerFaceColor',[0.48 0.06 0.89] para que los crculos estn
rellenos.
y' = -ky
y(0) = y0
Para lo que tenemos que estimar los parmetros "k" e "y0".
Como la funcin contiene una derivada, lo ms cmodo es definiarla usando
Simulink. Para ello, creamos el siguiente archivo "simu1.mdl" en Simulink:
function z = fobj01(tm,ym,u)
global k y0
k = u(1);
y0 = u(2);
sim('simu1.mdl');
ycal = resample(timeseries(yout,tout),tm);
ycal = ycal.data;
clc
z = sum((ym - ycal).^2);
f=
0.0309
7.3344
Por ltimo, podemos dibujar tanto los valores medidos como los estimados:
k = u(1);
y0 = u(2);
sim('simu1.mdl');
figure(1)
hold on
box on
plot(tout,yout,'-','Color',[1 0.6 0.78],'LineWidth',2)
plot(tm,ym,'o','MarkerSize',5,'Color',[0.48 0.06 0.89],'MarkerFaceColor',[0.48
0.06 0.89])
lg1 = legend({'real','estimado'},1,'EdgeColor',[1 1 1]);
axis([0 20 0 8])
set(gca,'XTick',[0:5:20])
set(gca,'YTick',[0:2:8])
set(gca,'Fontsize',10)
z = (1-x)2 + 100(y-x2)2
u=
1.0000
1.0000
f=
3.6862e-010
1.2100
f=
0.0100
g(x) <= 0
geq(x) = 0
Ax - B <= 0
Cx - D = 0
donde:
y + x -1 <= 0
ny = length(y);
[X,Y] = meshgrid(x,y);
Z = zeros(nx,ny);
for i=1:1:nx
for j=1:1:ny
Z(i,j) = f01([X(i,j),Y(i,j)]);
end
end
[u,f] = fminsearch(@(u) f01(u),[0 0]);
figure(1)
hold on
contour(X,Y,Z,[75])
plot(u(1),u(2),'+k')
set(gca,'XTick',[-2:1:2])
set(gca,'YTick',[-1:1:3])
set(gca,'Fontsize',10)
axis([-2 2 -1 3])
box on
0.3488
fs =
0.1330
Finalmente, representamos la solucin del problema en el grfico:
plot(xs(1),xs(2),'o','MarkerSize',10,'Color',[1 0 0],'LineWidth',2)
Para ello, lo nico que tenemos que hacer es modificar el archivo con las
restricciones no lineales ("frest01"), como muestro a continuacin:
function [z zz] = frest01(x)
z(1) = x(2)+0.9375*x(1).^2-0.125*x(1)-3;
z(2) = -x(2)+0.1333*x(1).^2-1.0333;
zz = x(2) - (0.08*x(1).^3+0.4*x(1).^2-0.4*x(1)-1.2)./(x(1)+2);
xs =
0.3428 -0.5493
fs =
1.3212
t1 = [0:0.1:10]';
y1 = sin(t1*2*3.1416/20);
Ahora, queremos seleccionar los datos de "y1", en otra frecuencia distinta,
definida por los instantes de tiempo dados en el vector "t2". Por ejemplo, el
siguiente:
t2 = linspace(1,9,7)';
r = [2, 3];
z1 = ['Hay ' mat2str(r(1)) ' monstruos en el armario']
Hay 2 monstruos en el armario
Nota: Los strings se crean encerrando el texto entre apstrofes: 'texto'. Con
mat2str creamos otro string. Por ltimo, fusionamos los strings con los
corchetes.
Tambin podemos salvar las variables en un fichero de texto, para poder ser
abierto fcilmente con otros programas:
save data1.txt -ascii A
1
5
9
6
7
2
Haramos:
A = importdata('data.txt')
matriz magica
8
1
3
5
4
9
6
7
2
Al cargar los datos desde Matlab, nos estara creando una estructura. Para
acceder a los datos y al texto, podramos hacer:
A = importdata('data.txt')
B = A.data
t1 = cell2mat(A.textdata)
clear A
B sera la matriz de datos, mientras t1 sera un string con la frase "matriz
magica".
Cmo salvar lo que estamos haciendo en un fichero de texto
La funcin "diary" nos permite salvar, en un fichero de texto, lo que aparezca
por pantalla. Por ejemplo, el siguiente cdigo:
diary('diario1.txt')
x=3
A = 10000;
diary of
generara un fichero de texto, llamado "diario1.txt", de la siguiente forma:
Si queremos que cada vez que se ejecute el programa, se borre lo que haba
inicialmente en el fichero de texto, habra que aadir la lnea siguiente:
delete('diario1.txt')
diary('diario1.txt')
x=3
diary of
x=i
diary of
end
Nmeros primos.
o
Nmeros complejos
o
Nmeros enteros.
o
x = [2.1,-2.1]
round(x)
nos devuelve
floor(x)
nos devuelve
ceil(x)
nos devuelve
2
2
3
-2
-3
-2
Divisiones.
o
Nmeros aleatorios.
o
rand
abierto (0,1)
rand(n1,n2)
rand(n)
rand*(b-a) + a
un solo nmero.
floor(rand*(b+1-a)+a)
un solo nmero.