Documente Academic
Documente Profesional
Documente Cultură
AGUSTIN
ESCUELA PROFESIONAL DE INGENIERIA
ELECTRONICA
S I S TEM A S DE C ONTRO L
RO BU S TO Y
A DA PTATI VO
DESARROLLO:
JULIO A. MOSAJA
AR EQUI PA, 02 DE AGOST O DEL 2012
L A B O R A TO R I O D E S I S T E M A S D E C O N T ROL AVA N Z A D O
SCRIPTFILTROS.3
%% Ejemplo de uso de identificacin estado
% Caso SISO
N= 1000; u= randn(N,1); noise= 0.1*randn(N,1);
y= filter([0,.1], [1,-0.9], u);%+ noise;
[A1,B1,C1,D1]= ssident(y,u,3)
P1= ss(A1, B1, C1, D1, 1);
yhat= lsim(P1,u);
figure; plot([y,yhat]);
Valores singulares:11.0231
Dimension de X:2
A1 =
0.4972
0.4475
0.4475
0.4028
B1 =
0.1000
0.0900
C1 =
0.5525
0.4972
D1 =
3.9458e-17
1.06061e-14
6.77544e-15
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
100
200
300
400
500
600
700
% Caso MIMO
a=[0.8,0;0,0.9]; b=[0.1,0;0,0.1]; c=[1,1]; d=0;
P= ss(a,b,c,d,1);
800
900
1000
0.582672
1.993e-14
A2 =
0.2777
0.3444
-0.1633
0.3856
-0.4776
0.4076
B2 =
0.1000
0.1000
0.0800
0.0900
0.0640
0.0810
C2 =
0.8824
0.2777
D2 =
1.0e-15 *
0.0233
-0.1712
0.3856
0.7732
1.0367
-0.1633
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
100
200
300
400
500
600
700
800
900
1000
-5
-10
-15
-20
-25
-30
-35
0.5
1.5
2.5
3
3.5
Model order
4.5
5.5
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
100
200
300
400
500
600
700
800
900
1000
0.4
0.3
0.2
0.1
-0.1
-0.2
-0.3
-0.4
10
20
30
40
50
60
70
80
90
100
figure; plot(y);
bode(Pser); % Diagrama de Bode
nyquist(Pser); % Diagrama de Nyquist
Pole-Zero Map
Impulse Response
0.2
0.8
0.15
0.4
0.2
0.1
Amplitude
0.6
0
-0.2
0.05
-0.4
-0.6
-0.8
-1
-2.5
-2
-1.5
-1
-0.5
-0.05
10
12
14
Time (seconds)
Step Response
0.7
0.08
0.07
0.6
0.06
0.5
Amplitude
0.05
0.04
0.4
0.03
0.3
0.02
0.01
0.2
0
0.1
-0.01
0
10
12
-0.02
14
10
20
30
40
50
60
70
80
90
100
Time (seconds)
Nyquist Diagram
Bode Diagram
0.5
0.3
-100
0.2
-150
Imaginary Axis
Magnitude (dB)
0.4
-50
-200
0
Phase (deg)
-90
0.1
0
-0.1
-0.2
-180
-0.3
-270
-0.4
-360
-1
10
10
10
10
-0.5
-1
-0.5
0
Real Axis
Frequency (rad/s)
%% Paso a discreto
s= tf('s');
P= 6/(s+1)/(s+3); T=0.1; % Periodo de muestreo
Pz1= c2d(P,T,'zoh'); % Por residuos
Pz2= c2d(P,T,'tustin'); % Por Tustin
Pz3= c2d(P,T,'matched'); % Polos ceros y gananias
%% Simulacin en discreto
% u -->[P]--> y, ante una entrada escaln u= 1
a1=-1.7; a2= 0.74; b1= 0.09; b0= 0.081
y1=0; y2=0; u1=0 % Valor inicial de las variables
u= 1; % Entrada escaln
for k=1:100,
y(k)= -a1*y1- a2*y2 + b0*u + b1*u1;
% Valores para el siguiente salto:
y2= y1; y1= y(k); u1= u;
end
0.5
figure; plot(y)
4.5
4
3.5
3
2.5
2
1.5
1
0.5
0
10
20
30
40
50
60
70
80
90
100
0.35
0.3
0.25
0.2
0.15
0.1
0.05
10
20
30
40
50
60
70
80
90
100
Pss =
a =
x1
x2
b =
x1
x2
x1
-3
1
x2
-2
0
u1
2
0
c =
y1
d =
y1
x1
0.5
x2
0.5
u1
0
10
0.08
0.07
0.06
0.05
0.04
0.03
0.02
0.01
0
-30
-20
-10
11
10
20
30
Impulse Response
From: u1 To: y1
0.12
0.1
Amplitude
0.08
0.06
0.04
0.02
-0.02
-10
10
20
30
40
50
60
70
80
Time (seconds)
Step Response
From: u1 To: y1
1
0.8
Amplitude
0.6
0.4
0.2
-0.2
-10
10
20
Time (seconds)
12
30
40
50
60
0.12
0.1
0.08
0.06
0.04
0.02
10
15
13
20
25
90
80
70
60
50
40
30
20
10
0
-10
-40
-30
-20
-10
10
20
30
40
700
600
500
400
300
200
100
10
20
30
40
50
14
60
70
80
90
0.5
1.5
2
frequency (rad/TimeUnit)
u1
2.5
3.5
0.5
1.5
2
frequency (rad/TimeUnit)
2.5
3.5
0.5
Bode Diagram
From: u1 To: y1
0
Magnitude (dB)
-5
-10
-15
-20
-25
-30
0
Phase (deg)
-45
-90
-135
-180
0.1
0.2
0.3
0.4
0.5
0.6
Frequency (Hz)
15
0.7
0.8
0.9
Bode Diagram
From: u1 To: y1
0
Magnitude (dB)
-5
-10
-15
-20
-25
-30
0
Phase (deg)
-45
-90
-135
-180
-4
10
-3
10
-2
-1
10
10
Frequency (rad/s)
16
10
10
-1
-2
-3
0
10
20
30
40
50
60
70
80
90
100
P =
1
-----------------------1 - 1.7 z^-1 + 0.72 z^-2
Sample time: 1 seconds
Discrete-time transfer function.
Phat =
0.001965
--------------------z^2 - 1.62 z + 0.6529
Sample time: 1 seconds
Discrete-time transfer function.
ans =
0.8636
0.7560
% Programa para identificacin por mnimos cuadrado
% Planta, entrada aleatoria y ruido:
s= tf('s'); P= 20/(s+1)/(s+2);
T= 0.1; t= 0:T:100; N= length(t);N1= floor(N/2);
% Entrada parte aleatorio y parte constante.
%u= [rand(N1,1)-0.5; ones(N-N1,1)]; noise= (rand(N,1)- 0.5)*0.05;
u= [rand(N,1)-0.5]
y= lsim(P, u, t); %+ noise;
figure; plot(t,[u,y]);
% Modelo: y(k)= -a1y(k-1)- a2y(k-2)+ b0u(k);
%Y= y(3:end); X=[y(2:end-1), y(1:end-2), u(3:end)];
Y= y(3:end); X=[y(2:end-1), y(1:end-2), ...
17
u(2:end-1), u(1:end-2)];
theta= inv(X'*X)*X'*Y; % theta= X\Y;
yhat= X*theta;
%Planta en z (no en z^(-1))
num= [0,theta(3),theta(4)]; den= [1,-theta(1),-theta(2)];
Pz= tf(num, den, T); Ps= zpk(d2c(Pz));
1.5
0.5
-0.5
-1
-1.5
10
20
30
40
50
60
70
80
90
%%
N= 1000; u= sign(randn(N,1)); e= randn(N,1)*0.1;
y= filter([0,0.1],[1,-0.9],u)+ ...
filter([1,-0.7],1,e);
Y= y(2:end); X= [y(1:end-1),u(1:end-1)];
theta= X\Y
yf= filter(ones(5,1)/5, 1, y);
uf= filter(ones(5,1)/5, 1, u);
Yf= yf(2:end); Xf= [yf(1:end-1), uf(1:end-1)];
thetaf= Xf\Yf
%%
N= 1000; u= sign(randn(N,1)); e= randn(N,1)*0.2;
y= filter([0,0.1], [1,-0.9], u)+ filter([1,0.7], 1, e);
Y= y(2:end); X= [y(1:end-1), u(1:end-1)];
theta= X\Y
% Variable instrumental
z= filter([0,theta(2)], [1,-theta(1)], u);
Z= [z(1:end-1), u(1:end-1)];
thetac= (Z'*X)\Z'*Y
%%
data= iddata(y,u,0.1);
mod= arx(data,[2,2,1]);
18
100
mod= pem(data,[2,2,1]);
%%
mod= iv4(data, [2,2,1]);
% polos, ceros y ganancia en continuo
P= d2c(zpk(mod))
% dos funciones la entrada-salida y error-salida
figure; step(P)
K= dcgain(P)
%%
% Prueba librera ARX
s= tf('s'); P= 2/(s+1)/(s+2);
t= (0:0.1:100)'; u= rand(size(t))-0.5;
y= lsim(P,u,t);
[b,a]= ARXm(y,u,[2,2,1]);
Phat= zpk(d2c(tf(b,a,0.1)))
P =
From input "u1" to output "y1":
1.0969 (s+2.003)
---------------------(s^2 + 3.257s + 2.672)
Continuous-time zero/pole/gain model.
K =
0.8221
Phat =
9.7403e-05 (s+2.04e04)
---------------------(s+1.975) (s+1.013)
Continuous-time zero/pole/gain model.
19
Step Response
From: u1 To: y1
0.9
0.8
0.7
Amplitude
0.6
0.5
0.4
0.3
0.2
0.1
0
0.5
1.5
2.5
3.5
4.5
Time (seconds)
CONTROL ROBUSTO
% ejem7_1.m CALCULO DE p(s) Y DE SUS MODELOS NOMINALES pn(s) Y pn(z)
clear all
% PARAMETROS DEL PROCESO NO LINEAL
Lo = 0.776;
JL = 3.5e-7; bL = 1e-5; Ro = 0.01;
Jm = 1.9062e-6; bm = 1.8338e-6; g = 9.81;
E = 31.0352e-3; R = 7.38; m = 0.06377;
Kact = 14.9; cc = 0.25; % Mo = 0,0.01,0.02,0.045;
K = 31.071e-3; n = 19.741; L = 4.64e-3;
B = n^2*bm +bL; Jeff = n^2*Jm +JL;
% PROCESO p(s) (EL SUBINDICE p SIGNIFICA PROCESO)
Mo = 0.045;
M = Jeff + (1/3)*m*Lo^2 + Mo*Lo^2 + (2/5)*Mo*Ro^2;
N = g*Lo*(Mo+m/2);
Ap = [0 1;-N/M -(B + n^2*K*E/R)/M];
Bp = [0;n*K*Kact/(R*M)];
Cp = [1 0]; Dp = [0];
[nump,denp]=ss2tf(Ap,Bp,Cp,Dp);
% nump(s)/denp(s) = p(s) = Kp/(s^2 + ap*s + bp)
Kp = nump(3); ap = denp(2); bp = denp(3);
% MODELO NOMINAL pn(s) (EL SUBINDICE n SIGNIFICA NOMINAL)
Mo=0.0;
M = Jeff + (1/3)*m*Lo^2 + Mo*Lo^2 + (2/5)*Mo*Ro^2;
N = g*Lo*(Mo+m/2);
An = [0 1;-N/M -(B + n^2*K*E/R)/M];
Bn = [0;n*K*Kact/(R*M)];
20
Cn = [1 0]; Dn = [0];
[numn,denn] = ss2tf(An,Bn,Cn,Dn);
% numn(s)/denn(s) = pn(s) = Kn/(s^2 + an*s + bn)
Kn = numn(3); an = denn(2); bn = denn(3);
% [Kp ap bp] = [30.4696 1.2707 14.4007]
% [Kn an bn] = [91.4375 3.8133 17.9220]
% MODELO NOMINAL DISCRETO pnz(z)
T = 0.05;
[numd,dend] = c2dm(numn,denn,T,'zoh');
% numd(s)/dend(s) = pnz(z) = (b1*z + b2)/(z^2 + a1*z + a2)
a1 = dend(2); a2 = dend(3);
b1 = numd(2); b2 = numd(3);
% [a1 b1 a2 b2] = [-1.7858 0.1070 0.8264 0.1004]
% GRAFICOS
subplot(2,1,1)
step(nump,denp)
xlabel('Tiempo en segundos')
ylabel('Respuesta del proceso')
grid
subplot(2,1,2)
step(numn,denn)
ylabel('Respuesta del modelo')
xlabel('Tiempo en segundos')
grid
print -f -deps ejem7_1
Step Response
4
3
2
1
0
8
6
4
2
0
0.5
1.5
21
2.5
22
(a)
(b)
40
30
-2
20
-4
Magnitud de M en dB
Magnitudes en dB
10
-10
-6
-8
-10
-20
-12
-30
-40
0
10
-14
10
Frecuencia angular (rad/s)
10
-16
0
10
10
Frecuencia angular (rad/s)
23
10
% p= (ap*s+bp)/(s^3+cp*s^2+dp*s)
% MODELO NOMINAL DISCRETO pnz(z)
T = 0.3;
[numd,dend] = c2dm(numn,denn,T,'zoh');
% numd(z)/dend(z) = pnz(z) = (b1*z^2+b2*z+b3)/(z^3+a1*z^2+a2*z+a3)
a1=dend(2); a2=dend(3); a3=dend(4);
b1=numd(2); b2=numd(3); b3=numd(4);
% PROCESO DISCRETO
[numdp,dendp] = c2dm(nump,denp,T,'zoh');
% numdp(z)/dendp(z) = pz(z) = (bp1*z^2+bp2*z+bp3)/...
% (z^3+ap1*z^2+ap2*z+ap3)
ap1=dendp(2); ap2=dendp(3); ap3=dendp(4);
bp1=numdp(2); bp2=numdp(3); bp3=numdp(4);
% DETERMINACION DE pnz(z)=pA(z)*pM(z):
% roots(numd): 0.9704 y -0.9416
% COMO pnz NO POSEE CEROS FUERA DEL CU, Y COMO z^N*pnz
% DEBE SER SEMIPROPIO, N=1; LUEGO pA=z^(-1) Y
% pM=pnz/pA=z*(b1*z^2+b2*z+b3)/(z^3+a1*z^2+a2*z+a3)
% CALCULO DE v(z)=vA(z)*vM(z)=z/(z-1) PARA UNA ENTRADA ESCALON:
% vA=1; vM=z/(z-1)
% CALCULO DE qtilde_H=z(pM*vM)^(-1){z^(-1)pA^(-1)vM}*:
% z(pM*vM)^(-1)=(z-1)pM^(-1)
% {z^(-1)pA^(-1)vM}*={z/(z-1)}*={1+1/(z-1)}*=1/(z-1)
% qtilde_H=pM^(-1)=(z^3+a1*z^2+a2*z+a3)/(b1*z^3+b2*z^2+b3*z)
% CALCULO DE qtilde_:
% (b1*z^2+b2*z+b3)=(z-0.9704)(z+0.9416); DEBEMOS CANCELAR z=-0.9416
% Y SUSTITUIRLO CON z=0; ESTO ES, k1=-0.9416, rho=1; LUEGO
% qtilde_=z^(-rho)*(z-k1)/(1-k1)=z^(-1)*(z-k1)/(1-k1)
k1=-0.9416;
% CALCULO DE qtilde=qtilde_H*qtilde_*B(z) PARA m=1:
% B(z)=1; qtilde=qtilde_H*qtilde_=
% (z^3+a1*z^2+a2*z+a3)*(z-k1)/((b1*z^3+b2*z^2+b3*z)*z*(1-k1))
% CALCULO DEL FILTRO PARA m=1: f(z)=(1-alfa)*z/(z-alfa);
% FUNCION DE PESO PARA m=1: W(w)>=G/(abs(1-pn*qtilde))
% CONDICIONES: w^(-1)(infty) MAYOR QUE 1, W(0)^(-1) MAYOR QUE 0
% CHEQUEANDO ESTABILIDAD ROBUSTA
alfa = 0.33; % CUMPLE CONDICIONES DE ESTABILIDAD Y RENDIMIENTO
% ROBUSTOS PERO REQUIERE DE UNA ENTRADA U MUY GRANDE; POR ELLO
% PARA EL DISE~NO FINAL EL PARAMETRO SE FIJA EN: alfa=0.5
for w = 0:pi/T % pi/T =
s=i*w; z=exp(s);
pnz = (b1*z^2+b2*z+b3)/(z^3+a1*z^2+a2*z+a3);
pz = (bp1*z^2+bp2*z+bp3)/(z^3+ap1*z^2+ap2*z+ap3);
laz = pz - pnz;
lmz = laz/pnz;
qtilde=(z^3+a1*z^2+a2*z+a3)*(z-k1)/((b1*z^2+b2*z+b3)*z*(1-k1));
mag_dB(w+1) = 20*log10(1/(abs(pnz*qtilde*lmz)));
f = (1-alfa)*z/(z-alfa);
magf_dB(w+1) = 20*log10(abs(f));
% PARA ESTABILIDAD ROBUSTA: magf_dB(w+1) < mag_dB(w+1)
end
% CHEQUEANDO RENDIMIENTO ROBUSTO
for w = 0:pi/T % pi/T =
s=i*w; z=exp(s);
pn=(an*s+bn)/(s^3+cn*s^2+dn*s);
p= (ap*s+bp)/(s^3+cp*s^2+dp*s);
la = p - pn;
lm = la/pn;
qtilde=(z^3+a1*z^2+a2*z+a3)*(z-k1)/((b1*z^2+b2*z+b3)*z*(1-k1));
f = (1-alfa)*z/(z-alfa);
q = qtilde*f;
24
G = 0.1; W = G/abs(1-pn*qtilde);
% PARA RENDIMIENTO ROBUSTO: M_dB < 1
M_dB(w+1) = 20*log10(abs(q*la) + abs((1-pn*q)*W));
end
% GRAFICOS
ejew = linspace(0,pi/T,pi/T);
subplot(121)
semilogx(ejew,mag_dB(1:pi/T),ejew,magf_dB(1:pi/T),'--')
ylabel('Magnitudes en dB')
title(' (a)')
xlabel('Frecuencia angular (rad/s)')
grid
subplot(122)
semilogx(ejew,M_dB(1:pi/T))
ylabel('Magnitud de M en dB')
title(' (b)')
xlabel('Frecuencia angular (rad/s)')
grid
print -f -deps p4rob1f
print -s -deps p4rob1s
(a)
(b)
40
35
30
Magnitud de M en dB
Magnitudes en dB
25
20
15
10
-5
-10
-15
-5
-10
0
10
10
Frecuencia angular (rad/s)
10
-20
0
10
10
Frecuencia angular (rad/s)
25
10
% p=K*exp(-Tp*s)/(s^2+a*s+b)
% MODELO NOMINAL DISCRETO pnz(z)
T = 0.5; % z = exp(T*s) => exp(Tn*s)=z^(Tn/T)=z^18
[numd,dend] = c2dm(numn,denn,T,'zoh');
% numd(z)/dend(z)=(b1*z+b2)/(z^2+a1*z+a2)
a1=dend(2); a2=dend(3);
b1=numd(2); b2=numd(3);
% numD(z)/denD(z)=pnz(z)=z^(-Tn/T)*numd(z)/dend(z)
% pnz(z) = z^(-Tn/T)*(b1*z+b2)/(z^2+a1*z+a2)
% = (b1*z+b2)/(z^20+a1*z^19+a2*z^18)
% PROCESO DISCRETO pz(z)
% T = 0.5; z = exp(T*s) => exp(Tp*s)=z^(Tp/T)=z^22
[numdp,dendp] = c2dm(nump,denp,T,'zoh');
% numdp(z)/dendp(z)=(bp1*z+bp2)/(z^2+ap1*z+ap2)
ap1=dendp(2); ap2=dendp(3);
bp1=numdp(2); bp2=numdp(3);
% numDp(z)/denDp(z)=pz(z)=z^(-Tp/T)*numdp(z)/dendp(z)
% pz(z) = z^(-Tp/T)*(bp1*z+bp2)/(z^2+ap1*z+ap2)
% = (bp1*z+bp2)/(z^24+a1*z^23+a2*z^22)
% DETERMINACION DE pnz(z)=pA(z)*pM(z):
% roots(numD): -0.1353
% COMO pnz NO POSEE CEROS FUERA DEL CIRCULO UNITARIO (CU) Y COMO
% z^N*pnz DEBE SER SEMIPROPIO, ENTONCES N=19; LUEGO pA=z^(-N) Y
% pM=pnz/pA=z^19*(b1*z+b2)/(z^20+a1*z^19+a2*z^18)
% DETERMINACION DE v(z)=vA(z)*vM(z)=z/(z-1) PARA UNA ENTRADA ESCALON:
% SE SABE POR EJERCICIOS ANTERIORES QUE vA=1; vM=z/(z-1)
% CALCULO DE qtilde_H=(pM(z))^(-1):
% SEGUN TABLA, qtilde_H=(z^20+a1*z^19+a2*z^18)/(b1*z^20+b2*z^19)
% CALCULO DE qtilde_:
% (b1*z^4+b2*z^3)=z^3*(b1*z+b2) => CANCELAR z=-b2/b1=-0.1353
% Y SUSTITUIRLO CON z=0; ESTO ES, k1=-0.1353, rho=1, Y
% qtilde_=z^(-rho)*(z-k1)/(1-k1)=z^(-1)*(z-k1)/(1-k1)
k1=-0.1353;
% CALCULO DE qtilde=qtilde_H*qtilde_*B(z) (PARA m=1):
% PARA QUE EL SISTEMA SEA DEL TIPO m=1, B(z)=1, ENTONCES:
% qtilde=qtilde_H*qtilde_=
% (z^20+a1*z^19+a2*z^18)*(z-k1)/(z*(b1*z^20+b2*z^19)*(1-k1))
% CALCULO DEL FILTRO CON m=1: f(z)=(1-alfa)*z/(z-alfa);
% CALCULO DE LA FUNCION DE PESO PARA m=1: W(w)>=G/(abs(1-pn*qtilde))
% CONDICIONES: W^(-1)(infty) MAYOR QUE 1, W(0)^(-1) MAYOR QUE 0
% CHEQUEANDO ESTABILIDAD ROBUSTA
alfa = 0.95;
for w = 0:pi/T % pi/T =
s=i*w; z=exp(s);
pn=K*exp(-Tn*s)/(s^2+a*s^2+b*s);
p= K*exp(-Tp*s)/(s^2+a*s^2+b*s);
pnz = (b1*z+b2)/(z^(Tn/T)*(z^2+a1*z+a2));
pz = (bp1*z+bp2)/(z^(Tp/T)*(z^2+ap1*z+ap2));
laz = pz - pnz;
lmz = laz/pnz;
qtilde=(z^20+a1*z^19+a2*z^18)*(z-k1)/...
(z*(b1*z^20+b2*z^19)*(1-k1));
mag_dB(w+1) = 20*log10(1/(abs(pnz*qtilde*lmz)));
f = (1-alfa)*z/(z-alfa);
magf_dB(w+1) = 20*log10(abs(f));
% PARA ESTABILIDAD ROBUSTA: magf_dB(w+1) < mag_dB(w+1)
end
% CHEQUEANDO RENDIMIENTO ROBUSTO
for w = 0:pi/T
s=i*w; z=exp(s);
pn=K*exp(-Tn*s)/(s^2+a*s^2+b*s);
26
p= K*exp(-Tp*s)/(s^2+a*s^2+b*s);
la = p - pn;
lm = la/pn;
qtilde=(z^20+a1*z^19+a2*z^18)*(z-k1)/...
(z*(b1*z^20+b2*z^19)*(1-k1));
f = (1-alfa)*z/(z-alfa);
q = qtilde*f;
G = 0.9; W = G/abs(1-pn*qtilde);
% PARA RENDIMIENTO ROBUSTO: M_dB < 1
M_dB(w+1) = 20*log10(abs(q*la) + abs((1-pn*q)*W));
end
% GRAFICOS
ejew = linspace(0,pi/T,pi/T);
subplot(121)
semilogx(ejew,mag_dB(1:pi/T),ejew,magf_dB(1:pi/T),'--'); grid
ylabel('Magnitudes en dB')
title(' (a)')
xlabel('Frecuencia angular (rad/s)')
subplot(122)
semilogx(ejew,M_dB(1:pi/T)); grid
ylabel('Magnitud de M en dB')
title(' (b)')
xlabel('Frecuencia angular (rad/s)')
print -f -deps p10rob1f
print -s -deps p10rob1s
(a)
(b)
10
0
-2
-5
Magnitud de M en dB
Magnitudes en dB
-10
-15
-20
-6
-8
-10
-25
-12
-30
-35
0.1
10
-4
0.7
10
Frecuencia angular (rad/s)
-14
0.1
10
0.7
10
Frecuencia angular (rad/s)
27
28
% DETERMINACION DE bv(z)
% COMO v(z) NO POSEE POLOS FUERA DEL CU, ENTONCES bv(z)=1
% CALCULO DE qtilde_H=z*bp*(pM*bv*vM)^(-1){(z*bp*pA)^(-1)*vM}*:
% NOTAR QUE pnz(z) Y v(z) POSEEN 1 POLO EN z=1. COMO bp=bv=1,
% qtilde_H=pM^(-1)=(z^6+a1*z^5+a2*z^4+a3*z^3+a4*z^2+a5*z+a6)/...
% (z*(b1*z^5+b2*z^4+b3*z^3+b4*z^2*b5*z+b6));
% CALCULO DE qtilde_= z^(-r)*((z-k1)/(1-k1)* ... *(z-kr)/(1-kr)):
% roots([b1 b2 b3 b4 b5 b6]): -0.2943 + 0.5702i,
% -0.2943 - 0.5702i; 0.4916 + 0.4604i, 0.4916 - 0.4604i, 1.0000
% r=2 POLOS DE qtilde_H CON PARTE REAL NEGATIVA; k1=-0.2943;
% k2=k1 => qtilde_=z^(-2)*(z-k1)^2/(1-k1)^2
k1=-0.2943;
% CALCULO DE qtilde=qtilde_H*qtilde_*B(z):
% EL MINIMO COMUN DENOMINADOR DE pnz Y v CON RAICES INESTABLES ES:
% (z-piz)=(z-1) => z=piz=1, m1=1 (MULTIPLICIDAD) y B(z)=b0=1;
% qtilde=qtilde_H*qtilde_=
% (z^6+a1*z^5+a2*z^4+a3*z^3+a4*z^2+a5*z+a6)*(z-k1)^2/...
% (z^3*(b1*z^5+b2*z^4+b3*z^3+b4*z^2*b5*z+b6)*(1-k1)^2);
% DETERMINACION DEL FILTRO: f(z)=(1-alfa)*z/(z-alfa);
% CALCULO DE LA FUNCION DE PESO PARA m=1: W(w)>=G/(abs(1-pn*qtilde))
% CONDICIONES: w^(-1)(infty) MAYOR QUE 1, W(0)^(-1) MAYOR QUE 0
% CHEQUEANDO ESTABILIDAD ROBUSTA
alfa = 0.8;
for w = 0:pi/T % pi/T =
s=i*w; z=exp(s);
pnz=(b1*z^5+b2*z^4+b3*z^3+b4*z^2*b5*z+b6)/...
(z^6+a1*z^5+a2*z^4+a3*z^3+a4*z^2+a5*z+a6);
pz=(bz1*z^5+bz2*z^4+bz3*z^3+bz4*z^2*bz5*z+bz6)/...
(z^6+az1*z^5+az2*z^4+az3*z^3+az4*z^2+az5*z+az6);
laz = pz - pnz;
lmz = laz/pnz;
qtilde=(z^6+a1*z^5+a2*z^4+a3*z^3+a4*z^2+a5*z+a6)*(z-k1)^2/...
(z^3*(b1*z^5+b2*z^4+b3*z^3+b4*z^2*b5*z+b6)*(1-k1)^2);
mag_dB(w+1) = 20*log10(1/(abs(pnz*qtilde*lmz)));
f = (1-alfa)*z/(z-alfa);
magf_dB(w+1) = 20*log10(abs(f));
% PARA ESTABILIDAD ROBUSTA: magf_dB(w+1) < mag_dB(w+1)
end
% CHEQUEANDO RENDIMIENTO ROBUSTO
for w = 0:pi/T
s=i*w; z=exp(s);
pn=(bn1*s^5+bn2*s^4+bn3*s^3+bn4*s^2+bn5*s+bn6)/...
(s^6+an1*s^5+an2*s^4+an3*s^3+an4*s^2+an5*s+an6);
p=(bp1*s^5+bp2*s^4+bp3*s^3+bp4*s^2+bp5*s+bp6)/...
(s^6+ap1*s^5+ap2*s^4+ap3*s^3+ap4*s^2+ap5*s+ap6);
la = p - pn;
lm = la/pn;
qtilde=(z^6+a1*z^5+a2*z^4+a3*z^3+a4*z^2+a5*z+a6)*(z-k1)^2/...
(z^3*(b1*z^5+b2*z^4+b3*z^3+b4*z^2*b5*z+b6)*(1-k1)^2);
f = (1-alfa)*z/(z-alfa);
q = qtilde*f;
G = 0.72; W = G/abs(1-pn*qtilde);
% PARA RENDIMIENTO ROBUSTO: M_dB < 1
M_dB(w+1) = 20*log10(abs(q*la) + abs((1-pn*q)*W));
end
% CALCULO DEL CONTROLADOR c=q/(1-pnz*q)
% NOTAR QUE q*pnz=(z-k1)^2*(1-alfa)/(z^2*(1-k1)^2*(z-alfa))
num1=(1-alfa)*[1 -2*k1 k1^2]; den1= ...
[(1-k1)^2 -((1-k1)^2*alfa+(1-alfa)) (1-alfa)*2*k1 -(1-alfa)*k1^2];
% numc=conv(den,num1); denc=conv(num,den1);
[numc,denc]=series(den,num,num1,den1);
29
% GRAFICOS
ejew = linspace(0,pi/T,pi/T);
subplot(121)
semilogx(ejew,mag_dB(1:pi/T),ejew,magf_dB(1:pi/T),'--'); grid
ylabel('Magnitudes en dB');
title(' (a)')
xlabel('Frecuencia angular (rad/s)')
subplot(122)
semilogx(ejew,M_dB(1:pi/T)); grid
ylabel('Magnitud de M en dB');
title(' (b)')
xlabel('Frecuencia angular (rad/s)')
print -f -deps p7rob1f
print -s -deps p7rob1s
(b)
0
30
-2
20
-4
Magnitud de M en dB
Magnitudes en dB
(a)
40
10
-10
-20
0
10
-6
-8
-10
-12
0
10
10
10
Frecuencia angular (rad/s)
30
10
10
Frecuencia angular (rad/s)
31
s=i*w; z=exp(s);
pn=(bn2*s^2+bn3*s+bn4)/(s^4+an1*s^3+an2*s^2+an3*s);
p=(bp2*s^2+bp3*s+bp4)/(s^4+ap1*s^3+ap2*s^2+ap3*s);
la = p - pn;
lm = la/pn;
qtilde=(z^4+a1*z^3+a2*z^2+a3*z+a4)*(z-k1)/...
(z^2*(1-k1)*(b1*z^3+b2*z^2+b3*z+b4));
f = (1-alfa)*z/(z-alfa);
q = qtilde*f;
G = 0.75; W = G/abs(1-pn*qtilde);
% PARA RENDIMIENTO ROBUSTO: M_dB < 1
M_dB(w+1) = 20*log10(abs(q*la) + abs((1-pn*q)*W));
end
% CALCULO DEL CONTROLADOR c=q/(1-pnz*q)
% NOTAR QUE q*pnz=(z-k1)*(1-alfa)/(z*(1-k1)*(z-alfa))
num1=(1-alfa)*[1 -k1];
den1=[(1-k1) -((1-k1)*alfa+(1-alfa)) (1-alfa)*k1];
% numc=conv(den,num1); denc=conv(num,den1);
[numc,denc]=series(den,num,num1,den1);
% GRAFICOS
ejew = linspace(0,pi/T,pi/T);
subplot(121)
semilogx(ejew,mag_dB(1:pi/T),ejew,magf_dB(1:pi/T),'--'); grid
ylabel('Magnitudes en dB'); title(' (a)')
xlabel('Frecuencia angular (rad/s)')
subplot(122)
semilogx(ejew,M_dB(1:pi/T)); grid
ylabel('Magnitud de M en dB'); title(' (b)')
xlabel('Frecuencia angular (rad/s)')
print -f -deps p8rob1f
print -s -deps p8rob1s
(a)
(b)
15
0.5
0
10
-0.5
-5
Magnitud de M en dB
Magnitudes en dB
-1
5
-1.5
-2
-2.5
-3
-3.5
-10
-4
-15
0.3
0.5
10
10
Frecuencia angular (rad/s)
-4.5
0.3
0.5
10
10
Frecuencia angular (rad/s)
32
33
y: Inclinacion (rad)
2
1
0
-1
-2
100
200
300
400
500
600
700
100
200
300
400
TIEMPO : SEG
500
600
700
1
0.5
0
-0.5
-1
34
35
y: Inclinacion (rad)
4
3
2
1
0
-1
200
400
600
800
1000
1200
200
400
600
TIEMPO : SEG
800
1000
1200
0.3
0.2
0.1
0
-0.1
-0.2
36
g(1)=b1; g(2)=-a1*b1+b1+b2;
g(3)=-a1*g(2)-a2*g(1)+b1+b2+b3;
g(4)=-a1*g(3)-a2*g(2)-a3*g(1)+b1+b2+b3+b4;
g(5)=-a1*g(4)-a2*g(3)-a3*g(2)-a4*g(1)+b1+b2+b3+b4+b5;
g(6)=-a1*g(5)-a2*g(4)-a3*g(3)-a4*g(2)-a5*g(1)+b1+b2+b3+b4+b5+b6;
for k=7:N2
g(k)=-a1*g(k-1)-a2*g(k-2)-a3*g(k-1)-a4*g(k-1)-a5*g(k-2)...
-a6*g(k-1) + b1 + b2 + b3 + b4 + b5 + b6;
end
% CONDICIONES INICIALES
for k=1:7
yf(k)=0; y(k)=0; r(k)=0; u(k)=0;
end
alf =0.1; lambda = 0; MM=500;
% LAZO DE CONTROL
for t=7:MM+6;
% TRAYECTORIA DESEADA, REFERENCIA r Y RESPUESTA LIBRE yf
for k=1:N2
W(t+k)= 25 + 5*sign(sin(0.01*t));
r(t+k) = alf*r(t+k-1) + (1-alf)*W(t+k);
yf(t+k) = -a1*yf(t+k-1)-a2*yf(t+k-2)-a3*yf(t+k-3)...
-a4*yf(t+k-4)-a5*yf(t+k-5)-a6*yf(t+k-6)+(b1+b2+b3+b4+b5+b6)*u(t-1);
end
% LEY DE CONTROL
du(t)=(g(1)*(r(t+1)-yf(t+1))+g(6)*(r(t+6)-yf(t+6))+...
g(2)*(r(t+2)-yf(t+2))+g(7)*(r(t+7)-yf(t+7))+ ...
g(3)*(r(t+3)-yf(t+3))+g(8)*(r(t+8)-yf(t+8))+ ...
g(4)*(r(t+4)-yf(t+4))+g(9)*(r(t+9)-yf(t+9))+ ...
g(5)*(r(t+5)-yf(t+5))+g(10)*(r(t+10)-yf(t+10)))/...
(g(1)^2 + g(2)^2 + g(3)^2 + g(4)^2 + g(5)^2 + g(6)^2 + ...
g(7)^2 + g(8)^2 + g(9)^2 + g(10)^2 + lambda);
u(t) = u(t-1) + du(t);
% PROCESO
y(t+1)= -a1*y(t) -a2*y(t-1) -a3*y(t-2) -a4*y(t-3)...
-a5*y(t-4) -a6*y(t-5)...
+b1*u(t) +b2*u(t-1) +b3*u(t-2) +b4*u(t-3)...
+b5*u(t-4)+b6*u(t-5);
end
% GRAFICOS
ejex=linspace(0,MM*tm,MM-6);
subplot(2,1,1)
plot(ejex,W(7:MM),ejex,y(7:MM)); grid
ylabel('Y1: Velocidad (m/s)')
subplot(2,1,2)
plot(ejex,u(7:MM)); grid
xlabel('Tiempo (segundos)')
ylabel('Control u (volt)')
print -deps -f p7pred1a
37
30
20
10
50
50
100
150
100
150
Control u (volt)
100
50
-50
Tiempo (segundos)
38
39
POSICION (m)
4
2
0
-2
VOLTAJE DE CONTROL
-4
50
100
150
200
TIEMPO EN SEGUNDOS
250
300
50
100
150
200
TIEMPO EN SEGUNDOS
250
300
200
100
0
-100
-200
40
for k=1:N2
W(t+k) = 1.5 + 0.5*sign(sin(0.02*t));
r(t+k) = alf*r(t+k-1) + (1-alf)*W(t+k);
yf(t+k) = -a1*yf(t+k-1) - a2*yf(t+k-2) + (b1 + b2)*u(t-1);
end
% LEY DE CONTROL
du(t)=(g1*(r(t+1)-yf(t+1))+g6*(r(t+6)-yf(t+6))+ ...
g2*(r(t+2) - yf(t+2)) + g7*(r(t+7) - yf(t+7)) + ...
g3*(r(t+3) - yf(t+3)) + g8*(r(t+8) - yf(t+8)) + ...
g4*(r(t+4) - yf(t+4)) + g9*(r(t+9) - yf(t+9)) + ...
g5*(r(t+5) - yf(t+5)) + g10*(r(t+10)-yf(t+10)))/...
(g1^2 + g2^2 + g3^2 + g4^2 + g5^2 + g6^2 + ...
g7^2 + g8^2 + g9^2 + g10^2 + lambda);
u(t) = u(t-1) + du(t);
% PROCESO LINEALIZADO (ECUACION RESIDUAL)
y(t+1)=-a1*y(t)-a2*y(t-1)+b1*du(t)+b2*du(t-1);
% SALIDA ACTUAL (NIVEL H2)
Y(t+1) = y(t+1)+W(t+1);
% LIMITANDO EL FLUJO DE CONTROL
fu = 3.0;
if(u(t) > 0 & u(t) > fu)
u(t) = fu;
elseif(u(t) < 0 & u(t) < -fu)
u(t) = -fu;
end
end % FIN DEL LAZO DE CONTROL **************
% GRAFICOS
ejex = linspace(0,MM*T,MM-2);
subplot(2,1,1)
plot(ejex,W(3:MM),ejex,Y(3:MM)); grid
ylabel('NIvel H2 (m)')
xlabel('Tiempo en segundos')
subplot(2,1,2)
plot(ejex,u(3:MM)); grid
ylabel('Flujo de control (m^3/s)')
xlabel('Tiempo en segundos')
print -deps -f p9pred1
41
POSICION (m)
4
2
0
-2
VOLTAJE DE CONTROL
-4
50
100
150
200
TIEMPO EN SEGUNDOS
250
300
50
100
150
200
TIEMPO EN SEGUNDOS
250
300
200
100
0
-100
-200
42
43