【MPC-Simulink】EX03 基于非线性系统线性化模型MPC仿真(MIMO)
参考 Matlab 官网提供的 Model Predictive Control Toolbox - Getting Started Guide,以零初始状态条件下的非线性系统在线性化后得到的多输入多输出(MIMO)预测模型为例,使用 Simulink 闭环仿真模型预测控制(MPC)。
1. 线性化非线性系统
-
非线性模型使用 Matlab 自带的模型,
直接使用
open
打开。注意这是一个三输入两输出的非线性系统,三个传递函数模块的初始状态均为0。open('mpc_nonlinmodel')
-
使用 Simulink Control Design 的
linearize
命令,在默认工作点下(传递函数模块的初始状态均为零)对系统进行线性化。得到的线性化模型作为 MPC 控制器中的被控对象模型,用来预测。plant = linearize('mpc_nonlinmodel')
-
为输入和输出变量分配名称:
plant.InputName = {'Mass Flow'; 'Heat Flow'; 'Pressure'}; plant.OutputName = {'Temperature'; 'Level'}; plant.InputUnit = {'kg/s', 'J/s', 'Pa'}; plant.OutputUnit = {'K', 'm'};
2. 设计 MPC 控制器
创建 MPC 控制,可参考
【MPC-Simulink】EX02 高阶线性系统MPC仿真与调试(LTI-MISO)-CSDN博客
-
实例化 MPC 控制器对象
由于未定义任何可测或不可测量的干扰信号,也未定义任何不可测量的输出,因此基于
plant
创建MPC控制器时,默认情况下所有系统输入均被视为可控输入(MV),所有系统输出均被视为可测量输出(MO)。mpcobj = mpc(plant, 0.2, 5, 2);
- 采样时间 0.2 秒
- prediction horizon 5 步
- control horizon 2 步
-
为控制变量指定硬约束。
mpcobj.MV = struct('Min',{-3; -2; -2}, 'Max',{3; 2; 2}, 'RateMin',{-1000; -1000; -1000});
-
定义控制变量和输出信号的权重。
mpcobj.Weights = struct('MV', [0 0 0], 'MVRate', [0.1 0.1 0.1], 'OV', [1 1]);
代价函数定义参考
[Optimization Problem
- MATLAB & Simulink
- MathWorks 中国](https://ww2.mathworks.cn/help/mpc/ug/optimization-problem.html)
-
显示 MPC 控制器属性
mpcobj
3. 跟踪阶跃信号
-
打开示例的 Simulink 模型进行闭环仿真。
该系统模型与线性化时使用的模型相同,MPC 控制器将基本工作区中的 MPC 对象
mpcobj
作为参数。输出1的参考信号为阶跃信号,仿真开始时从0上升到1。输出2的参考信号也使用阶跃信号。注意仿真被控对象使用的是非线性模型。mdl1 = 'mpc_nonlinear'; open_system(mdl1)
-
运行仿真
sim(mdl2,12)
可测量输出与参考信号
三个可控输入
4. 跟踪斜坡信号
-
为了在补偿非线性因素的同时跟踪斜坡信号,需要在两个输出上定义一个三阶积分的干扰模型(如果没有非线性,用二阶积分就足够了)。
outdistmodel = tf({1 0; 0 1}, {[1 0 0 0], 1; 1, [1 0 0 0]}) setoutdist(mpcobj, 'model', outdistmodel); getoutdist(mpcobj)
-
打开预设的Simulink模型进行闭环仿真。该模型与先前的闭环模型相同,但第一输出的参考信号不再是阶跃信号,而是在3秒后以0.2的斜率上升的斜坡信号。
mdl2 = 'mpc_nonlinear_setoutdist'; open_system(mdl2);
-
仿真
sim(mdl2,12)
5. 无约束条件下的仿真
当约束不激活时,MPC 控制器的行为类似于线性控制器。为了说明这一点,可以在闭环中仿真两个无约束MPC控制器的版本。
-
移除可控输入约束
mpcobj.MV
mpcobj.MV = [];
-
然后将输出干扰模型重置为默认值(仅在下一步中获取更简化的线性 MPC 控制器版本时使用):
setoutdist(mpcobj, 'integrators');
-
将无约束的MPC控制器转换为线性时不变 (LTI) 状态空间动态系统,输入向量为
[ym; r]
,其中ym
是测量的输出信号向量(在给定时间步),r
是输出参考信号向量(在相同时间步)。LTI = ss(mpcobj,'r'); % use reference as additional input signal
-
打开预设的Simulink模型以进行闭环仿真。
- “references” 块包含两个阶跃信号(分别在4秒和0秒后生效),作为参考信号。
- “MPC control loop” 块等效于第一个闭环,不同之处在于该参考信号作为输入提供。
- “Linear control loop” 块等效于 “MPC control loop” 块,不同的是控制器为LTI块,其参数为工作区中的状态空间对象
LTI
。
refs = [1;1]; % set values for step signal references mdl3 = 'mpc_nonlinear_ss'; open_system(mdl3)
MPC 控制器的闭环系统和之前的类似,线性化控制器如下
sim(mdl3)
可测量输出
可控输入
输入和输出信号在两个闭环系统中看起来是相同的。此外,注意可控输入不再受先前约束的限制(为了对比线性化控制器,之前将 MPC 控制器的约束移除了)。
-
比较
fprintf('Compare output trajectories: ||ympc-ylin|| = %g\n',norm(ympc-ylin));
控制性能接近
Compare output trajectories: ||ympc-ylin|| = 1.53023e-14