129 Anexo A Simulador del módulo de pH de laboratorio

Transcripción

129 Anexo A Simulador del módulo de pH de laboratorio
129
Anexo A
Simulador del módulo de pH de laboratorio
Programación gráfica dentro del bloque simulador del módulo de pH:
Cb
Product 3
Q1
log 10
1
s
1
Fb
1/V
Integrator
-1
1
pH
Gain 1
Gain
Product
sqrt
Ca
Kw
Product 5
Product 1
Product 2
Fa
0.5
Product 4
0.25
Scope 3
t
Clock
130
131
Anexo B
Programa para identificación de la no linealidad estática del modelo Hammerstein
clc
disp('Modelación del Polinomio Hammerstein');
%Parámetros para la prueba con simulador de pH
V=1.8;
% Volumen (L)
Kw=10^-14;
% Constante de ionización del agua
Ca=0.005;
% Concentración del HCl (mol/L) o (M)
Cb=0.005;
% Concentración del NaOH (mol/L) o (M)
Fa=0.4/60;
% Caudal del HCl (L/s)
%Definir variable manipulable
tm=input('Definir el tiempo de muestreo tm:');
%tiempo de establecimiento es 1200 para módulos del laboratorio.
te=input('Ingrese tiempo de establecimiento de su proceso te:');
%numero de escalones para identificar la no linealidad
ne=input('Ingrese número de escalones a considerar ne:');
%tiempo de simulación
ts=te*ne;
%definir área de trabajo
disp('estudio entre dos valores');
%valores límite
Imin=input('Ingrese valor mínimo de la variable manipulable:');
Imax=input('Ingrese valor máximo de la variable manipulable:');
re=(Imin+Imax)/2;
ve=(Imax-Imin)/(ne*re);
concordancia=0;
while concordancia==0;
%ingrese valores de saturación de su variable manipulable
umin=0;
umax=1;
%se empieza a generar
c=1;
N=ne;
N=floor(N/2);
Nmin=(1-(N-1)*ve);
for j=1:1:(te*ne-1)/tm
t(1)=0;
entrada(1)=Nmin*re;
if (j)*tm/te==floor((j)*tm/te)
c=c+1;
end
if j<c*te/tm
entrada(j+1)=(Nmin+(c-1)*ve)*re;
end
t(j+1)=t(j)+tm;
end
if entrada(1)<umin || entrada(length(entrada))>umax
disp('Los límites de la banda para el estudio están fuera de los
valores críticos');
decisión=input('Desea continuar el estudio (S/N):','s');
if decisión=='S'
132
concordancia=1;
else
clc
concordancia=0;
end
else
concordancia=1;
end
end
%se empieza a generar las entradas escalón y la simulación
entrada=[t' entrada'];
%se ejecuta el archivo simulink%
ps=1;
%Valores por defecto del ruido blanco
a=100;
b=10;
sim('D:\INFORMACIÓN IMPORTANTE PARA TESIS\Simulaciones con
PH\Estructuras 2\pH\tesisid.mdl')
a=0;
i=1;
m=1;
for i=1:1:length(t)-1
if in(i+1)-in(i)>ve*re/2
a=i;
u(m)=in(a);
y(m)=out(a);
m=m+1;
end
end
u(m)=in(length(t));
y(m)=out(length(t));
if y(1)<y(length(y))
ymin=y(1);
ymax=y(length(y));
else
ymin=y(length(y));
ymax=y(1);
end
if u(1)<u(length(y))
umin=u(1);
umax=u(length(u));
else
umin=u(length(u));
umax=u(1);
end
figure(1),plot(u,y),xlim([umin umax]),ylim([ymin ymax])
hold on
grid
%Se obtienen puntos de entrada salida para generar el polinomio. El
grado del mismo es decidido por el usuario.
gp=input('Ingrese grado del polinomio para aproximar el
compormtamiento gp:');
[P,S]=polyfit(u,y,gp); %Coeficientes del Polinomio
133
for i=1:1:length(P)
P(i)
end
[P1,S1]=polyfit(y,u,gp); %Coeficientes del Polinomio inverso
Y = POLYVAL(P,u);
figure(1),plot(u,Y,'r'),xlabel('Variable de Entrada'),ylabel('Variable
de Salida'), grid
hold on
grid
RR=0;
while RR==0;
satifaccion=input('Le satisfase el grado del polinomio elegido
(S/N):','s');
if satifaccion=='S'
RR=1;
else
gp=input('Ingrese grado del polinomio para aporximar el
compormtamiento gp:');
[P,S]=polyfit(u,y,gp);
%para mostrar los P(i)
for i=1:1:length(P)
P(i)
end
%%%%%%%%%%%%%%%%%%%%%%
[P1,S1]=polyfit(y,u,gp);
Y = POLYVAL(P,u);
cla
figure(1),plot(u,y),xlim([umin umax]),ylim([ymin ymax]), hold
on
figure(1),plot(u,Y,'r'),xlabel('Variable de
Entrada'),ylabel('Variable de Salida'), grid
hold on
grid
end
end
134
135
Anexo C
Programa para la identificación de la dinámica lineal del modelo Hammerstein.
disp('Generación de Señal PRS para modelación Hammerstein');
clear dt
clear t
clear PRS
clear num2
clear den2
clear c
%tiempo de muestreo
tm=input('Ingrese tiempo de muestreo tm:');
%tiempo de simulación
ts=input('Ingrese tiempo de simulación ts:');
%valor de referencia
re=input('Ingrese valor nominal de la variable manipulable (u) re:');
% tiempo de conmutación
tc=input('Ingrese tiempo mínimo de conmutación de la señal tc:');
%Valor máximo y mínimo de entrada respecto al valor de referencia
disp('Ingrese valores máx. y mín. de variación de la señal respecto a
la referencia');
umax=input('Ingrese valor máx. en variación porcentual umax:');
umin=input('Ingrese valor míx. en variación porcentual umin:');
%Se generará una señal PRS partiendo de una PRBS
PRBS=idinput(ts/tm,'PRBS',[0 tm/tc],[-umin*re/100 umax*re/100]);
c=rand(1);
i=0;
for i=1:1:te/tm
dt(i)=i*tm;
end
PRS(1)=c*PRBS(1);
t(1)=te+tm;
i=0;
for i=1:1:length(PRBS)-1
if PRBS(i)~=PRBS(i+1)
c=rand(1);
end
PRS(i+1)=c*PRBS(i+1);
t(i+1)=t(i)+tm;
end
PRS=PRS+re*ones(1,length(PRS));
entrada=[[dt,t]' [re*ones(1,te/tm),PRS]'];
%tiempo de simulación
ts=length(t)*tm+te;
%posición de entrada swicth
ps=1;
%Valores por defecto del ruido blanco
a=100;
b=10;
sim('D:\INFORMACIÓN IMPORTANTE PARA TESIS\Simulaciones con
PH\Estructuras 2\pH\tesisid.mdl')
HYW1='SI';
ino= re;
outo=POLYVAL(P,re);
if HYW1=='SI'
136
v=POLYVAL(P,in);
vo=POLYVAL(P,re);
else
v=in;
vo=ino;
end
in=in(te/tm:length(t));
t=t(te/tm:length(t));
v=v(te/tm:length(v));
out=out(te/tm:length(out));
tid2=t(1:1:round(length(t)/2));
in_id_2=v(1:1:round(length(v)/2));in_id_2=in_id_2vo*ones(length(in_id_2),1);
out_id_2=out(1:1:round(length(out)/2));out_id_2=out_id_2outo*ones(length(out_id_2),1);
id2=iddata(out_id_2,in_id_2,'Ts',1);
% Para obtener la mejor validación
satisfaccion=0;
i=0;
while satisfaccion==0
%VALIDACION
t_va2=t(round(length(t)/2)+1:1:round(length(t)));
in_va_2=v(round(length(v)/2)+1:1:round(length(v)));in_va_2=in_va_2vo*ones(length(in_va_2),1);
out_va_2=out(round(length(out)/2)+1:1:round(length(out)));out_va_2=out
_va_2-outo*ones(length(out_va_2),1);
va2=iddata(out_va_2,in_va_2,'Ts',1);
i=i+1;
if i==1
nn=struc([1:10],[1:10],[1:10]);
MV2=arxstruc(id2,va2,nn);
nn=selstruc(MV2,'AIC');
else
nn(1)=input('ingrese grado de denominador na:');
nn(2)=input('ingrese grado de numerador nb:');
nn(3)=input('ingrese retardo nk:');
end
figure(2),subplot(2,3,1,'replace'),cla,subplot(2,3,1,'replace'),plot(t
(1:1:round(length(t)/2)),in(1:1:round(length(in)/2))),grid,title('Entr
ada PRS')
hold on
figure(2),subplot(2,3,2,'replace'),cla,subplot(2,3,2,'replace'),plot(t
(1:1:round(length(t)/2)),v(1:1:round(length(v)/2))),grid,title('Variab
le Auxiliar')
hold on
figure(2),subplot(2,3,3,'replace'),cla,subplot(2,3,3,'replace'),plot(t
(1:1:round(length(t)/2)),out(1:1:round(length(out)/2))),grid,title('Re
spuesta del Sistema')
MI2=arx(id2,[nn(1) nn(2) nn(3)],'InitialState','estimate');
137
[num2 den2]=tfdata(MI2,'v');
[Y2,U2]=dlsim(num2,den2,in_va_2);
Y2=Y2+outo*ones(length(Y2),1);
out_va_2=out_va_2+outo*ones(length(out_va_2),1);
figure(2),subplot(2,1,2),cla,subplot(2,1,2),plot(t_va2,Y2,'r--')
hold on
figure(2),subplot(2,1,2),plot(t_va2,out_va_2),grid
figure(2),subplot(2,3,1,'replace'),cla,subplot(2,3,1,'replace'),plot(t
(1:1:round(length(t)/2)),in(1:1:round(length(in)/2))),grid,title('Entr
ada PRS')
hold on
figure(2),subplot(2,3,2,'replace'),cla,subplot(2,3,2,'replace'),plot(t
(1:1:round(length(t)/2)),v(1:1:round(length(v)/2))),grid,title('Variab
le Auxiliar')
hold on
figure(2),subplot(2,3,3,'replace'),cla,subplot(2,3,3,'replace'),plot(t
(1:1:round(length(t)/2)),out(1:1:round(length(out)/2))),grid,title('Re
spuesta del Sistema')
figure(3),plot(t_va2,Y2,'r--')
hold on
figure(3),plot(t_va2,out_va_2),grid
%Parámetrosde índice de prestación
Yv2=out_va_2;
RMS2=sqrt(sum((Y2-Yv2).*(Y2-Yv2))/sum(Y2.*Y2))
MSE2=sum((Y2-Yv2).*(Y2-Yv2))/length(Y2)
FIT2=100*(1 - norm(Yv2 - Y2)/norm(Y2-mean(Y2)))
SS=input('Le satisfase la identificación realizada (S/N):','s');
if SS=='S'
satisfaccion=1;
else
clc
disp('Generacion de Señal PRS para modelación Hammerstein');
disp(sprintf('Los valores de na, nb y nk anteriores son: %i, %i y
%i.',nn(1),nn(2),nn(3)));
disp('Ingrese manualmente los grados del modelo ARX');
disp('A(q) y(t) = B(q) u(t-nk) + e(t)');
end
end
138
139
Anexo D
Programa para la identificación de la no linealidad estática del modelo
Hammerstein experimental.
%Parámetros para la prueba con pHmetro
V=1.8;
% Volumen (L)
Kw=10^-14;
% Constante de ionización del agua
Ca=0.005;
% Concentración del HCl (mol/L) o (M)
Cb=0.005;
% Concentración dekl NaOH (mol/L) o (M)
Fa=0.4/60;
% Caudal del HCl (L/s)
% x e y son las entradas y salidas obtenidas experimentalmente
u=[x]';
y=[y]';
if y(1)<y(length(y))
ymin=y(1);
ymax=y(length(y));
else
ymin=y(length(y));
ymax=y(1);
end
if u(1)<u(length(y))
umin=u(1);
umax=u(length(u));
else
umin=u(length(u));
umax=u(1);
end
figure(3),plot(u,y),xlim([umin umax]),ylim([ymin ymax])
hold on
grid
gp=input('Ingrese grado del polinomio gp:');
[P,S]=polyfit(u,y,gp); %Coeficientes del Polinomio
for i=1:1:length(P)
P(i)
end
[P1,S1]=polyfit(y,u,gp); %Coeficientes del Polinomio Inverso
Y = POLYVAL(P,u);
figure(3),plot(u,Y,'r'),xlabel('Variable de Entrada'),ylabel('Variable
de Salida'),title('Descripción de la no linealidad estática'), grid %r
por ro
hold on
grid
RR=0;
while RR==0;
satifaccion=input('Le satisfase el grado del polinomio elegido
(S/N):','s');
if satifaccion=='S'
RR=1;
else
gp=input('Ingrese grado del polinomio gp:');
[P,S]=polyfit(u,y,gp);
%para mostrar los P(i)
for i=1:1:length(P)
140
P(i)
end
[P1,S1]=polyfit(y,u,gp);
Y = POLYVAL(P,u);
cla
figure(3),plot(u,y),xlim([umin umax]),ylim([ymin ymax]), hold
on
figure(3),plot(u,Y,'r'),xlabel('Variable de
Entrada'),ylabel('Variable de Salida'), grid;
hold on
grid
end
end
141
Anexo E
Programa para identificación de la dinámica lineal del modelo Hammerstein
experimental
disp('modelación Hammerstein');
tm=input('Ingrese tiempo de muestreo tm:');
te=1200;
re=input('Ingrese valor nominal de la variable manipulable (u) re:');
%posicion de entrada swicth
ps=1;
%Valores por defectodelruido blanco
a=100;
b=10;
HYW1='SI';
ino= re;
outo=POLYVAL(P,re);
if HYW1=='SI'
v=POLYVAL(P,in);
vo=POLYVAL(P,re);
else
v=in;
vo=ino;
end
in=in(te/tm:length(t));
t=t(te/tm:length(t));
v=v(te/tm:length(v));
out=out(te/tm:length(out));
tid2=t(1:1:round(length(t)/2));
in_id_2=v(1:1:round(length(v)/2));in_id_2=in_id_2vo*ones(length(in_id_2),1);
out_id_2=out(1:1:round(length(out)/2));out_id_2=out_id_2outo*ones(length(out_id_2),1);
id2=iddata(out_id_2,in_id_2,'Ts',1);
% Para obtener la mejor validación
satisfaccion=0;
i=0;
while satisfaccion==0
%VALIDACION
t_va2=t(round(length(t)/2)+1:1:round(length(t)));
in_va_2=v(round(length(v)/2)+1:1:round(length(v)));in_va_2=in_va_2vo*ones(length(in_va_2),1);
out_va_2=out(round(length(out)/2)+1:1:round(length(out)));out_va_2=out
_va_2-outo*ones(length(out_va_2),1);
va2=iddata(out_va_2,in_va_2,'Ts',1);
i=i+1;
if i==1
nn=struc([1:10],[1:10],[1:10]);
MV2=arxstruc(id2,va2,nn);
142
nn=selstruc(MV2,'AIC');
else
nn(1)=input('ingrese grado de denominador na:');
nn(2)=input('ingrese grado de numerador nb:');
nn(3)=input('ingrese retardo nk:');
end
figure(2),subplot(2,3,1,'replace'),cla,subplot(2,3,1,'replace'),plot(t
(1:1:round(length(t)/2)),in(1:1:round(length(in)/2))),grid,title('Entr
ada PRS')
hold on
figure(2),subplot(2,3,2,'replace'),cla,subplot(2,3,2,'replace'),plot(t
(1:1:round(length(t)/2)),v(1:1:round(length(v)/2))),grid,title('Variab
le Auxiliar')
hold on
figure(2),subplot(2,3,3,'replace'),cla,subplot(2,3,3,'replace'),plot(t
(1:1:round(length(t)/2)),out(1:1:round(length(out)/2))),grid,title('Re
spuesta del Sistema')
MI2=arx(id2,[nn(1) nn(2) nn(3)],'InitialState','estimate');
[num2 den2]=tfdata(MI2,'v');
[Y2,U2]=dlsim(num2,den2,in_va_2);
Y2=Y2+outo*ones(length(Y2),1);
out_va_2=out_va_2+outo*ones(length(out_va_2),1);
figure(2),subplot(2,1,2),cla,subplot(2,1,2),plot(t_va2,Y2,'r--')
hold on
figure(2),subplot(2,1,2),plot(t_va2,out_va_2),grid
% Índice de prestación
Yv2=out_va_2;
RMS2=sqrt(sum((Y2-Yv2).*(Y2-Yv2))/sum(Y2.*Y2))
MSE2=sum((Y2-Yv2).*(Y2-Yv2))/length(Y2)
FIT2=100*(1 - norm(Yv2 - Y2)/norm(Y2-mean(Y2)))
SS=input('Le satisfase la identificación realizada (S/N):','s');
if SS=='S'
satisfaccion=1;
else
clc
disp('modelación Hammerstein');
disp(sprintf('Los valores de na, nb y nk anteriores son: %i, %i y
%i.',nn(1),nn(2),nn(3)));
disp('Ingrese manualmente los grados del modelo ARX');
disp('A(q) y(t) = B(q) u(t-nk) + e(t)');
end
end
143
Anexo F
Programa para obtención de la ecuación recursiva del control predictivo
generalizado
clear A;clear G;clear Nu;clear Fo;clear D;clear resul;clear resid;
clear F;clear M;clear E;clear P3;clear GG;clear G1;clear Gp,clear G;
clear H;clear MM;clear MW;clear UU;clear T;clear elem YT
%A1 es el denominador de la ft. A es delta A%
A1=[den2];
vstep=0.9677; % valor estacionario de un step aplicado a la ft.
obtenida
B=(1/vstep)*[num2];
A(1)=1;
A(length(A1)+1)=0;
for v=2:1:(length(A1))
A(v)=A1(v)-A1(v-1);
end
A(length(A1)+1)=-A1(length(A1));
D=zeros(1,length(A));
D(1)=1;
Nu=10;
a=1.5;
for i=1:1:Nu
[resul,resid]=deconv(D,[A]);
Fo=resid(i+1:length(resid));
for j=1:1:(length(A)-1)
F(i,j)=Fo(j);
end
M(i)=resul(i);
for k=1:1:i
E(i,k)=M(k);
end
D=resid;
D(1,length(D)+1)=0;
end
for m=1:1:Nu
P3=E(m,1:m);
GG=conv(P3,B);
for n=1:1:length(GG)
G1(m,n)=GG(n);
end
end
for p=1:1:Nu
Gp(p,1)=G1(p,p+1);%vector de GF
for q=1:1:Nu
G(p,q)=G1(p,q);
if q>p
G(p,q)=0;
end
end
end
GG=G
for r=1:1:Nu
for s=1:1:Nu
if r==s
144
m(s)=s;
break
end
end
end
for r=1:1:Nu
for s=0:1:(m(r)-1)
GG(r,s+1)=G(r,m(r)-s);
end
end
G=GG;
H=2*(G'*G+a*eye(Nu))
MM=2*inv(H)*G'
elemMW=MM(1,:)
sum=0;
for i=1:1:length(elemMW)
sum=sum+elemMW(i);
end
UU=MM*Gp;
elemUU=UU(1)
for d=1:1:length(A)-1
T=MM*F(:,d);
elemYT(d)=T(1);
end
aa=P;
aa1=P1;

Documentos relacionados