这个例子展示了如何从命令行创建和测试模型预测控制器。
这个例子使用了使用MPC设计器设计控制器.创建植物的状态空间模型,并设置一些可选的模型属性,如名称和输入、状态和输出变量的单位。
%连续时间状态空间矩阵,以温度作为第一个输出A = [-5 -0.3427;47.68 - 2.785);B = [0 1 0.3 0];C = [0 1;1 0];D = 0 (2, 2);创建状态空间植物模型装运箱= ss (A, B, C, D);%设置名称装运箱。InputName = {“T_c”,“C_A_f”};设置输入变量的名称装运箱。OutputName = {“T”,“C_A”};%设置输出变量的名称装运箱。StateName = {“C_A”,“T”};设置状态变量的名称%设置单位装运箱。InputUnit = {“度K”,' kmol / m ^ 3 '};%设置输入变量的单位装运箱。OutputUnit = {“度K”,' kmol / m ^ 3 '};%设置输出变量的单位装运箱。StateUnit = {' kmol / m ^ 3 ',“度K”};状态变量的集合单位
注意,这个模型是由一个非线性模型在工作点周围的线性化得到的。因此,线性模型输入和输出信号的值代表了非线性模型中相对于其工作点值的偏差。有关更多信息,请参见线性化使用MATLAB代码.
其中冷却剂温度为操纵变量(MV),流入试剂浓度为未经测量的干扰输入(UD),反应器温度为未经测量的输出(MO),试剂浓度为未经测量的输出(UO)。
装运箱= setmpcsignals(装运箱,“MV”,1,“UD”2,“莫”,1,“UO”2);
使用潮湿的
显示线性植物模型极点的阻尼比、固有频率和时间常数。
潮湿(装运箱)
杆阻尼频率时间常数(rad/秒)(秒)-1.11e+00 + 1.09e+00i 7.13e-01 1.55e+00 9.03 -01 -1.11e+00 - 1.09e+00i 7.13e-01 1.55e+00 9.03 -01
绘制开环阶跃响应。
步骤(装运箱)
给定工厂的标称稳定性,大约1秒的时间常数表明样品时间不大于0.5秒。对于0.5秒的采样时间,10步的预测范围可以覆盖开环装置的整个沉淀时间,因此可以使用这两个参数作为初始猜测。更短的采样时间意味着更少的控制计算可用时间。更长的视野(更多的步骤)意味着更多的优化变量,因此在可用的时间步内需要解决更多的计算问题。
为了提高示例的清晰度,抑制来自MPC控制器的命令窗口消息。
old_status = mpcverbosity (“关闭”);
创建一个模型预测控制器,其控制间隔或采样时间为0.5
秒,所有其他属性的默认值,包括预测范围10
步骤和控制范围2
步骤。
mpcobj = mpc(装运箱,0.5)
MPC对象(01 - 9 - 2021 09:22:17上创建 ): --------------------------------------------- 采样时间:0.5(秒)预测地平线:10控制层:2植物模型:-------------- 1操纵变量(s) - > | 2 | | |--> 1测量输出(s) 0测量扰动(s) - > | 2输入 | | |--> 无边无际的输出(s) 1无边无际的干扰(s) - > | 2输出 | -------------- 指标:(输入向量)操纵变量:[1]无边无际的干扰:[2](输出向量)测量输出:[1]无边无际的输出:[2]干扰和噪声模型:输出扰动模型:默认(类型”getoutdist (mpcobj)”)输入扰动模型:默认(类型”getindist (mpcobj)”)测量噪声模型:默认(缩放后单位增益)重量:ManipulatedVariables: 0 ManipulatedVariablesRate: 0.1000 OutputVariables:[1 0] ECR: 100000 State Estimation: Default Kalman Filter (type "getEstimator(mpcobj)" for details
显示控制器属性及其当前值的列表。
get (mpcobj)
Ts: 0.5 PredictionHorizon (P): 10 ControlHorizon (C): 2 Model: [1x1 struct] ManipulatedVariables (MV): [1x1 struct] OutputVariables (OV): [1x2 struct] disturbance evariables (DV): [1x1 struct] Weights (W): [1x1 struct] Optimizer: [1x1 struct] Notes: {} UserData: [] History: 01-Sep-2020 09:22:17
显示的历史
值对于控制器来说是不同的,因为它取决于控制器创建的时间。输入MPC控制器可编辑属性的描述mpcprops
在命令行。
使用点符号来修改这些属性。例如,将预测视界更改为15
.
mpcobj。PredictionHorizon = 15;
有些属性名有别名。例如,您可以使用别名MV
而不是ManipulatedVariables
.而且,许多控制器属性都是包含额外字段的结构。使用点符号来查看和修改这些字段值。例如,由于默认情况下,控制器对操纵变量和输出变量没有约束,您可以使用点表示法查看和修改这些约束。
为控制器操纵变量设置约束。
mpcobj.MV.Min = -10;% Kmpcobj.MV.Max = 10;% Kmpcobj.MV.RateMin = 1;% K /步骤mpcobj.MV.RateMax = 1;% K /步骤
如果缩写不存在歧义,可以缩写属性名。您还可以查看和修改控制器调优权重。例如,修改被操纵变量rate和输出变量的权重。
mpcobj.W.ManipulatedVariablesRate = 0.3;mpcobj.W.OutputVariables = [1 0];
您还可以定义在预测范围内的时变约束和权重,这些约束和权重在每个时间步长都发生变化。例如,为了迫使被操纵的变量在接近预测视界的末尾时改变得更慢,输入:
MPCobj.MV.RateMin = [2;-1.5;1;1;1;-0.5);
MPCobj.MV.RateMax = [2;1.5;1;1;1;0.5);
的-0.5
和0.5
值用于第四步及以后。
类似地,您可以为预测界的每个步骤指定不同的输出变量权值。例如,输入:
MPCobj.W.OutputVariables = [0.1 0;0.2 0;0.5 0;1 0];
您还可以修改控制器的抗扰特性。看到setEstimator
,setindist
,setoutdist
为更多的信息。
生成关于潜在运行时稳定性和性能问题的报告。
评估(mpcobj)
在这个例子中审查
命令发现了设计的两个潜在问题。第一个警告是由这个事实引起的C_A
输出误差为零。第二个警告是由于两者都有硬性限制MV
和MVRate
.
您可以向下滚动查看关于每个测试结果的更多信息。
使用sim卡
函数对运行的系统进行线性仿真。例如,模拟的闭环响应MPCobj
为26
控制的时间间隔。从第二步开始,指定设定点2
和0
为反应器温度(第一输出)和试剂浓度(第二输出)。注意,浓度的设定值被忽略了,因为第二个输出的调优权重为零。
T = 26;R = [0 0;2 0];sim (mpcobj T r)
您可以使用mpcsimopt
.例如,在关闭操纵变量约束的情况下运行模拟。
mpcopts = mpcsimopt;mpcopts。约束=“关闭”;sim (mpcobj T r, mpcopts)
受操纵变量的第一次移动现在超过了指定的值1
单位速度限制。
您还可以使用植物/模型不匹配来执行模拟。例如,定义一个设备,其增益比控制器所使用的模型中的增益大50%,延时为0.1秒。
mpcopts。模型=特遣部队(1.5,1“InputDelay”, 0.1) *装运箱;sim (mpcobj T r, mpcopts)
从闭环响应的振荡行为可以看出,对象/模型不匹配降低了控制器的性能。退化可能很严重,必须逐例进行测试。
其他仿真选项包括在操纵变量或测量输出中添加指定的噪声序列,开环仿真,以及用于更好的设定值跟踪或测量干扰抑制的前瞻性选项。
对系统进行仿真,将仿真结果存储在MATLAB工作空间中。
[y t u] = sim (mpcobj t r);
该语法抑制了自动绘图,并在y
,t
和u
变量。您可以将结果用于其他目的,包括定制绘图。例如,将操纵变量和两个输出变量绘制在同一个图中。
图subplot(2,1,1) plot(t,u) title(“输入”)传说(“T_c”) subplot(2,1,2) plot(t,y) title(“输出”)传说(“T”,“C_A”)包含(“时间”)
恢复mpcverbosity
设置。
mpcverbosity (old_status);