Restricciones en el MPC

Restricciones en el MPC

Restricciones en el MPC
CALIFICA EL POST

Como habíamos mencionado en vídeos pasados, los procesos de una industria presentan un sin numero de restricciones, los cuales debemos involucrar en nuestro proyecto de control predictivo.

 

Video aula en Youtube

Función de Costo

Recordando la función de costo vista en el video del  GPC, debíamos minimizarla usando la función de quadprod de Matlab:

 

Sin Restricción

\nabla J = 0 \to \Delta u = K(w - f)

con

K ={({G^T}{Q_\delta }G + {Q_\lambda })^{ - 1}}{G^T}{Q_\delta } (Primera fila de la matiz)

 

Con Restricción

Para usar un problema con restricciones debemos usar un algoritmo de programación cuadrática que considere las restricciones dentro de mi función de optimización, para eso debemos usar la siguiente formulación patrón, y así toda restricción que deseemos involucrar en la optimización, debemos expresarla de las formas que establece dicha función patrón siempre en función del incremento de control. Las restricciones pueden ser de desigualdad o de igualdad.

J =\dfrac{1}{2}\Delta {u^T}H\Delta u + {f_0}^T\Delta u

 

s.a\ A\Delta u \le b\\{A_{eq}}\Delta u = {b_{eq}}

con

H = {G^T}{Q_\delta }G + {Q_\lambda }\\

 

{f_0} = {(f - w)^T}{Q_\delta }G

 

Comencemos viendo diferentes tipos de restricciones que podemos involucrar en el MPC.

 

Restricción en el incremento de la acción de control

Cualquier técnica MPC considera las restricciones en la ley de control.

La restricción del incremento de control esta definida como:

{u_{min}} \le \Delta u \le {u_{max}}

Esa restricción debemos expresarla en la forma de desigualdad que se mostró en la ecuación patrón osea:

A\Delta u \le b

Tomemos el primer intervalo:

\Delta u \le {u_{max}}

Representandolo de forma matricial tenemos:

\left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  1\\  0  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  0  \end{array}}  \end{array}}&{\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  0\\  1  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  0  \end{array}}  \end{array}}  \end{array}}&{\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  \ldots \\  \ldots  \end{array}}\\  {\begin{array}{*{20}{c}}  \ddots \\  \ldots  \end{array}}  \end{array}}&{\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  0\\  0  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  1  \end{array}}  \end{array}}  \end{array}}  \end{array}} \right]\left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\Delta u(k)}\\  {\Delta u(k + 1)}  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  {\Delta u(k + {N_u} - 1)}  \end{array}}  \end{array}} \right] \le \left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {{u_{max}}}\\  {{u_{max}}}  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  {{u_{max}}}  \end{array}}  \end{array}} \right]

Entonces tenemos que para el incremento de control máximo esta dado por:

{I_{{N_u} \times {N_u}}}\Delta u \le {u_{max}}1

Por otro lado tomando la restricción del incremento de control mínimo:

{u_{min}} \le \Delta u

en forma matricial tendríamos que

\left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  1\\  0  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  0  \end{array}}  \end{array}}&{\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  0\\  1  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  0  \end{array}}  \end{array}}  \end{array}}&{\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  \ldots \\  \ldots  \end{array}}\\  {\begin{array}{*{20}{c}}  \ddots \\  \ldots  \end{array}}  \end{array}}&{\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  0\\  0  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  1  \end{array}}  \end{array}}  \end{array}}  \end{array}} \right]\left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\Delta u(k)}\\  {\Delta u(k + 1)}  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  {\Delta u(k + {N_u} - 1)}  \end{array}}  \end{array}} \right] \ge \left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {{u_{min}}}\\  {{u_{min}}}  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  {{u_{min}}}  \end{array}}  \end{array}} \right]

en forma reducida podemos expresarlo como:

{I_{{N_u} \times {N_u}}}\Delta u \ge {u_{min}}1

Como el sentido de la desigualdad para el caso del incremento de control mínimo no es el mismo que el de la formula patrón, multiplicamos por menos uno en ambos lados de la desigualdad para cambiarle el sentido a la misma:

( - {I_{{N_u} \times {N_u}}})\Delta u \le ( - 1{u_{min}})

Asi conseguimos llevarla a la misma representación. Por último vamos a mezclar los dos extremos de cada restricción en una restricción única.

Creo una matriz con un bloque de matrices identidades, multiplicado por \Delta u menor igual un bloque de vectores de Umaximos sobre un bloque de vectores de Uminimos asi:

\left[ {\begin{array}{*{20}{c}}  I\\  \ldots \\  { - I}  \end{array}} \right]\Delta u \le \left[ {\begin{array}{*{20}{c}}  {1{u_{max}}}\\  \ldots \\  { - 1{u_{min}}}  \end{array}} \right]

Y listo conseguimos representar la restricción de desigualdad del incremento de control.

Restricción en la señal de control

{u_{min}} \le u\left( k \right) \le {u_{max}}\ \ \ \forall k \in [0,{N_{u - 1}})

Podemos representar en forma matricial la ley de control

1{u_{min}} \le \left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  1\\  1  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  1  \end{array}}  \end{array}}&{\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  0\\  1  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  1  \end{array}}  \end{array}}  \end{array}}&{\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  \ldots \\  \ldots  \end{array}}\\  {\begin{array}{*{20}{c}}  \ddots \\  \ldots  \end{array}}  \end{array}}&{\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  0\\  0  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  1  \end{array}}  \end{array}}  \end{array}}  \end{array}} \right]\left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\Delta u\left( k \right)}\\  {\Delta u\left( {k + 1} \right)}  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  {\Delta u\left( {k + {N_u} - 1} \right)}  \end{array}}  \end{array}} \right] + \left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {u(k - 1)}\\  {u(k - 1)}  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  {u(k - 1)}  \end{array}}  \end{array}} \right] \le {u_{max}}1

De forma rápida, podemos representar la matriz triangular inferior que acompaña el incremento de control como T, asi la restricción está representada por:

\left[ {\begin{array}{*{20}{c}}  T\\  \ldots \\  { - T}  \end{array}} \right]\Delta u \le \left[ {\begin{array}{*{20}{c}}  {1{u_{max}} - 1u(k - 1)}\\  \ldots \\  { - 1{u_{min}} + 1u(k - 1)}  \end{array}} \right]

Hasta aca, las restricciones vistas son definidas por el propio controlador. Osea el mismo controlador sabe cuales van a ser sus limitaciones para aplicar sobre el proceso. Por otro lado si pensamos en las restricciones de la salida de la planta, esa restricción será basada en el modelo.

Restricciones en la salida

Como las restricciones son hechas en base al modelo, debemos asegurarnos de tener un muy buen modelo para garantizar que las restricciones de salida sean cumplidas.

La restricción de salida debe representarse en función de ∆u

{y_{min}} \le y\left( k \right) \le {y_{max}}\ \ \forall k \in [{N_1},{N_2})

sabemos que la salida se representa por:

\begin{array}{l}  y = G\Delta u + f\\  1{y_{min}} \le G\Delta u + f \le 1{y_{max}}\\  1{y_{min}} - f \le G\Delta u \le 1{y_{max}} - f  \end{array}

Asi la restricción viene dada por:

\left[ {\begin{array}{*{20}{c}}  G\\  \ldots \\  { - G}  \end{array}} \right]\Delta u \le \left[ {\begin{array}{*{20}{c}}  {1{y_{max}} - f}\\  \ldots \\  { - 1{y_{min}} + f}  \end{array}} \right]

Restricción de sobre impulso

Esta restricción típicamente actúa únicamente cuando hay cambios de referencia.

y\left( k \right) \le w\left( k \right)\ \ o\ \ y\left( k \right) \ge w\left( k \right)\ \ \ \forall k \in [{N_{01}},{N_{02}}]

Si la referencia es positiva, siempre la variable debe ser menor que la referencia, si la referencia es negativa, la variable será mayor que la referencia. O sea que la restricción siempre va a depender del sentido de la referencia.

Generalmente se define un intervalo N01 y N02. Pues normalmente la restricción debe ser aplicado cuando la variable se acerca  a la referencia, y no es necesario usar mi algoritmo de búsqueda desde las primeros periodos de muestreo. Si no supiera definir esos horizontes, puedo tomar todo el horizonte completo, la única diferencia es que mi algoritmo va a tener que calcular todo el horizonte completo sin necesidad.

\left[ {\begin{array}{*{20}{c}}  G\\  \ldots \\  { - G}  \end{array}} \right]\Delta u \le \left[ {\begin{array}{*{20}{c}}  {1w(k) - f}\\  \ldots \\  { - 1w(k) + f}  \end{array}} \right]

Comportamiento Monotonico

Se fuerza a que la respuesta tenga un comportamiento estrictamente creciente o estrictamente decreciente.

\begin{array}{l}  y\left( {k + j} \right) \le y\left( {k + j + 1} \right)\ \ si\ \ y\left( k \right) < w(k)\\  y\left( {k + j} \right) \le y\left( {k + j - 1} \right)\ \ si\ \ y\left( k \right) > w(k)  \end{array}

Para el caso estrictamente creciente se tiene que:

\left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {y\left( k \right)}\\  -  \end{array}}\\  {y'}  \end{array}} \right] \le y

El y(k) seria la salida actual y y’ seria el vector y(k)  sin⁡  la ultima fila.

-\left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {{G_o}}\\  {{G_1} - {G_o}}  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  {{G_{N - 1}} - {G_{N - 2}}}  \end{array}}  \end{array}}&{\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  0\\  {{G_o}}  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  {{G_{N - 2}} - {G_{N - 3}}}  \end{array}}  \end{array}}  \end{array}}&{\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  \ldots \\  \ldots  \end{array}}\\  {\begin{array}{*{20}{c}}  \ddots \\  \ldots  \end{array}}  \end{array}}&{\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  0\\  0  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  {{G_o}}  \end{array}}  \end{array}}  \end{array}}  \end{array}} \right]\Delta u \le - \left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {y\left( k \right) - {f_1}}\\  {{f_1} - {f_2}}  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  {{f_{N - 1}} - {f_N}}  \end{array}}  \end{array}} \right]

Restricción Terminal

  • En esta restricción se especifica que al final del horizonte se tenga un comportamiento especifico, por ejemplo:
  • y(k)=w(k)
  • Su ventaja, es que puedo garantizar que mi variable va a seguir la referencia
  • Desventaja, puede ser que no sea factible. Por ejemplo que sea físicamente imposible alcanzar la referencia. Tambien, por ejemplo si tuviera un horizonte pequeño digamos 4 muestras, no voy a poder garantizar que en esas 4 muestras voy a alcanzar la referencia. Por otro lado si tengo un horizonte de control pequeño, el va a tener una variación de la acción de control muy brusca
\begin{array}{l}  y = w\\  y(k + {N_2}) = w(k + {N_2})\\  y = G\Delta u + f\\  \left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {{g_1}}&0\\  {{g_2}}&{{g_1}}  \end{array}}&{\begin{array}{*{20}{c}}  \ldots &0\\  \ldots &0  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots & \vdots \\  {{g_P}}&{{g_{P - 1}}}  \end{array}}&{\begin{array}{*{20}{c}}  \ddots & \vdots \\  \ldots &{{g_1}}  \end{array}}  \end{array}} \right]\left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\Delta u(t)}\\  {\Delta u(t + 1)}  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  {\Delta u(t + P - 1)}  \end{array}}  \end{array}} \right] + \left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {f(t + 1)}\\  {f(t + 2)}  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  {f(t + P)}  \end{array}}  \end{array}} \right] = \left[ {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {w(t + 1)}\\  {w(t + 2)}  \end{array}}\\  {\begin{array}{*{20}{c}}  \vdots \\  {w(t + P)}  \end{array}}  \end{array}} \right]  \end{array}

Esta es una restricción de IGUALDAD, entonces solo tomamos la ultima fila de  las matrices, ya que eso son los datos del final del horizonte, llamamos estas filas como \tilde G\tilde f\tilde w.

 

{A_{eq}} = \tilde G

 

b = \tilde 1w - \tilde f

 

Código

A continuación se muestra un código ilustrativo de como programar las restricciones en MATLAB

Código de Implementación:

Para ver el código de implementación debes compartir el contenido de este post, de esa forma ayudaras con que este sitio web pueda seguir continuando en pie brindando mucho más contenido gratuito.

 

Si te gusto la información no olvides en compartir en redes sociales, también te puedes sucribir a mi canal de youtube o darle me gusta a mi pagina en Facebook.

Comparte en Redes Sociales

 

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.




Deja un comentario

Menú de cierre