Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Matlab PDF
Matlab PDF
Fundamentos:
» a=4/3
a=
1.3333
a=4/3;
» b=1.34*37;
» c=b-a
c=
48.2467
Para recordar órdenes previas y corregir letras dentro de una orden utilizamos
las teclas de los cursores.
Las variables pueden tener como máximo 19 caracteres ( a-z, A-Z, 0-9, _ ), y la
primera debe ser una letra.
MATLAB es sensible a las mayúsculas y minúsculas (las distingue).
Cualquier cosa que venga después del carácter % se interpreta como un
comentario
Borrado de variables:
• clear: borramos TODAS del espacio de trabajo.
• clear a b c: borramos las variables a b c
Guardar en disco el espacio de trabajo.
• File / Save Workspace As
• save :
Cargar en Memoria.
• File / Load Workspace
• load fichero
Forma de trabajo:
En MATLAB podemos trabajar bien con las instrucciones en la línea de
comandos, o bien creando unos ficheros *.m, programados en un lenguaje
interpretado propio de MATLAB.
Matrices y vectores
A=[1 2 3; 4 5 6; 7 8 9]
A=
1 2 3
4 5 6
7 8 9
B=
» C=A*B
??? Error using ==> *
Inner matrix dimensions must agree.
» B'
ans =
-1.3000
1.7321
15.5885
» C=A*B'
C=
48.9295
96.9910
145.0525
» D=A(1:2,:)
D=
1 2 3
4 5 6
Forma una matriz D con las dos primeras filas de A y todas sus columnas
» E=A(2:3,1:2)
E=
4 5
7 8
» A(:,[1 3])
ans =
1 3
4 6
7 9
» 1:10
ans =
1 2 3 4 5 6 7 8 9 10
» 1:0.2:2
ans =
Columns 1 through 7
Columns 8 through 10
» who
A C E ans c
B D a b
El comando help nos muestra las toolbox instaladas de las que podemos
solicitar ayuda. Nos indica el directorio donde se encuentran. Si escribimos
help control por ejemplo nos muestra todas las funciones disponibles en la
toolbox de control.
» help control
What's new.
Readme - New features and enhancements in this version.
Demonstrations.
ctrldemo - Introduction to the Control System Toolbox.
jetdemo - Classical design of jet transport yaw damper.
diskdemo - Digital design of hard-disk-drive controller.
milldemo - SISO and MIMO LQG control of steel rolling mill.
kalmdemo - Kalman filter design and simulation.
» help sqrt
Overloaded methods
help sym/sqrt.m
» zeros(2,3)
ans =
0 0 0
0 0 0
» ones(4,2)
ans =
1 1
1 1
1 1
1 1
» eye(5)
ans =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
» rand(10,2)
ans =
0.9501 0.6154
0.2311 0.7919
0.6068 0.9218
0.4860 0.7382
0.8913 0.1763
0.7621 0.4057
0.4565 0.9355
0.0185 0.9169
0.8214 0.4103
0.4447 0.8936
Operadores relacionales
% Más funciones
» p=[1 3 1];
» polyval(p,1)
ans =
» roots(p)
ans =
-2.6180
-0.3820
» poly([1 2])
ans =
1 -3 2
% Es el producto de (x-1)(x-2)
Otras funciones
» abs(3+4*i)
ans =
» angle(3+4*i)
ans =
0.9273
real(x) % Parte real de un numero x
imag(x) % Parte imaginaria de x
Búsqueda de elementos:
>>A=[8 2 -3; 4 -5 6];
>>[i,j]=find(A>5) % Devuelve los índices de los elementos de A mayores de
5
>>max(A) % Devuelve el máximo de cada columna
>>min(A) % Devuelve el mínimo de cada columna
Control de flujo:
MATLAB posee una serie de sentencias que nos permiten alterar el flujo
secuencial de una función. En el editor las instrucciones de los bucles aparecen
de color azul.
Bucle For
for i=1:5
ordenes
end
También pueden anidarse varios bucles.
Estructura if
if expr1
ordenes1
elseif expr2
ordenes2
else
ordenes3
end
Bucle while
while expresion
ordenes
end
break
Sentencia que nos permite saltar o salir de un bucle while o for. Si hay bucles
anidados, únicamente se abandona el bucle más interno.
Introducción de valores por teclado:
a=input('número de manzanas: ')
número de manzanas: 3
Para visualizar un determinado texto por pantalla:
disp(‘Introducir los siguientes datos :’)
fprintf(‘adios\n\n’)
Las cadenas de caracteres se deben escribir entre comitas ‘ ‘, y en el editor
aparece en rojo.
Creación de funciones
Otra forma de utilización de los archivos *.m: En el caso que deseemos realizar
cálculos donde utilizamos varias órdenes y deseamos cambiar el valor de
alguno de los argumentos, en lugar de volver a escribir cada vez estas órdenes
en la línea de comandos, MATLAB nos proporciona la capacidad de agrupar
todas las órdenes dentro de un archivo que debe cumplir las siguientes
características:
* El archivo debe crearse con un editor de tipo ASCII
* La extensión del archivo debe ser *.m (mifunción.m)
* El archivo debe encontrarse en un directorio conocido por MATLAB.
* El nombre del archivo no debe coincidir con algún comando de
MATLAB, ya que estos tienen prioridad y el programa no se ejecutará.
En cuanto a la escritura del código de la función dentro del archivo deberemos
tener en cuenta los siguientes puntos:
* La primera línea debe declarar el archivo como de tipo función, y se
deben indicar los argumentos de dicha función y sus valores devueltos.
Los valores devueltos pueden ser uno o varios, en cuyo caso deben
escribirse entre corchetes.
function [res1,res2,...]=mifuncion(arg1,arg2,...)
* La segunda línea debe ser de comentario (se denomina línea H1), y en
ella se debe dar una breve descripción de lo que hace la función. Esta
línea es examinada por la orden de búsqueda de ayuda lookfor.
%MIFUNCION esta es mi maravillosa función
Así cuando desde la línea de comandos ejecutemos la orden lookfor
obtendremos lo siguiente:
>>lookfor maravillosa
MIFUNCION esta es mi maravillosa función
* A partir de la segunda línea de comentario el resto de líneas que sean
de comentario hasta la primera línea de no comentario, serán las
mostradas cuando pidamos ayuda de la función con el comando
>>help mifuncion.
* Las variables creadas dentro de la función son locales, y se destruyen
al abandonar la función.
* Los argumentos que recibe la función son pasados por referencia a
menos que se alteren dentro de la función, en cuyo caso se pasa una
copia (para no alterar el valor).
* El número de parámetros pasados a la función está disponible en la
variable llamada nargin; esto puede tener utilidad para establecer
valores por defecto.
El número de variables de salida está disponible en la variable nargout.
Ejemplos de funciónes:
function M=inicializa(m,n)
for k=1:m
for l=1:n
M(k,l)=k+l;
end
end
%Funcion amort(M)
% Determina el coeficiente de amortiguamiento a partir del sobrepico
% Argumentos:
% M: Sobrepico
function [] = amort(M)
c=- log(M) / sqrt((log(M)^2)+pi^2)
%Funcion spico(c)
% Determina el sobrepico a partir el coeficiente de amortiguamiento
% Argumentos:
% c: coefieciente de amortiguamiento
function [] = spico(c)
Mp=exp(-pi*c/sqrt(1-c*c))
Creando dibujos
% Construimos un ejemplo:
>> t=[0:0.2:2*pi];
>> x=sin(t);
>> y=cos(t);
>> figure(1);
>> plot(t, x, '+', t, y, '*')
>> figure(2)
>> plot(t, x, 'r+', t, y, 'm*')
1 1
0.8 0.8
0.6 0.6
0.4 0.4
0.2 0.2
0 0
-0.2 -0.2
-0.4 -0.4
-0.6 -0.6
-0.8 -0.8
-1 -1
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
>>xlabel(‘string’)
>>text(x,y,’string’)
>>title(‘string’)
>>gtext % Permite poner textos en posiciones específicas
>>axis[xmin xmax ymin ymax]
>>grid % crea regilla
>>subplot(m,n,p) % crea ventana mxn y elige zona p para dibujar
>>hold on % La siguiente figura se imprime enciam de la anterior
>>polar(teta, ro) %dibuja en coordenadas polares
>>semilogx % igual que plot pero el ejex está en escala logarítmica
>>bar
>>stairs
Ejemplo
>>subplot(211),plot(1:3),subplot(212),(plot(sin(1:3));
Funciones de Control
» num=18*[1 20];
» den=conv(conv([1 15],[1 25]),[1 0.4]);
» printsys(num,den)
num/den =
18 s + 360
----------------------------
s^3 + 40.4 s^2 + 391 s + 150
» wn=2;
» damping=0.707;
» [num,den]=ord2(wn,damping);
» printsys(num,den,'s')
num/den =
1
-----------------------
s^2 + 2.828 s + 4
Construyendo sistemas
s+1
(s+3)(s+5)
» ngo=[1 1];
» dgo=conv([1 3],[1 5]);
» [ngc1,ngc2]=cloop(ngo,dgo);
s+1
(s+3)(s+5)
s+6
(s+10)
» ngo=[1 1];
» dgo=conv([1 3],[1 5]);
» nh=[1 6];
» dh=[1 10];
» [ngc2,dgc2]=feedback(ngo,dgo,nh,dh);
» printsys(ngc2,dgc2,'s')
num/den =
s^2 + 11 s + 10
-------------------------------------
s^3 + 19 s^2 + 102 s + 156
G(s)=(s+2)/)(s2+6s+10)
» num=[1 2];
» den=[1 6 10];
» rlocus(num,den)
0.8
0.6
0.4
0.2
Imag Axis
-0.2
-0.4
-0.6
-0.8
-1
-5 -4 -3 -2 -1 0 1 2
Real Axis
» [k,polos]=rlocfind(num,den)
Select a point in the graphics window
selected_point =
-3.3065 + 0.5322i
k=
0.6195
polos =
-3.3097 + 0.5335i
-3.3097 - 0.5335i
0.8
0.6
0.4
0.2
Imag Axis
-0.2
-0.4
-0.6
-0.8
-1
-5 -4 -3 -2 -1 0 1 2
Real Axis
Se puede especificar nº complejo próximo al lugar de las raices en vez de
seleccionar con el ratón.
[r,k]=rlocfind(num,den,p);
Ceros y Polos
G(s)=(3s4+3s3+5s2+4s+6)/(s5+3s4+4s3+2s2+7s+2)
» num=[3 2 5 4 6];
» den=[1 3 4 2 7 2];
» [z,p,k]=tf2zp(num,den)
z=
0.4019 + 1.1965i
0.4019 - 1.1965i
-0.7352 + 0.8455i
-0.7352 - 0.8455i
p=
-1.7680 + 1.2673i
-1.7680 - 1.2673i
0.4176 + 1.1130i
0.4176 - 1.1130i
-0.2991
k=
» z=[0; 0; 0; -1];
» p=[-1+i -1-i -2 -3.15+2.63*i -3.15-2.63*i];
» k=2;
» [num,den]=zp2tf(z,p',k)
num =
0 2 2 0 0 0
den =
Respuesta temporal
Escalón
» grid on
» step(num,den)
Step Response
From: U(1)
0.15
0.1
0.05
Amplitude
To: Y(1)
-0.05
-0.1
0 0.5 1 1.5 2 2.5 3 3.5
Time (sec.)
» step(num,den,0:0.1:10)
» [y,x,t]=step(num,den,0:0.1:10);
» plot(t,y);
Impulso:
» impulse(num,den)
Entradas arbitrarias
» y=lsim(num,den,u,t);
» plot(t,u,t,y)
1.5
0.5
-0.5
0 2 4 6 8 10 12 14 16 18 20
function [] = paso(num,den)
[numexp,denexp]=cloop(num,den)
step(numexp,denexp)
pause
valorfinal=polyval(numexp,0)/polyval(denexp,0)
[y,x,t]=step(numexp,denexp);
[Y,kexp]=max(y);
tiempopico=t(kexp)
sobrepaso=100*(Y-valorfinal)/valorfinal
n=1;
while y(n)<0.1*valorfinal, n=n+1; end
m=1;
while y(m)<0.9*valorfinal, m=m+1; end
tiempo_subida=t(m)-t(n)
l=length(t);
while (y(l)>0.98*valorfinal)&(y(l) < 1.02*valorfinal)
l=l-1;
end
tiempo_establecimiento=t(l)
» paso(num,den)
numexp =
0 0 1
denexp =
1 1 2
valorfinal =
0.5000
tiempopico =
2.4294
sobrepaso =
30.4117
tiempo_subida =
0.8834
tiempo_establecimiento =
7.7300
Bode Diagrams
From: U(1)
30
20
Phase (deg); Magnitude (dB)
10
-10
-100
To: Y(1)
-200
-300
-400
10-1 100 101 102
Frequency (rad/sec)
» subplot(211),nyquist(num,den)
» z=[-2 -2+5*i -2-5*i];
» p=[-1 -5 -7 -1+7*i -1-7*i];
» k=30;
» subplot(211),nyquist(num,den)
» subplot(212),axis([-360 0 -40 30]);
» nichols(num,den)
» ngrid
Nyquist Diagrams
From: U(1)
20
Imaginary Axis
10
To: Y(1)
0
-10
-20
-8 -6 -4 -2 0 2 4 6 8
Real Axis
Nichols Charts
From: U(1)
30
Open-Loop Gain (dB)
20
To: Y(1)
10
-10
-400 -350 -300 -250 -200 -150 -100 -50 0
Obteniendo información
» num=10*[1 1];
» den=conv([1 -1+5*i],[1 -1-5*i]);
» bode(num,den)
» [mag,phase,w]=bode(num,den);
» [Mp,k]=max(mag)
Mp =
5.0767
k=
29
» wp=w(k)
wp =
5.1784
» n=1;
» while 20*log10(mag(n))>=-3,n=n+1;end
» anchobanda=w(n)
anchobanda =
0.1000
» [Gm,Pm,Wcg,Wcp]=margin(num,den)
Gm =
0.2000
Pm =
73.7398
Wcg =
5.2915
Wcp =
12.0000
Bode Diagrams
10
Phase (deg); Magnitude (dB)
-10
-20
300
200
100
-100
-200
10-1 100 101 102
Frequency (rad/sec)
Ejemplo función:
%Funcion mibode(num,den,d1,d2)
% Dibuja diagrama de bode en un ranfo de frecuencias
function [] = mibode(num,den,d1,d2)
w=logspace(d1,d2,d2-d1*100);
[mag,fase,w]=bode(num,den,w);
semilogx(w,20*log10(mag));
ylabel('Ganancia dB');
xlabel('Frecuencia (rad/seg)');
grid
axis tight
figure
semilogx(w,fase);
ylabel('Fase en grados');
xlabel('Frecuencia (rad/seg)');
grid
» mibode(num,den,-1,2)
» num=1;
» den=[1 1 1];
» sys=tf(num,den)
Transfer function:
1
---------------
s^2 + s + 1
» sys1=zpk(z,p,k)
Zero/pole/gain:
29 (s+2) (s^2 + 4s + 29)
---------------------------------
(s+1) (s+5) (s+7) (s^2 + 2s + 50)
2 bloques en serie
» sys*sys1
Zero/pole/gain:
29 (s+2) (s^2 + 4s + 29)
-----------------------------------------------
(s+1) (s+5) (s+7) (s^2 + s + 1) (s^2 + 2s + 50)
Zero/pole/gain:
29 (s+2) (s^2 + 4s + 29)
-----------------------------------------------
(s+1) (s+5) (s+7) (s^2 + s + 1) (s^2 + 2s + 50)
» feedback(sys1,sys)
Zero/pole/gain:
29 (s+2) (s^2 + s + 1) (s^2 + 4s + 29)
---------------------------------------------------------------------------
(s+6.81) (s+5.292) (s+1.334) (s^2 + 0.5767s + 1.434) (s^2 + 1.988s + 49.79)
% Compensacion en adelanto
% Formato: adelanto(num,den,tipo)
% tipo: 'alfa' Red adelanto alfa min
% 'vertical' Red adelanto polo en vertical
% 'compen' Red de adelanto por compensación
% 'pd' P
function [numct,denct] = adelanto (num,den,tipo)
% Polos Dominantes
s1=-capa*wn+wn*sqrt(1-capa*capa)*i
ang=angle(polyval(num,s1)/polyval(den,s1))*180/pi
if ang<0
printf('No necesita compensar\n');
exit(1);
else
cang=180-ang
end
n=1;
echo on
% Red adelanto alfa min
echo off
if cang > 60
pause % Dos controladores en cascada
n=2;
cang=cang/2;
cang
end
theta=180-angle(s1)*180/pi
gamma=0.5*(180-theta-cang)
zc=sin(gamma*pi/180)*wn/sin((180-theta-gamma)*pi/180);
pc=sin((gamma+cang)*pi/180)*wn/sin((180-theta-gamma-cang)*pi/180);
numc=[1 zc];
denc=[1 pc];
kc=abs(polyval(den,s1))*abs(polyval(denc,s1))^n/((abs(polyval(num,s1))
*abs(polyval(numc,s1))^n));
pause
if(n==2)
kc=sqrt(kc)
printsys(numc,denc,'s'); printsys(numc,denc,'s');
else
kc=kc
printsys(numc,denc,'s');
end
end
if cang > 60
pause % Dos controladores en cascada
n=2;
cang=cang/2;
cang
end
numc=[1 -zc];
angnum=angle(polyval([1 -zc],s1))*180/pi;
zp=-real(s1)+imag(s1)/tan((angnum-cang)*pi/180);
denc=[1 zp];
kc=abs(polyval(den,s1))*abs(polyval(denc,s1))^n/((abs(polyval(num,s1))
*abs(polyval(numc,s1))^n));
kc=abs(kc);
if(n==2)
kc=sqrt(kc)
printsys(numc,denc,'s'); printsys(numc,denc,'s');
else
kc=kc
printsys(numc,denc,'s');
end
end
%% Fin compensador de cancelación
if cang > 60
pause % Dos controladores en cascada
n=2;
cang=cang/2;
cang
end
zc=-real(s1)
numc=[1 zc];
angnum=angle(polyval([1 zc],s1))*180/pi;
zp=-real(s1)+imag(s1)/tan((angnum-cang)*pi/180);
denc=[1 zp];
kc=abs(polyval(den,s1))*abs(polyval(denc,s1))^n/((abs(polyval(num,s1))
*abs(polyval(numc,s1))^n));
kc=abs(kc);
if(n==2)
kc=sqrt(kc)
printsys(numc,denc,'s'); printsys(numc,denc,'s');
else
kc=kc
printsys(numc,denc,'s');
end
end
%% Fin compensador en la vertical
if tipo(1) == 'p'
echo on
% Compensador PD
echo off
zc=-real(s1)+imag(s1)/tan(cang*pi/180);
numc=[1 zc]
denc=[1];
kc=polyval(den,s1)/((polyval(numc,s1)*polyval(num,s1)));
kc=abs(kc)
% printsys(numc,[],'s');
end
%% Comprobación
if n==1
[numt,dent]=cloop(kc*conv(num,numc),conv(den,denc));
elseif n==2
[numt,dent]=cloop(kc*kc*conv(conv(num,numc),numc),conv(conv(den,denc),
denc));
end
roots(dent)
% Preparo argumentos
if(n==2)
kc=sqrt(kc)
printsys(numc,denc,'s'); printsys(numc,denc,'s');
numct=kc*conv(numc,numc);
denct=conv(denc,denc);
else
numct=kc*numc;
denct=denc;
end
» num=4;
» den=conv([1 0],[1 2]);
» sys=tf(num,den);
» rltool(sys)
1
s(s+1)
num=1;
den=[1 1 0];
[numc,denc]=cloop(num,den);
hold off
step(numc,denc);
pause
Ts=0.5;
t=0:0.5:10;
[numd,dend]=c2dm(num,den,Ts,'zoh');
[numdc,dendc]=cloop(numd,dend);
hold on
dstep(numdc,dendc,t);
Ts=0.1;
t=0:0.1:10;
[numd,dend]=c2dm(num,den,Ts,'zoh');
[numdc,dendc]=cloop(numd,dend);
dstep(numdc,dendc,t);
Ejercicio: Dibujar el lugar geométrico de las raices para Ts=0.5s, T=1s, T=2s.
Determinar el valor crítico de k y localizar los polos de lazo cerrado en los tres
casos.
1
s(s+1)
13.93z-11.4077
G(z)=------------------------
z-0.15962
function [m]=control(e)
m(1)=13.93;
for i=2:length(e)
m(i)=0.1562*m(i-1)+13.93*e(i)-11.4077*e(i-1);
end;
num=1; % Planta
den=[1 1 0];
capa=0.5; % Especificaciones
wn=4.5345;
Ts=0.2; % Periodo de muestreo
% Polo dominante
s1=-capa*wn+wn*sqrt(1-capa*capa)*i;
numc=[1 -zc];
ang=angle(polyval(num,s1)/polyval(den,s1))*180/pi;
if ang<0 % Contribucion angular Compensador
cang=ang+180;
else
cang=180-ang;
end
angnum=angle(polyval([1 -zc],s1))*180/pi;
zp=-real(s1)+imag(s1)/tan((angnum-cang)*pi/180);
denc=[1 zp];
kc=abs(polyval(den,s1))*abs(polyval(denc,s1))/((abs(polyval(num,s1))*a
bs(polyval(numc,s1))));
fprintf('Controlador continuo\n');
printsys(kc*numc,denc);
[numcc,dencc]=cloop(kc*conv(num,numc),conv(den,denc));
step(numcc,dencc,0:0.05:2);
pause
% controlador continuo con mantenedor a entrada
num1=1;
den1=conv(den,[Ts/2 1]);
numc=[1 -zc];
ang=angle(polyval(num1,s1)/polyval(den1,s1))*180/pi;
if ang<0 % Contribucion angular Compensador
cang=ang+180;
else
cang=180-ang;
end
angnum=angle(polyval([1 -zc],s1))*180/pi;
zp=-real(s1)+imag(s1)/tan((angnum-cang)*pi/180);
denc=[1 zp];
kc=abs(polyval(den1,s1))*abs(polyval(denc,s1))/((abs(polyval(num1,s1))
*abs(polyval(numc,s1))));
fprintf('Controlador continuo con mantenedor a la entrada\n');
printsys(kc*numc,denc);
%% Discretizamos
[numcd,dencd]=c2dm(kc*numc,denc,Ts,'matched');
% Calculo G(z)
[numd,dend]=c2dm(num,den,Ts,'zoh');
printsys(numd,dend,'z');
% Lazo cerrado
[numdt,dendt]=cloop(conv(numd,numcd),conv(dend,dencd));
hold on
dstep(numdt,dendt,0:Ts:2);
pause
%% Calculo en digital directamente
ndc=[1 -zdc];
ang=angle(polyval(numd,z1)/polyval(dend,z1))*180/pi
if ang<0 % Contribucion angular Compensador
cang=ang+180;
else
cang=180-ang;
end
angnum=angle(polyval([1 -zdc],z1))*180/pi;
zdp=-real(z1)+imag(z1)/tan((angnum-cang)*pi/180);
ddc=[1 zdp];
kdc=abs(polyval(ddc,z1))*abs(polyval(dend,z1))/((abs(polyval(ndc,z1))*
abs(polyval(numd,z1))));
[numdt2,dendt2]=cloop(kdc*conv(ndc,numd),conv(ddc,dend));
dstep(numdt2,dendt2,0:Ts:2);
hold off
%% Ejemplo diseño controladores
%% Planta G(s)=exp(-2s)/s+1
%% Controlador difital PI Gd(z)=Kp+Ki (z/z-1)=Kd z-zz/(z-1)
%% Datos
num=1; % Planta
den=[1 1];
capa=0.5; % Especificaciones
n=10; % muestras por oscilación amortiguada
Ts=1;
% Polo dominante
z1=exp((-2*pi*capa/(sqrt(1-capa^2)*n) + i*2*pi/n))
% Calculo G(z)
[numd,dend]=c2dm(num,den,Ts,'zoh');
dend=conv(dend,[1 0 0]); % incluyo retraso 2 segundos
ang=angle(polyval(numd,z1)/polyval(conv(dend,ddc),z1))*180/pi
if ang<0 % Contribucion angular Compensador
cang=ang+180;
else
cang=180-ang;
end
zz=-real(z1)+imag(z1)/tan(cang*pi/180);
ndc=[1 zz];
kdc=abs(polyval(ddc,z1))*abs(polyval(dend,z1))/((abs(polyval(ndc,z1))*
abs(polyval(numd,z1))));
[numdt2,dendt2]=cloop(kdc*conv(ndc,numd),conv(ddc,dend));
roots(dendt2)
% Respuesta escalón
figure(1);
dstep(numdt2,dendt2,0:Ts:40);
kv=polyval((1/Ts)*kdc*conv(ndc,numd),1) /polyval(dend,1);
ess=1/kv
%respuesta a rampa
figure(2);
t=0:Ts:30;
u=t;
plot(t,u);
[Y]=dlsim(numdt2,dendt2,u);
hold on
stairs(t,Y);
title('Respuesta entrada escalón');
hold off
Espacio de estado
A x= λ x
A=[0 1; -1 0];
» eig(A)
ans =
0 + 1.0000i
0 - 1.0000i
X=
D=
-1.0000 0 0
0 -2.0000 0
0 0 -3.0000
Forma de jordan
» A=[0 1 0; 0 0 1; 1 -3 3];
» [V,J]=jordan(A)
V=
1 -1 1
1 0 0
1 1 0
J=
1 1 0
0 1 1
0 0 1
y(s)/u(s)=num/den=C(sI-A)-1B+D
» num=1;
» den=[1 1 1];
» [A,B,C,D]=tf2ss(num,den)
A=
-1 -1
1 0
B=
1
0
C=
0 1
D=
» A=[0 1; -2 -3];
» B=[1 0; 0 1];
» D=[0 0];
» C=[1 0];
» [num1,den1]=ss2tf(A,B,C,D,1)
num1 =
0 1 3
den1 =
1 3 2
» [num2,den2]=ss2tf(A,B,C,D,2)
num2 =
0 0 1
den2 =
1 3 2
» sys=ss(A,B,C,D)
a=
x1 x2
x1 -1 -1
x2 1 0
b=
u1
x1 1
x2 0
c=
x1 x2
y1 0 1
d=
u1
y1 0
» A=[0 1; -2 3];
» B=[1 1]';
» Ts=0.1; %Periodo de muestreo
» [G,H]=c2d(A,B,Ts)
G=
0.9889 0.1162
-0.2325 1.3376
H=
0.1052
0.1052
A=[-3 1 0 0; 0 0 -2 0; -4 0 0 1; 0 0 -3 0];
B=[0 2; 1 0; 0 3; 1 -3];
C=[1 0 0 0; 0 0 1 0];
D=[0 0; 0 1];
% Calculo autovalores
fprintf('Autovalores :\n');
eig(A)
[S,J]=jordan(A);
A1=J;
B1=inv(S)*B;
C1=C*S;
D1=D;
printsys(A1,B1,C1,D1);