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 es la entrada o variable manipulada, es la salida del proceso y es el vector de estados de dimensión .
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 a la salida como:
Como siempre asumimos que la entrada no afecta la salida en el mismo tiempo por el principio de horizonte deslizante. Con esto se dice que .
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 debemos relacionar con la salida . Esto es fácil creando un nuevo vector de estados:
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 de dimensión y las matrices A,B,C son conocidas como las matrices aumentadas, las cuales son empleadas para el diseño del control predictivo.
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 y del futuro en el movimiento de control donde . Asi se definen los vectores como:
Para un caso SISO la dimensión de Y será y la dimensión de será .
De forma compacta, las predicciones de salida las podemos represenar como:
Donde:
En este punto te podría interesar estos temas:
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 es el vector que contiene las referencias, es la referencia actual, es la matriz de ponderación del error de seguimiento y es la matriz de ponderación del incremento de control.
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 puedo calcularlo una sola vez y reducirlo a una ganancia:
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 , entonces reemplazamos
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.
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.