En esta entrada vamos a aprender como involucrar el modelo de perturbaciones conocidas en la estructura del GPC y con esto podriamos pensar en realizar con control con acción FeedForward.
Para el caso de un control convencional tenemos la siguiente representación:
Si tengo un sensor que mida la entrada q, podría hacer un controlador para ayudar al control principal para rechazar esa perturbación. En otras palabras podría realizar un control FeedForward.
El problema de esta abordaje, es que muchas veces ese bloque FeedForwrd muchas veces no es realizable, por ejemplo si el sistema G fuera de fase no mínima, el sistema se volvería inestable, o si tuviera más polos en G que en Gq, va a quedar con más ceros y por ende queda No realizable. Pero en términos generales, si yo consigo llevar mi sistema a esta forma, voy a poder rechazar mis perturbaciones de una mejor forma
En el control GPC, tendremos que modificar el modelo CARIMA para poder incluir el efecto de la perturbación. Esto quiere decir que básicamente el control GPC no cambia, solo que ahora con ayuda de mi modelo, el controlador tendrá que efectuar las predicciones teniendo en consideración la presencia de una perturbación medible dentro del lazo de control.
![]()
Veamos un Ejemplo con dos funciones de transferencia, una para la perturbación y otra para la planta:
![]()
![]()
Vemos que como en este caso, los denominadores NO son iguales, debemos obtener un polinomio común para que sea nuestro polinomio A, asi los polinomios A,B y C quedan como:
![]()
![]()
![]()
Multiplicando el modelo CARIMA por
las predicciones pasan a ser>
![]()
![]()
![]()
El término
puede contener información de perturbaciones pasadas y de perturbaciones futuras. Veamos que la perturbación es algo conocido, si bien puede que yo no conozca las perturbaciones futuras, eventualmente voy a terminar conociéndolas cuando entren al sistema, así entonces yo colocaría las perturbaciones futuras igual a cero (En el caso de no conocerlas) y voy a tener valores de perturbación pasada. Osea que las perturbaciones van a pertenecer únicamente a la respuesta FORZADA del sistema.
Sabemos que por definición la respuesta forzada es la respuesta provocada por una variación de la señal de control. Osea que las perturbaciones NO van a provocar nada en la variación de control, por eso es respuesta libre.
![]()
Donde
son los terminos del futuro (Si no se conocen entonces se coloca
)
son los terminos del pasado.
es igual que el
solo que con los coeficientes de la perturbación con una excitación del tipo escalón
Sabemos que las predicciones viene dado por:
![]()
![]()
es la respuesta libre normal del MPC
Si te sirvió de algo la información de la pagina, podrías invitarme a un café y ayudarme a seguir manteniendo en pie el sitio WEB. Solo cuesta $2USD y me ayudarías enormemente a seguir con mi trabajo. Muchas Gracias por tu visita.
Ejemplo
Proyectar un control predictivo GPC teniendo en consideración la perturbación medible del sistema. La función de transferencia del proceso, cuanto de la perturbación se describen a contrinuación:
![]()
![]()
Código de implementación:
Recuerda que para poder visualizar el código de implementación, debes compartir el contenido de este post con cualquiera de los siguientes 3 botones, así ayudas a que más personas se beneficien de esta información.
[sociallocker id=948]
%% Control GPC
% Sergio Andres Castaño G.
% controlautomaticoeducacion.com
%___________________________________________________________________
clc
clear all
close all
p= menu('Perturbacion','Conocida','No Conocida');
T=2;
Ap=[1 -0.835];
Bp=[0 0.271];
Dq=[0 0.05];
Aq=[1 -0.9];
dm=2;
dq=2;
fz=filt(Bp,Ap,T);
fz.iodelay=dm
fzq=filt(Dq,Aq,T);
fzq.iodelay=dq
%Minimo Comun Multiplo de los polinomios A,B,D
D=conv(Ap,Dq);
A=conv(Ap,Aq);
B=conv(Bp,Aq);
%% Parametros de sintonia del GPC
N=10; %Horizonte de Prediccion
N1=dm+1; %Horizonte Inicial
N2=dm+N; %Horizonte final
Nu=5; %Horizonte de Entrada
lambda=1; %Parametro de ponderacion del Control
delta=1; %Parametro de ponderacion del seguimiento a referencia
%Matrices de Ponderacion
Ql=eye(Nu)*lambda;
Qd=eye(N)*delta;
%% Calculo de la ecuacion Diofantina
[En,F] = diophantine(A,N2,0); %Calculo de la funcion Diofantina
E=En(end,:); %Polinomio E seria la ultima fila arrojada por la funcion
F=F(N1:N2,1:end);
%% Determina los coeficientes de control pasados
%Elimino el cero de la primera posicion de B
if B(1)==0
B=B(2:end);
end
uG=zeros(N,N1); %Vector de controles pasados (Pertenece a la respuesta libre)
Fq=zeros(N,N1); %Vector de perturbaciones pasadas (Pertenece a la respuesta libre)
j=2;
for i=N1:N2
aux=conv(En(i,:),B);
aux1=conv(En(i,:),D);
if length(aux) < N1+j-1 %Si la longitud del auxiliar es menor que j
aux=[aux zeros(1,(N1+j-1)-length(aux))]; %Completar con ceros
end
if length(aux1) < N1+j-1 %Si la longitud del auxiliar es menor que j
aux1=[aux1 zeros(1,(N1+j-1)-length(aux1))]; %Completar con ceros
end
uG(j-1,1:N1)=aux(j:N1+j-1); %Controles pasados (B siempre comienza en un instante atras)
Fq(j-1,1:N1+1)=aux1(j:N1+j); %Perturbaciones pasada (D puede comenzar desde el instante actual)
j=j+1;
end
g=conv(E,B); %Calcula polinomio g
Lj=conv(D,E); %Calcula polinomio Lj
G=zeros(N,Nu); % Inicializa la matriz G
%Crio a Matriz L (Coeficientes Da perturbação)
L=zeros(N,Nu);
for k=1:Nu
G(k:end,k)=g(1:N-k+1); % Forma a matriz G
L(k:end,k)=Lj(1:N-k+1); % Forma a matriz L
end
Mn=inv(G'*Qd*G+Ql)*G'*Qd; %Calculo de la Funcion de Costo sin Restriccion
%Calculo do controldor K1 (Primeira fila de Mn)
K1=Mn(1,:);
%% Loop de Controle
%% inicializa parametros de Simulacion
nit=120; %Numero de interacciones
inc_u=0;
u_ant(1:10) = 0;
u(1:20+dm) = 0; ym(1:20+dm) = 0; r(1:20+dm) = 0;
% Referência
r(20:nit) = 1;
%Perturbacion
q(1:40)= 0;q(41:80) = 2;q(81:nit) = 0;
lduf=size(F,2); %Averiguo la longitud del polinomio F
luG=size(uG,2); %Longitud de uG
duf=zeros(1,luG); %Vector incrementos de control pasados libre
lFq=size(Fq,2); %Longitud de Fq
dqp=zeros(1,lFq); %Delta de Q pasados (Entrada de perturbacion pasadas)
% Determino las magnitudes de los polinomios
na=size(A,2);
nd=size(D,2);
nb=size(B,2);
%Creo los vectores que van a almacenar las acciones pasadas
y_ant=zeros(1,na);
u_ant=zeros(1,nb);
q_ant=zeros(1,nd);
dqf=zeros(1,Nu); %Los DeltaQ futuros
for k=5+dm:nit
% Salida del proceso
ym(k)=B*u_ant'-A(2:na)*y_ant(1:na-1)'+D*q_ant';
%Actualizo vector de salidas pasadas
%y_ant=[y(k-1) y(k-2) y(k-3) ......]
if na==1
y_ant=ym(k);
else
aux=y_ant(1:na-1);
y_ant=[ym(k) aux];
end
% Calculo de la Respuesta Libre
f1=uG*duf'; %Controles pasados
f2=(y_ant*F')'; %Salidas Pasadas
f3=Fq*dqp'; %Perturbaciones pasadas
f4=L*dqf'; %Perturbaciones Futuras
free=f1 + f2 + f3 + f4;
%Calculo do Controle
%Projeto onde nao tenho as referencias futuras
inc_u=K1*(r(k)-free);
if k==1
u(k)=inc_u;
else
u(k)=u(k-1)+ inc_u;
end
% actualiza vector de control
%u_ant=[u(k-d) u(k-1-d) u(k-2-d) ..... ]
aux=u_ant(1:nb-1);
u_ant=[u(k-dm) aux];
%actualiza duf (incrementos de control)
% duf= [du(k-1) du(k-2) ..... du(k-N)]
aux=duf(1:end-1);
duf=[inc_u aux];
%_______________________________________________________________________%
%Actualizo vector de perturbaciones pasadas
%y_ant=[y(k-1) y(k-2) y(k-3) ......]
if na==1
q_ant=q(k-dq);
else
aux=q_ant(1:nd-1);
q_ant=[q(k-dq) aux];
end
%Calcula el incremento de la Perturbacion
inc_q=q(k)-q(k-1);
%Calculo los incrementos de la perturbacion futura
if p==1 && k<=nit-length(dqf)
for i=1:length(dqf)
dqf(i)=q(k+i)-q(k+i-1);
end
end
%Actualiza los incrementos de la perturbacion pasados
aux=dqp(1:end-1);
dqp=[inc_q aux];
%_______________________________________________________________________%
end
nm=nit;
t = 0:T:(nm-1)*T;
figure(1)
subplot(2,1,1),plot(t,r,'--k',t,ym,'-r','Linewidth',2)
hold on
subplot(2,1,2),plot(t,u,'b','Linewidth',2)
hold on
grid on;
%% inicializa parametros de Simulacion
inc_u=0;
u_ant(1:10) = 0;
u(1:20+dm) = 0; ym(1:20+dm) = 0; r(1:20+dm) = 0; y1(1:20+dm) = 0;y2(1:20+dm) = 0;
% Referência
r(20:nit) = 1;
%Perturbacion
q(1:40)= 0;q(41:80) = 2;q(81:nit) = 0;
lduf=size(F,2); %Averiguo la longitud del polinomio F
luG=size(uG,2); %Longitud de uG
duf=zeros(1,luG); %Vector incrementos de control pasados libre
lFq=size(Fq,2); %Longitud de Fq
dqp=zeros(1,lFq); %Delta de Q pasados (Entrada de perturbacion pasadas)
% Determino las magnitudes de los polinomios
na=size(A,2);
nd=size(D,2);
nb=size(B,2);
%Creo los vectores que van a almacenar las acciones pasadas
y_ant=zeros(1,na);
u_ant=zeros(1,nb);
q_ant=zeros(1,nd);
dqf=zeros(1,Nu); %Los DeltaQ futuros
for k=5+dm:nit
% Salida del proceso
ym(k)=B*u_ant'-A(2:na)*y_ant(1:na-1)'+D*q_ant';
%Actualizo vector de salidas pasadas
%y_ant=[y(k-1) y(k-2) y(k-3) ......]
if na==1
y_ant=ym(k);
else
aux=y_ant(1:na-1);
y_ant=[ym(k) aux];
end
% Calculo de la Respuesta Libre
f1=uG*duf'; %Controles pasados
f2=(y_ant*F')'; %Salidas Pasadas
free=f1 + f2;
%Calculo do Controle
%Projeto onde nao tenho as referencias futuras
inc_u=K1*(r(k)-free);
if k==1
u(k)=inc_u;
else
u(k)=u(k-1)+ inc_u;
end
% actualiza vector de control
%u_ant=[u(k-d) u(k-1-d) u(k-2-d) ..... ]
aux=u_ant(1:nb-1);
u_ant=[u(k-dm) aux];
%actualiza duf (incrementos de control)
% duf= [du(k-1) du(k-2) ..... du(k-N)]
aux=duf(1:end-1);
duf=[inc_u aux];
%_______________________________________________________________________%
%Actualizo vector de perturbaciones pasadas
%y_ant=[y(k-1) y(k-2) y(k-3) ......]
if na==1
q_ant=q(k-dq);
else
aux=q_ant(1:nd-1);
q_ant=[q(k-dq) aux];
end
%_______________________________________________________________________%
end
figure(1)
hold on
nm=nit;
t = 0:T:(nm-1)*T;
subplot(2,1,1),plot(t,ym,'-g',t,q,'--b','Linewidth',2)
xlabel('Tempo (s)');
ylabel('Saida');
legend('Ref','Y_{GPC-Pert}','Y_{GPC}','q(k)','Location','SouthEast')
grid on;
hold on
subplot(2,1,2),plot(t,u,'r','Linewidth',2)
xlabel('Tempo (s)');
ylabel('Controle');
legend('uq','u')
grid on;
[/sociallocker]
Si te sirvió de algo la información de la pagina, podrías invitarme a un café y ayudarme a seguir manteniendo en pie el sitio WEB. Solo cuesta $2USD y me ayudarías enormemente a seguir con mi trabajo. Muchas Gracias por tu visita.
Mi nombre es Sergio Andres Castaño Giraldo, y en este sitio web voy a compartir una de las cosas que mas me gusta en la vida y es sobre la Ingeniería de Control y Automatización. El sitio web estará en constante crecimiento, voy a ir publicando material sobre el asunto desde temas básicos hasta temas un poco más complejos. Suscríbete al sitio web, dale me gusta a la página en Facebook y únete al canal de youtube. Espero de corazón que la información que comparto en este sitio, te pueda ser de utilidad. Y nuevamente te doy las gracias y la bienvenida a control automático educación.


