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;