这个例子展示了如何为Simulink®中定义的多输入多输出非线性对象设计模型预测控制器,并对闭环进行仿真。金宝app该工厂有三个操作变量和两个测量输出。
要运行此示例,需要Simulink®和Si金宝appmulink Control Design™。
检查Simulink和Simulin金宝appk Control Design是否已安装,%否则显示一条消息并返回如果~ mpcchecktoolboxinstalled (“金宝app模型”) disp (运金宝app行这个示例需要Simulink(R)。)返回结束如果~ mpcchecktoolboxinstalled (“slcontrol”) disp (“金宝app需要Simulink Control Design(R)来运行这个例子。”)返回结束
在Simulink模型中实现了该非线性对象金宝appmpc_nonlinmodel
.注意到非线性0.2 * u (1) ^ 3
从第一个输入到第一个输出。
打开(“mpc_nonlinmodel”)
在默认运行条件下(传递函数块的初始状态全部为零)使用线性化
命令来自Simulink控件设计工金宝app具箱。
工厂=线性化(“mpc_nonlinmodel”);
为I/O变量指定名称。
工厂。InputName = {质量流量的;“热流”;“压力”};工厂。OutputName = {“温度”;“水平”};工厂。InputUnit = {公斤/年代”“J / s”“爸爸”};工厂。OutputUnit = {“K”“米”};
注意,由于您没有定义任何测量或未测量的扰动,或任何未测量的输出,当MPC控制器创建基于植物
,在默认情况下,假设所有的植物输入都是被操纵的变量,所有的植物输出都是被测量的输出。
创建采样周期为0.2秒、预测和控制范围为5步、2步的控制器对象;
mpcobj = mpc(植物,0.2,5,2);
- - - >“权重。mpc对象的操纵变量属性为空。假设默认的0.00000。- - - >“权重。mpc对象的操控变量率属性为空。假设默认的0.10000。- - - >“权重。mpc对象的属性为空。假设默认的1.00000。
指定受操纵变量的硬约束。
mpcobj。MV =结构(“最小值”{3; 2; 2},“马克斯”{3; 2; 2},“杀鼠灵”, {-1000; -1000; -1000});
定义操纵变量和输出信号的权重。
mpcobj。重量=结构(“MV”(0 0 0),“MVRate”,(。1。1。1)机汇的[1]);
显示MPC对象以查看其属性。
mpcobj
MPC对象(01 - 9 - 2021 09:22:07上创建 ): --------------------------------------------- 采样时间:0.2(秒)预测地平线:5控制层:2植物模型:-------------- 3被控变量(s) - > | 5个州 | | |--> 2测量输出(s) 0测量扰动(s) - > | 3的输入 | | |--> 无边无际的输出(s) 0无边无际的干扰(s) - > | 2输出 | -------------- 干扰和噪声模型:输出扰动模型:默认(类型”getoutdist (mpcobj)”)测量噪声模型:权重:ManipulatedVariables: [0 00] ManipulatedVariablesRate: [0.1000 0.1000 0.1000] OutputVariables: [1 1] ECR: 100000 State Estimation: default Kalman Filter (type "getEstimator(mpcobj)" for details)-3 <=质量流量(kg/s) <= 3, -1000 <=质量流量/速率(kg/s) <= Inf,温度(K)不受约束-2 <=热流(J/s) <= 2, -1000 <=热流/速率(J/s) <= Inf,水平(m)不受约束-2 <=压力(Pa) <= 2, -1000 <=压力/速率(Pa) <= Inf
打开已有的Simulink模型进行闭环仿真。金宝app工厂模型与用于线性化的模型相同,而MPC控制器是通过MPC控制器块实现的,该块具有MPC对象的工作空间mpcobj
作为参数。当仿真开始时,第一个输出的参考是一个从0上升到1的阶跃信号(t=0)。第二个输出的参考
mdl1 =“mpc_nonlinear”;open_system (mdl1)
运行闭环模拟。
sim (mdl1)
——>模型转换为离散时间。——>假设添加到测量输出通道#1的输出扰动为集成白噪声。——>假设添加到测量输出通道2上的输出扰动为集成白噪声。——>”模式。mpc对象的Noise属性为空。假设每个测量输出通道上都有白噪声。
尽管存在非线性,两个输出都能在几秒钟后很好地跟踪它们的参考,而正如预期的那样,操纵变量保持在预设的硬约束内。
为了在对非线性进行补偿的同时同时跟踪斜坡,在两个输出上定义一个扰动模型为三重积分器(没有非线性,双积分器就足够了)。
特遣部队(outdistmodel = {1 1 0; 0}, {1 0 0 0, 1; 1, [1 0 0 0]});setoutdist (mpcobj“模型”, outdistmodel);
打开已有的Simulink模型进行闭环仿真。金宝app它与之前的闭环模型是相同的,除了第一个工厂输出的参考不再是一个阶跃,而是一个斜坡信号,斜坡在3秒后以0.2的斜率上升。
mdl2 =“mpc_nonlinear_setoutdist”;open_system (mdl2)
运行闭环模拟12秒。
sim (mdl2, 12)
——>模型转换为离散时间。——>”模式。mpc对象的Noise属性为空。假设每个测量输出通道上都有白噪声。
当约束不主动时,MPC控制器表现为线性控制器。在闭环中模拟两个版本的无约束MPC控制器来说明这一事实。
首先,删除约束mcpobj
.
mpcobj。MV = [];
然后将输出扰动模型重置为默认值(这只是为了在下一个步骤中得到一个更简单的线性MPC控制器)。
setoutdist (mpcobj“集成商”);
将无约束MPC控制器转换为具有矢量的线性时不变(LTI)状态空间动态系统(ym; r)
作为输入,ym
是测量的输出信号的矢量(在一个给定的步骤),和r
是输出引用的向量(在相同的给定步骤)。
LTI = ss (mpcobj,“r”);使用参考作为附加的输入信号
——>模型转换为离散时间。——>假设添加到测量输出通道#1的输出扰动为集成白噪声。——>假设添加到测量输出通道2上的输出扰动为集成白噪声。——>”模式。mpc对象的Noise属性为空。假设每个测量输出通道上都有白噪声。
打开已有的Simulink模型进行闭环仿真。金宝app“引用”块包含两个作为引用的步进信号(分别在4秒和0秒之后执行)。“MPC控制回路”块相当于第一个闭环,除了参考信号作为输入提供给它的事实。除了控制器是具有工作空间的LTI块之外,“线性控制回路”块与“MPC控制回路”块是等价的党卫军
对象线性时不变
作为参数。
参= (1,1);%设置阶跃信号参考值mdl3 =“mpc_nonlinear_ss”;open_system (mdl3)
运行闭环模拟12秒。
sim (mdl3)
两个循环的输入和输出信号看起来是相同的。还要注意,被操纵的变量不再受前面的约束。
流('比较输出轨迹:||ympc-ylin|| = %g\n'规范(ympc-ylin));disp (MPC控制器和线性控制器产生相同的闭环轨迹。);
输出轨迹比较:||ympc-ylin|| = 1.68434e-14 MPC控制器与线性控制器产生相同的闭环轨迹。
正如预期的那样,由于数值误差,只有可以忽略不计的差异。
关闭所有打开的Simulink金宝app模型,不保存任何更改。
bdclose所有