✨ 本文展示了如何在Simulink中设计多输入多输出对象的闭环模型预测控制 (MPC, Model Predictive Control),分析对象具有三个操纵变量(Manipulated Variables)与两个测量输出(Measured Output)。
在Matlab中使用open('mpc/mpcnonlinear')
命令可以打开Simulink已经实现好的而非线性对象模型mpc_nonlinmodel
,如下图所示:
使用Simulink控制设计工具箱中的线性命令,在默认操作条件下(传递函数块的初始状态均为零)对对象进行线性化:
plant = linearize('mpc_nonlinmodel');
✨
linearize
函数的作用是对Simulink模型或子系统进行线性近似。plant对象是一个 2 × 3 2 \times 3 2×3的状态空间模型(ss, State Space Model)矩阵,其中plant矩阵中的每个元素的数据结构为ss
。以其中的plant(1, 1)为例,查看ss
的数据结构。
执行完plant = linearize('mpc_nonlinmodel');
后,在命令窗口输入plant
可以查看其主要参数信息如下图所示,结合上面的介绍,我们可以很容易地理解每个参数的含义:
代码如下所示:
plant.InputName = {'Mass Flow';'Heat Flow';'Pressure'};
代码执行结果如下图所示:
代码如下所示:
plant.OutputName = {'Temperature'; 'Level'};
代码执行结果如下图所示:
经过为输入输出变量分配名称操作后,plant
中输入输出变量名称则变为如下图所示的结果:
代码如下所示:
plant.InputUnit = {'kg/s', 'J/s', 'Pa'};
plant.OutputUnit = {'K', 'm'};
经过为输入输出单位变量分配名称后,plant
中输入输出单位变量的结果如下图所示:
下面的指令构造MPC控制器,其中设置参数如下所示:
mpcobj = mpc(plant, 0.2, 5, 2);
通过get
命令可以获得mpcobj
的类属性,每个类属性的内涵如下图所示:
设置模型预测控制对象mpcobj
操纵变量的指令如下所示:
mpcobj.MV = struct('Min',{-3;-2;-2},'Max',{3;2;2},'RateMin',{-1000;-1000;-1000});
设置模型预测控制对象mpcobj
权重的指令如下所示:
mpcobj.Weights = struct('MV', [0 0 0], 'MVRate', [.1 .1 .1], 'OV', [1 1]);
执行完指令后,通过mpcobj
命令可以查看其属性。
通过下面的指令可以打开Matlab中的Simulink闭环仿真模型mpc_nonlinear
:
mdl1 = 'mpc_nonlinear';
open_system(mdl1)
打开的mpc_nonlinear
模型包括如下图所示的三个部分:
通过下面的命令就可以进行仿真了:
sim(mdl1)
运行结果如下图所示:
由上图分析结果可以看出,尽管存在非线性,但是两个输出在几秒后很好地跟踪其参考值,并且操纵变量仍然保持在设置的约束内。
为了在补偿非线性的同时跟踪斜坡,将两个输出上的扰动模型定义为三积分器(没有非线性,双积分器就足够了)。
通过tf
函数构造一个外部扰动模型outdistmodel
:
outdistmodel = tf({1 0; 0 1}, {[1 0 0 0], 1; 1, [1 0 0 0]});
构造的传递函数矩阵为:
[ 1 s 3 0 0 1 s 3 ] \begin{bmatrix} \frac{1}{s^3} & 0 \\ 0 & \frac{1}{s^3} \end{bmatrix} [s3100s31]
通过setoutdist
函数将上面构造的不可观测外部扰动传递函数outdistmodel
添加到MPC的model中:
setoutdist(mpcobj, 'model', outdistmodel);
打开Simulink中的闭环仿真模型mpc_nonlinear_setoutdist
,它与上面的mpc_nonlinear
闭环Simulink仿真模型相同,唯一不同的是参考信号,其参考信号的第一个由阶跃变为3秒以内以0.2斜率上升的斜坡信号。
打开的mpc_nonlinear_setoutdist
模型包括如下图所示的三个部分:
下面的执行将mpc_nonlinear_setoutdist
模型仿真12s:
sim(mdl2, 12)
仿真结果如下图所示: