主要内容

单输入单输出设备的显式MPC控制

这个例子展示了如何在Simulink®中使用显式MPC控制输入饱和下的双积分器装置。金宝app

有关使用传统(隐式)MPC控制器控制双积分器的示例,请参见单投入单输出设备的模型预测控制

定义植物模型

线性开环动力学模型是一个双积分器。

Plant = tf(1,[1 0 0]);

MPC控制器设计

创建采样周期为0.1秒的控制器对象,预测和控制范围分别为10步和3步。

Ts = 0.1;mpcobj = mpc(plant, Ts, 10,3);
——>“权重。是空的。假设默认值为0.00000。——>“权重。“ManipulatedVariablesRate”为空。假设默认为0.10000。——>“权重。OutputVariables"为空。假设默认值为1.00000。

指定执行器饱和限制为操作变量约束。

mpcobj。MV = struct(“最小值”, 1“马克斯”1);

明确的政策委员会

约束将MPC控制器的状态空间划分为许多多面体区域,这样在每个区域内,MPC控制律是一个特定的仿射状态和参考函数,其系数取决于区域。显式MPC离线计算所有这些区域及其相对控制律。在线时,控制器只需选择并应用相对于当前区域的预计算解,因此它不必在每个控制步骤中求解约束二次优化问题。有关显式MPC的更多信息,请参见明确的政策委员会

生成显式MPC控制器

显式MPC执行传统MPC控制器定义的MPC控制律的等效显式分段仿射版本。要从传统的MPC控制器生成显式MPC控制器,必须为每个控制器状态、参考信号、操纵变量和测量扰动指定范围。这样做可以确保二次规划问题在由这些范围定义的空间中得到解决。如果在运行时,这些自变量中的一个超出了它的范围,控制器返回一个错误状态,并将被操作的变量设置为它们的最后值。因此,不要低估这些范围是很重要的。

要生成合适的范围,首先要获得控制器状态的一些信息。要显示控制器的初始状态,使用mpcstate

mpcstate (mpcobj)
——>转换“模型”。属性到状态空间。——>转换模型到离散时间。假设对测量输出#1没有扰动。——>”模型。“噪音”是空的。假设每个测量输出都有白噪声。MPCSTATE对象与字段Plant:[0 0]扰动:[1x0 double]噪声:[1x0 double] LastMove: 0协方差:[2x2 double]

正如预期的那样,卡尔曼估计器使用的植物模型有2个状态,然后需要一个额外的状态来保存被操纵变量的最后一个值。

MPC控制器状态依次包括植物模型、扰动模型、噪声模型和被操纵变量的最后值。若要创建可以为每个状态、引用和操作变量指定范围的范围结构,请使用generateExplicitRange

range = generateExplicitRange(mpcobj);

当状态与物理参数不对应时,设置状态变量的范围有时很困难。在这种情况下,为了收集反映状态范围的数据,建议使用典型的参考信号和扰动信号,以及模型不匹配进行多次开环植物模拟。对于本例,按如下方式高估范围。

range.State.Min(:) = [-10;-10];range.State.Max(:) = [10;10];

通常你知道在工厂的标称工作点上使用的参考信号的实际范围。用于生成显式MPC控制器的范围必须至少与实际范围一样大。

range.Reference.Min = -2;range.Reference.Max = 2;

指定被操作的变量范围。如果被操纵的变量受到约束,用于生成显式MPC控制器的范围必须至少与这些限制一样大。

range.ManipulatedVariable.Min = -1.1;range.ManipulatedVariable.Max = 1.1;

使用generateExplicitMPC命令获取具有指定参数范围的显式MPC控制器。

mpcobjExplicit = generateExplicitMPC(mpcobj, range)
发现/未开拓的地区:19/0明确MPC控制器  --------------------------------------------- 控制器样品时间:0.1(秒)多面区域:19的参数数量:4解决方案简化:没有状态估计:默认卡尔曼增益  --------------------------------------------- “mpcobjExplicit类型。MPC’的原始隐式MPC设计。“mpcobjExplicit类型。Range'表示有效的参数范围。“mpcobjExplicit类型。OptimizationOptions'用于多参数QP计算的选项。“mpcobjExplicit类型。pieceaffinresolution '用于每个解决方案中的区域和增益。

使用简化函数与“准确”方法来连接对应增益相同且并集为凸集的区域对。这样做可以减少显式MPC控制器的内存占用,而不牺牲任何性能。

mpcobjExplicitSimplified =简化(mpcobjExplicit, mpcobjExplicit,“准确”
区域分析:15/15明确MPC控制器  --------------------------------------------- 控制器样品时间:0.1(秒)多面区域:15参数的数量:4解决方案简化:是的状态估计:默认卡尔曼增益  --------------------------------------------- “mpcobjExplicitSimplified类型。MPC’的原始隐式MPC设计。“mpcobjExplicitSimplified类型。Range'表示有效的参数范围。“mpcobjExplicitSimplified类型。OptimizationOptions'用于多参数QP计算的选项。“mpcobjExplicitSimplified类型。pieceaffinresolution '用于每个解决方案中的区域和增益。

减少了分段仿射区域的数量。

沿给定截面分段仿射划分

您可以绘制控制器状态空间的2D部分,并查看该部分中的区域。对于本例,绘制由第一个和第二个状态变量(负载角和角速度)定义的状态空间的2D部分。为此,您必须首先创建一个图结构,在其中将所有其他状态(和参考信号)固定为各自范围内的特定值。

若要创建参数结构,可以指定随后绘制哪个2-D部分,请使用generatePlotParameters函数。

plotpars = generatePlotParameters(mpcobjExplicitSimplified)
plotpars = struct with fields: State: [1x1 struct] Reference: [1x1 struct] measured扰动:[1x1 struct] ManipulatedVariable: [1x1 struct]

在本例中,您将第一个状态变量与第二个状态变量相对应。所有其他参数必须固定在各自范围内的值。

通过不指定索引,让状态变量自由变化。

plotpars.State.Index = [];plotpars.State.Value = [];

指定参考信号的索引,并将其固定为的值0

plotpars.Reference.Index = 1;plotpars.Reference.Value = 0;

指定被操作变量的index,并将其固定为的值0

plotpars.ManipulatedVariable.Index = 1;plotpar . manipulatedvariable . value = 0;

使用plotSection命令绘制由两个自由参数定义的2-D部分。有关更多信息,请参见plotSection

plotSection (mpcobjExplicitSimplified plotpars);轴([-4 4 -4 4]);网格包含(“国家# 1”);ylabel (“国家# 2”);

模拟使用mpcmove函数

比较传统隐式MPC和显式MPC的闭环模拟mpcmove而且mpcmoveExplicit函数分别。

初始化变量以存储闭环MPC响应。

N = round(5/Ts);YY = 0 (N,1);YYExplicit = 0 (N,1);UU = 0 (N,1);UUExplicit = 0 (N,1);

准备用于仿真的植物模型

sys = c2d(ss(plant),Ts);Xsys = [0;0];xsysExplicit = xsys;

若要获得指向两个控制器内部状态的指针,请使用mpcstate

XMPC = mpcstate(mpcobj);xmpcExplicit = mpcstate(mpcobjExplicitSimplified);

迭代模拟两个控制器的闭环响应。

k = 1:N-1%更新工厂测量ysys = sys.C*xsys;ysysExplicit = sys.C*xsysExplicit;计算传统的MPC动作U = mpcmove(mpcobj,xmpc,ysys,1);%计算显式MPC动作uExplicit = mpcmoveExplicit(mpcobjExplicit,xmpcExplicit,ysysExplicit,1);%存储信号YY (k) = ysys;YYExplicit (k) = ysysExplicit;UU (k) = u;UUExplicit (k) = uExplicit;%更新工厂状态Xsys = sys。A*xsys + sys.B*u;xsysExplicit = sys。A*xsysExplicit + sys.B*uExplicit;结束%传统控制器信号与显式控制器信号之差的显示范数。流(使用MPCMOVE命令的传统MPC响应和显式MPC响应之间的差异是%g\n'...规范(UU-UUExplicit) +规范(YY-YYExplicit));
使用MPCMOVE命令的传统MPC和显式MPC响应之间的差异是1.27751e-13

模拟使用sim卡函数

比较传统和显式MPC之间的闭环模拟sim卡命令。

N = 5/Ts;%模拟迭代次数[y1,t1,u1] = sim(mpcobj,N,1);采用传统MPC进行模拟[y2,t2,u2] = sim(mpcobjExplicitSimplified,N,1);%模拟显式MPC
——>转换“模型”。属性到状态空间。——>转换模型到离散时间。假设对测量输出#1没有扰动。——>”模型。“噪音”是空的。假设每个测量输出都有白噪声。

仿真结果基本一致。

流(使用SIM命令的传统MPC响应和显式MPC响应之间的差异是%g\n'...规范(u2-u1) +规范(y2-y1));
使用SIM命令的传统MPC响应和显式MPC响应之间的差异为1.28188e-13

使用Simulink进行模拟金宝app

在Simulink中对传统MPC控制器进行仿真。金宝appMPC Controller块配置为使用mpcobj作为控制器。

mdl =“mpc_doubleint”;open_system (mdl) sim (mdl)

在Simulink中模拟显式MPC控制器。金宝app显式MPC控制器块配置为使用mpcobjExplicitSimplified作为控制器。

mdlExplicit =“empc_doubleint”;open_system (mdlExplicit) sim (mdlExplicit)

闭环响应是相同的。

流(Simulink中传统MPC响应与显式MPC响应的差异为%g\n'金宝app...规范(uExplicit-u) +规范(yExplicit-y));
在Simulink中,传统MPC响应和显式MPC响应之间的差异为1.39164e-13金宝app

关闭两个simulin金宝appk模型。

bdclose (mdl) bdclose (mdlExplicit)

另请参阅

功能

对象

相关的例子

更多关于