Saltar al contenido

MPC Toolbox usando Matlab y Simulink

El Control Predictivo Basado en Modelo (MPC) es una técnica avanzada que se utiliza para predecir y optimizar la respuesta de sistemas dinámicos a lo largo del tiempo. MATLAB ofrece el MPC Toolbox, que permite implementar controladores predictivos tanto lineales como no lineales (NMPC), y realizar simulaciones en MATLAB y Simulink. Estas herramientas son esenciales para diseñar y sintonizar controladores en sistemas con múltiples entradas y salidas (MIMO).

En este artículo, veremos cómo usar el MPC Toolbox de MATLAB para implementar controladores predictivos, tanto en su versión lineal como en la no lineal (NMPC). Explicaremos cómo realizar simulaciones en MATLAB y Simulink, y presentaremos un caso práctico basado en el Shell Heavy Oil Fractionator para la versión lineal, y el Reactor Van de Vusse para la versión no lineal. Además, compartiré recursos adicionales, como el código completo disponible en mi Github:

Configuración del MPC en MATLAB: Código Paso a Paso

Para comenzar a usar el MPC Toolbox en MATLAB, es esencial configurar correctamente el sistema y el controlador. Aquí te dejo un ejemplo de cómo hacerlo desde cero, empleando directamente código en MATLAB. Este código te permitirá trabajar tanto con un sistema nominal como con un modelo con incertidumbres, y podrás elegir entre realizar la simulación en MATLAB o en Simulink.

El proceso que modelamos es un sistema MIMO 3×3 basado en la planta Shell Heavy Oil Fractionator. Utilizamos una función de transferencia para describir la dinámica del sistema, con incertidumbres tanto en las ganancias como en los tiempos de retardo. Esto refleja un modelo robusto que puede ajustarse a diferentes condiciones reales, tal como se haría en un entorno industrial.

Aquí está el modelo básico del sistema con su retardo y las respectivas entradas y salidas:

Psr = [tf(4.05,[50 1]), tf(1.77,[60 1]), tf(5.88,[50 1]);
       tf(5.39,[50 1]), tf(5.72,[60 1]), tf(6.9,[40 1]);
       tf(4.38,[33 1]), tf(4.42,[44 1]), tf(7.2,[19 1])];
Lr = [27 28 27;18 14 15;20 22 0]; % Delay matrix
Psr.iodelay = Lr;

Este modelo se discretiza usando un periodo de muestreo de 4 segundos, lo cual es adecuado para las dinámicas de este proceso:

Ts = 4.0;
Pz = c2d(Psr, Ts, 'zoh');

Una parte crucial de esta implementación es la sintonización del controlador MPC, lo que implica definir horizontes de predicción, restricciones y pesos en el control. Es aquí donde entra en juego la experiencia personal, ya que sintonizar un MPC no es trivial, pero he desarrollado un código que facilita este proceso y lo puedes encontrar en mi repositorio de GitHub.

Uso de Simulink para la Simulación de Sistemas Controlados por MPC

Simulink es una excelente herramienta de simulación gráfica que permite visualizar y simular sistemas dinámicos de forma intuitiva. Si prefieres trabajar con diagramas de bloques en lugar de código, el MPC Toolbox también es compatible con Simulink. En mi tutorial de video, te muestro cómo configurar una simulación en Simulink para el mismo sistema MIMO 3×3.

Para comenzar, creamos un modelo en Simulink y agregamos un bloque de MPC Controller. Este bloque se conecta con los bloques que representan el proceso y las entradas/salidas del sistema.

En el siguiente paso, se configuran las entradas del sistema como variables manipuladas (MV) y las salidas como variables de salida (OV). Usamos la misma lógica que en el código de MATLAB, pero aquí puedes visualizar la interacción en tiempo real entre el controlador y el proceso.

sysd = setmpcsignals(Pze, MV=[1;2;3]);
mpc_toolbox = mpc(sysd, Ts);

El uso de Simulink facilita la simulación de sistemas complejos en tiempo real, permitiendo observar cómo responde el sistema a cambios en las entradas o perturbaciones externas. A través del tutorial, verás cómo configurar cada bloque para representar un proceso realista.

Simulaciones Comparativas: MATLAB vs Simulink

En mi experiencia, he encontrado que tanto MATLAB como Simulink tienen sus ventajas para la simulación de controladores MPC. MATLAB es más adecuado para quienes prefieren trabajar directamente con código y realizar análisis matemáticos detallados. Por otro lado, Simulink proporciona una interfaz gráfica intuitiva que permite crear simulaciones de sistemas grandes y complejos de forma más visual.

Una de las diferencias más notables es la capacidad de Simulink para interactuar con modelos no lineales y bloques adicionales de sistemas físicos, lo que lo hace más flexible en algunos escenarios. Sin embargo, para análisis rápidos o cuando se trabaja con un modelo matemático más simple, MATLAB suele ser más eficiente.

En mi tutorial, también explico cómo puedes simular el mismo sistema en ambos entornos, destacando las diferencias en términos de facilidad de uso y tiempo de simulación.

Sintonización del Controlador MPC: Retos y Soluciones

La sintonización de un controlador predictivo es uno de los aspectos más desafiantes, especialmente en sistemas MIMO como el que estamos utilizando. Uno de los problemas comunes es encontrar los pesos correctos para minimizar la desviación en las salidas del sistema mientras se mantienen las entradas dentro de los límites permitidos. En mi caso, he creado un script que optimiza estos pesos, lo que facilita enormemente la sintonización.

El siguiente fragmento de código muestra cómo se definen los horizontes y los pesos en el controlador:

mpc_toolbox.PredictionHorizon = max(N);
mpc_toolbox.ControlHorizon = max(Nu);
mpc_toolbox.Weights.OV = delta;
mpc_toolbox.Weights.MVRate = lambda;

Este proceso de sintonización es crucial para garantizar que el sistema funcione de manera óptima bajo diversas condiciones. Para aquellos interesados en automatizar este proceso, he puesto a disposición un código en mi repositorio que realiza la sintonización automáticamente, basándose en algoritmos de optimización.

Recursos y Herramientas Complementarias para Usar el MPC Toolbox

Además del código y las herramientas que te proporciono en mis repositorios, existen otros recursos que pueden ayudarte a dominar el uso del MPC Toolbox en MATLAB y Simulink. Aquí te comparto algunos recursos clave:

  • Documentación Oficial de MATLAB: Una referencia fundamental para aprender a utilizar todas las funciones del toolbox.
  • Ejemplos Prácticos en Simulink: MATLAB ofrece varios ejemplos predefinidos que puedes explorar para entender cómo integrar el MPC en Simulink.

Además, te invito a descargar el código de mi GitHub para que puedas poner en práctica lo aprendido y personalizar los ejemplos a tus propias necesidades:

Estos recursos, junto con el tutorial paso a paso que te ofrezco en video, te brindarán una sólida base para comenzar a trabajar con controladores predictivos en MATLAB y Simulink.

Implementación del NMPC en MATLAB: Código y Ejemplo Práctico

Además de la versión lineal, el MPC Toolbox también permite implementar controladores predictivos no lineales (NMPC), los cuales son especialmente útiles para sistemas cuya dinámica no puede representarse adecuadamente con modelos lineales. A continuación, explico cómo implementar un controlador NMPC en MATLAB utilizando un sistema no lineal basado en el Reactor Van de Vusse.

Configuración del Sistema No Lineal

El Reactor Van de Vusse es un ejemplo clásico de sistema no lineal que tiene tres estados (concentraciones de reactivos y temperatura) y dos entradas manipuladas (flujo de alimentación y calor intercambiado). Primero, configuramos las condiciones iniciales del sistema y definimos las restricciones tanto para las variables manipuladas como para los estados y salidas del sistema:

% Definir condiciones iniciales
CA0 = 5.1; CB0 = 1.1163; T0 = 130;
X0 = [CA0, CB0, T0];
u0 = [20, 130];

% Límites en las entradas manipuladas (Flujo y calor)
Fupp = 150; Flow = 0; Qupp = 150; Qlow = 40;
ub = [Fupp, Qupp];
lb = [Flow, Qlow];

% Definir el número de estados, entradas y salidas
nx = 3; % Número de estados
ny = 2; % Número de salidas
nu = 2; % Número de entradas

% Definir el NMPC
nlobj = nlmpc(nx, ny, nu);
nlobj.Ts = 0.05; % Tiempo de muestreo
nlobj.Model.StateFcn = @(x, u) nmpc_vandevusse_state(x, u);
nlobj.Model.OutputFcn = @(x, u) [x(2); x(3)]; % Definir salidas

% Restricciones en entradas y salidas
for i = 1:nu
    nlobj.MV(i).Min = lb(i);
    nlobj.MV(i).Max = ub(i);
end

Sintonización del Controlador NMPC

La sintonización de un NMPC es crucial para obtener un rendimiento óptimo. En este caso, el controlador se ajusta a través de los horizontes de predicción y control, así como los pesos asignados a las salidas y las entradas manipuladas. Para este ejemplo, utilizamos el siguiente código para definir los parámetros de sintonización:

% Horizontes de predicción y control
N = 3; Nu = 2;
delta = [0.0930, 0.1133];  % Peso de seguimiento de setpoint
lambda = [0.2460, 0.1231]; % Peso del incremento de control

nlobj.PredictionHorizon = N;
nlobj.ControlHorizon = Nu;
nlobj.Weights.OutputVariables = delta;
nlobj.Weights.ManipulatedVariablesRate = lambda;

Este proceso de sintonización permite ajustar el comportamiento del controlador a las dinámicas del reactor, asegurando un control preciso sobre las concentraciones y la temperatura del sistema.

Simulación del Controlador NMPC

Finalmente, ejecutamos la simulación del sistema con el controlador no lineal. Utilizamos el integrador de MATLAB para resolver las ecuaciones diferenciales que describen la dinámica del reactor:

[Y, U, yopt, uopt] = closedloop_toolbox_nmpc(nlobj, model, init, r, N, Nu, delta, lambda, nit);

% Graficar los resultados de la simulación
figure;
subplot(3,1,1);
plot(ts, r(1,:), 'LineWidth', 2);
hold on;
plot(ts, Y(1,:), 'LineWidth', 2);
ylabel('Concentration of B [mol/l]');
xlabel('Time [h]');
grid on;

subplot(3,1,2);
plot(ts, r(2,:), 'LineWidth', 2);
hold on;
plot(ts, Y(2,:), 'LineWidth', 2);
ylabel('Temperature [C]');
xlabel('Time [h]');
grid on;

En esta simulación, se observa cómo el controlador NMPC regula las concentraciones de los reactivos y la temperatura del reactor, logrando un seguimiento adecuado de las trayectorias de referencia definidas.

Para más detalles sobre cómo implementar y sintonizar el NMPC, te invito a revisar el código completo en mi repositorio de GitHub.

Comparación entre el MPC Lineal y el NMPC

Tanto el MPC lineal como el NMPC tienen sus ventajas y aplicaciones. El MPC lineal es ideal para sistemas que pueden ser descritos con modelos simples y donde la respuesta es lineal ante perturbaciones y cambios en las entradas. Por otro lado, el NMPC se aplica a sistemas más complejos y no lineales, como el Reactor Van de Vusse, donde las relaciones entre las entradas y las salidas no son proporcionales.

En mi experiencia, recomiendo utilizar el MPC lineal cuando se busca simplicidad y rapidez en la simulación, y optar por el NMPC cuando las dinámicas del sistema son intrínsecamente no lineales y requieren mayor precisión en el control.


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.