官方示例
1. 用MPC Designer设计控制器
Design Controller Using MPC Designer
1.1 系统建立
对于一个 连续搅拌式反应器 Continuously Stirred Tank Reactor (CSTR) 的线性模型,
第一个输入,冷却液温度 T c T_cTc(可操控的变量)。
第二个输入,进料浓度 C A f C_{Af}CAf(无法测量的扰动)。
第一个输出,电抗器温度 T TT(可测量的输出)。
第二个输出,反应物浓度 C A C_ACA(无法测量的输出)。
系统状态方程和输出方程:
x ˙ = A x + B u y = C x + D u \dot{x}=Ax+Bu \\ y=Cx+Dux˙=Ax+Buy=Cx+Du
其中,
A = [ a 11 , a 12 ; a 21 , a 22 ] , B = [ b 11 , b 12 ; b 21 , b 22 ] , C = [ 0 , 1 ; 1 , 0 ] , D = [ 0 , 0 ; 0 , 0 ] A=[a_{11}, a_{12}; a_{21}, a_{22}], \\ B=[b_{11}, b_{12}; b_{21}, b_{22}], \\ C=[0, 1; 1, 0], \\ D=[0, 0; 0, 0]A=[a11,a12;a21,a22],B=[b11,b12;b21,b22],C=[0,1;1,0],D=[0,0;0,0]
在 Matlab 中输入CSTR系统的状态空间表达式:
A = [ -5 -0.3427; 47.68 2.785]; B = [ 0 1 0.3 0]; C = flipud(eye(2)); % flipud:将数组从上向下翻转 D = zeros(2); CSTR = ss(A,B,C,D); % ss:创建状态空间表达式
运行之后工作空间将会存储CSTR模型:
再输入命令 mpcDesigner
,打开 MPC Designer 工具:
再打开 MPC Structure :
Select a plant model or an MPC controller from MATLAB Workspace 中会出现工作区保留的模型,这时候选择我们刚刚建立的CSTR模型。
默认情况下,所有模型输入都被定义为可操纵变量,所有模型输出都被定义为可测量输出。
这时候需要根据我们实际模型变量进行修改。在“分配模型I/O通道”部分,分配输入和输出通道指数如下:
由于CSTR是一个稳定的连续时间线性时不变(LTI)系统,MPC Designer将控制器采样时间默认设置为0.1 Tr,其中Tr为CSTR的平均上升时间。本例中,在“指定MPC控制器采样时间”字段中,输入采样时间为0.5秒。
设置完成之后,点击 导入,退出 Define MPC Structure By lmporting 窗口,再等待一会儿,MPC Designer 会出现以下页面:
数据浏览器中的 Controllers 增加了 mpc1(使用CSTR作为其内部模型创建的默认MPC控制器),在 Scenarios 中增加了 scenario1(默认模拟场景)。
MPC Designer应用程序运行默认的模拟场景,并更新输入响应和输出响应图。闭环系统能够成功地跟踪所需的测量输出,而对于无法测量的输出则不是这样。
1.2 定义输入和输出通道属性
在 MPC Designer 选项卡上,选择 I/O Attributes 。
可以修改名称和单位:
每个输入和输出通道的 Nominal Value 默认为0,每个通道的 Scale Factor 默认为1。
点击确认之后,名字和单位更新:
1.3 配置仿真场景
在MPC设计器选项卡的 Scenarios 部分,单击 Scenario1 > Edit 。
将模拟持续时间 Simulation duration 设置为20秒。
在 “Reference Signals” 表的第一行,指定步长为2,时间为5,即模拟参考反应器温度T在5秒后到2开氏度的阶跃变化。
点击确定,动态响应图更新。
1.4 配置控制水平
在 TUNING 选项卡的 HORIZON 部分中,指定预测水平 Prediction horizon 为15,控制水平 Control horizon 为3。
动态响应图自动更新。
但是控制动作违反了冷却剂温度变化率所要求的约束。
1.5 定义输入约束
在 Design 部分,单击 Constraints 。
设置输入输出以及速率上下限:
动态响应图更新。
可以看到冷却剂温度上升趋势变缓。
1.6 控制器调优权重
Tuning > Design > Weights
将可操纵变量(MV))的 Rate Weight 增加到 0.3。
默认情况下,所有无法测量输出的权重为零。
由于只有一个被操纵变量,如果控制器试图将两个输出保持在特定的设定值,则一个或两个输出将在其响应中显示稳态误差。由于控制器忽略了零权重输出的设定值,将浓度输出权重设置为零允许反应器温度设定值跟踪与零稳态误差。
这时候动态响应更慢了。
1.7 消除输出超调
假设应用程序要求输出响应中的超调为零。在 PERFORMANCE TUNING 中,向左拖动闭环性能滑块,直到输出响应没有超调。将此滑块向左移动,同时增加了控制器的被操纵变量权重,并减少了输出变量权重,从而产生更鲁棒的控制器。
1.8 导出控制器
Tuning > Analysis > Export Controller
Matlab 工作区出现:
2. 有限控制集MPC
Solve a Finite Set MPC Problem in Simulink
2.1 mpc 创建函数:
mpcobj = mpc(plant,ts,P,M,W,MV,OV,DV)
plant: 模型
ts: 采样时间
P: 预测区间 Prediction horizon
M: 控制区间 Control horizon property
系统包含4个状态变量,2个输入,1个输出。
2.2 Matlab 代码:
%% Solve a Finite Set MPC Problem in Simulink % https://ww2.mathworks.cn/help/mpc/ug/discrete-set-mpc-in-simulink.html % Fix the random generator seed for reproducibility. rng(0); % Create a discrete-time strictly proper plant with 4 states, two inputs and one output. % drss: Generate random discrete test model plant = drss(4,1,2); plant.D = 0; % Increase the control authority of the first input, to better illustrate its control contribution. plant.B(:,1)=plant.B(:,1)*2; % Create an MPC controller with one second sampling time, 20 steps prediction horizon and 5 steps control horizon. % mpcobj = mpc(plant,ts,P,M,W,MV,OV,DV) specifies the following controller properties. % P sets the PredictionHorizon property. % M sets the ControlHorizon property. mpcobj = mpc(plant,0.1,20,5); % Specify the first manipulated variable as belonging to a set of seven possible values. % Note that you Could also specify it as an integer using the instruction mpcobj.MV(1).Type = 'integer'; % in which case the first manipulated variable will be constrained to be an integer. mpcobj.MV(1).Type = [-1 -0.7 -0.3 0 0.2 0.5 1]; % Use rate limits to enforce maximum increment and decrement values for the first manipulated variable. mpcobj.MV(1).RateMin = -0.5; mpcobj.MV(1).RateMax = 0.5; % Set limits on the second manipulated variable, whose default type (continuous) has not been changed. mpcobj.MV(2).Min = -2; mpcobj.MV(2).Max = 2; % Create an output reference signal equal to zero from steps 20 to 35 and equal to 0.6 before and after. r = ones(1,50)*0.6; r(20:35) = 0;
工作区创建系统模型,名称是 plant;创建MPC控制器,名称是 mpcobj
输出:
-->The "Weights.ManipulatedVariables" property is empty. Assuming default 0.00000. -->The "Weights.ManipulatedVariablesRate" property is empty. Assuming default 0.10000. -->The "Weights.OutputVariables" property is empty. Assuming default 1.00000.
2.3 Simulink 仿真模型:
MPC Controller 中选择控制器为 mpcobj (与工作区的同名)
LTI System 中系统变量选择 plant (与工作区的同名)
2.4 运行结果
输入:
输出: