En esta entrada haremos una introducción al CONTROL MPC calculado por VARIABLES de ESTADO, así que estante atento y mira el código de ejemplo que vemos al final de este post.
Antes de Comenzar, podría interesarte ver el CURSO GRATUITO DE MPC
MPC por Variables de Estado
Antes que nada, será importante de que entiendas que son y como se representan las variables de estado, y esa información ya esta disponible en este sitio web.
Se comienza describiendo una planta SISO descrita por:
Donde
Debemos adaptar nuestro modelo en espacio de estados para que cumpla el proposito del diseño en el que se incluye un integrador.
Tenga en cuenta que una formulación general de un modelo de espacio de estado tiene un término directo de la señal de entrada
Como siempre asumimos que la entrada
Aplicando una operación de diferencia en ambos lados de la ecuacion, tenemos que:
Podemos expresar esas diferencias en terminos de incrementos:
Note que como ahora la entrada en espacio de estados es
De esta forma la salida del sistema es descrita por:
Reemplazando
Colocando juntos la ecuación (1) y (2) tenemos la siguiente representación en espacio de estados:
Donde
Veamos entonces como sucede la predicción de los estados:
Seguidamente veremos como es que sucede la predición de salida:
Todas las predicciones son formuladas en terminos de las variables de estado actuales
Para un caso SISO la dimensión de Y será
De forma compacta, las predicciones de salida las podemos represenar como:
Donde:
En este punto te podría interesar estos temas:
Control Predictivo Basado en Modelo – DMC
NMPC Usando Modelos de Hammerstein
MPC Toolbox usando Matlab y Simulink
FUNCIÓN OBJETIVO
Tenemos la siguiente función objetivo que deseamos minimizar. La función es similar a la vista en el DMC y GPC:
Donde
Para el caso sin restricción solo basta con cumplir con:
Realizando el mismo procedimiento empleado en la entrada del DMC y GPC, el incremento de control para el caso sin restricciones se reduce a:
donde el termino
Recordando que solo me interesa la primera fila de esta matriz.
Asi mi incremento de control que debe ser calculado en cada interacción es:
Caso con Restricciones
Para el caso restricto partimos de la función de costo, y aplicamos el mismo concepto visto en la clase de las restricciones del MPC.
Sabemos que
Desarrollando tenemos que:
Multiplico por (1/2)
Código de Implementación (MATLAB code)
A continuación se muestra un ejemplo en MATLAB de como implementar el MPC en espacio de estados, para poder ver el código debes compartir el contenido de este post y así ayudar a que la pagina siga creciendo. Gracias por contribuir con el sitio web.
[sociallocker id=948]
Diseñar un control predictivo por variables de estado para el siguiente sistema:
% Sergio Andres Castaño Giraldo
% http:// controlautomaticoeducacion.com
% ____________________________________________________________________
%
clc
clear all
close all
p=menu('EEMPC','Con Restricciones','Sin Restricciones');
%Parametros de Sintonia del MPC
Np=20; %Horizonte de prediccion
Nc=4; %Horizonte de Control
lambda=1; %Parametro de ponderacion
delta=1; %Parametro de ponderacion
Ql=eye(Nc)*lambda; %Matriz de Ponderacion
Qd=eye(Np)*delta;
%Variables de Estado caso Integrador
%X(k+1)=AX(k)+Bu(k)
Am=[1 1;0 1];
Bm=[0.5;1];
Cm=[1 1];
Na=size(Am);
Om=zeros(1,Na(1)); %Numero de zeros para completar la matriz aumentada
%Espacio de estados
A=[Am Om';Cm*Am 1];
B=[Bm;Cm*Bm];
C=[Om 1];
%Calculo de la matriz G y vector de respuesta libre F
h(1,:)=C; %Auxiliar para calcular G
F(1,:)=C*A; %Calculo del vetor F
for kk=2:Np
h(kk,:)=h(kk-1,:)*A; %Voy calculado C*A aumentando el indice de A
F(kk,:)= F(kk-1,:)*A; %Voy aumentando el indice de A
end
v=h*B; %Multiplico por B para obter la primera columna de G
G=zeros(Np,Nc); %Creo la Matriz G
G(:,1)=v; %Coloco los datos en la matriz G
for i=2:Nc
G(:,i)=[zeros(i-1,1);v(1:Np-i+1,1)]; %Expando em toda la Matriz G
end
%% Loop de Controle
%% inicializa parametros de Simulacion
nit=160; %Numero de interacciones
inc_u=0;
u_ant(1:10) = 0;
u(1:20) = 0; ym(1:20) = 0; r(1:20) = 0;
% Referência
r(5:40) = 1; r(41:80) = 3; r(81:120) = 6; r(120:nit) = 2;
[n,n_in]=size(B); %Salvo a dimenção de B
xm=[0;0]; %Estados iniciales del Processo
Xf=zeros(n,1); %Realimentacion de estados
y=0;
for k=2:nit;
ym(k)=y;
%----------- Restriccion en la Señal de Control -----------------%
Triang=tril(ones(Nc));
T=ones(Nc,1);
u_max=0.3*ones(Nc,1);
u_min=-0.3*ones(Nc,1);
%----------- Restriccion en la salida (estados) -----------------%
x_max=5*ones(Np,1);
x_min=-5*ones(Np,1);
a=[Triang; -Triang;G;-G];
b=[u_max-T*u(k-1); T*u(k-1)-u_min;x_max-F*Xf; F*Xf-x_min];
H=(G'*Qd*G+Ql);
Fo=(F*Xf-r(k)*ones(Np,1))'*Qd*G;
%Calculo del Control
if p==1
%---------------------------Con restriccion --------------------------
options = optimset('LargeScale','off');
[x,fval,exitflag] = quadprog(H,Fo,a,b,[],[],[],[],[],options);
inc_u=x(1);
end
if p==2
%---------------------------Sin restriccion --------------------------
Mn=inv(H)*G'*Qd;
K1=Mn(1,:); %Tomo a primeira linha del incremento de control
inc_u=K1*(r(k)-F*Xf); %Incremento de control
end
%-----------------------------------------------------------------------------------
u(k)=u(k-1)+inc_u; %Calculo de la ley de control
xm_old=xm; %Guardo los estados anteriores
xm=Am*xm+Bm*u(k); %Calculo los estados actuales
y=Cm*xm; %Salida atual
Xf=[xm-xm_old;y]; %Calculo los estados realimentados
end
nm=nit;
t = 0:T:(nm-1)*T;
figure
subplot(2,1,1)
stairs(t,r,'--k','Linewidth',2),hold on
stairs(t,ym,'-r','Linewidth',2)
xlabel('Tempo (s)');
ylabel('Saida');
legend('y_r','y','Location','SouthEast')
grid on;
hold
subplot(2,1,2)
stairs(t,u,'b','Linewidth',2)
xlabel('Tempo (s)');
ylabel('Controle');
legend('u')
grid on;
[/sociallocker]
Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:
👉 Invitar a Sergio a un Café ☕️
Que esten muy bien, nos vemos en la siguiente entrada.
Citar este Artículo
¡Hola! Soy Sergio Andrés Castaño Giraldo. Bienvenidos a Control Automático Educación, un espacio dedicado a una de mis grandes pasiones: la Ingeniería de Control y la Automatización.
Mi objetivo aquí es tender un puente entre la teoría académica y la práctica profesional. Como profesor e investigador, he tenido la oportunidad de trabajar en proyectos complejos —desde sistemas de compresión en plataformas offshore hasta modelos de control avanzado— y todo ese aprendizaje lo vuelco en este sitio.
Aquí encontrarás material que crece constantemente: desde fundamentos de instrumentación hasta estrategias de control avanzado y programación profesional. Mi meta es que la información que comparto te sea de utilidad real en tu carrera o formación.
Te invito a que te suscribas, te unas a nuestro canal de YouTube y formemos una comunidad de aprendizaje continuo. ¡Gracias por estar aquí!