主要内容

显式MPC控制单输入单输出工厂

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

有关使用隐式MPC控制器控制双积分器的示例,请参阅单输入单输出装置的模型预测控制

定义工厂模型

线性开环动态模型是双积分器。

植物= TF(1,[1 0 0]);

MPC控制器设计

使用采样周期,预测和控制视野创建控制器对象。

t = 0.1;p = 10;m = 3;mpcobj = mpc(plant, Ts, p, m);
- >“MPC”对象的“权重”属性为空。假设默认为0.00000。- >“权重”属性“MPC”对象的“权重”属性为空。假设默认为0.10000。- >“MPC”对象的“权重”属性为空。假设默认为1.0万。

将执行器饱和度限制指定为MV约束。

mpcobj.mv = struct('min', 1'最大限度'1);

生成显式MPC控制器

显式MPC执行传统隐式MPC控制律的等效显式分段仿射。为了从传统的MPC生成显式MPC,必须为每个控制器状态、参考信号、被操纵变量和测量扰动指定范围,以便在这些范围定义的参数空间中解决多参数二次规划问题。

使用生成explicitrange.函数以获取可以指定参数范围的范围结构。

Range = GenerateExplicitrange(MPCobj);
- - - >转换”模型。将“mpc”对象的“属性”放入状态空间。——>模型转换为离散时间。假设对测量的输出通道#1没有增加任何干扰。——>”模式。mpc对象的Noise属性为空。假设每个测量输出通道上都有白噪声。

MPC控制器的状态依次包括被控对象模型、扰动模型和噪声模型的状态。当状态与物理参数不对应时,设置状态变量的范围有时很困难。在这种情况下,为了收集反映状态范围的数据,建议使用典型参考信号和干扰信号进行多次开环仿真。

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

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

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

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

Range.ManipuldVariaire.min = -1.1;Range.ManipuldVariaire.max = 1.1;

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

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

使用简化用来的功能'精确的'加入对应的收益对成对的方法是相同的,其工会是凸集。这样做可以减少显式MPC控制器的内存占用空间,而不会牺牲任何性能。

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

分段仿射区的数量已减少。

绘制分段仿射划分

你可以回顾任何由显式MPC控制律定义的分段仿射划分的二维部分。

使用生成PlotParameters.命令获取一个参数结构,您可以在该参数结构中指定随后要绘制的2d区域。

Params = GeneratePlotParameters(mpcobjexplicitsimplificed);

在此示例中,将第一状态变量绘制对第二状态变量。所有其他参数必须以各自范围内的值固定。

params.state.index = [];params.state.Value = [];

固定其他参考信号。

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

修复被操纵的变量。

Params.ManipuldVariable.index = 1;Params.ManipuldVariable.Value = 0;

使用斑块命令绘制先前定义的2-D部分。

plotsection(mpcobjexplicitsimplified,params);轴([ -  4 4 -4 4]);网格xlabel(“国家# 1”);ylabel(“国家# 2”);

模拟使用MPCMOVE.功能

比较传统的隐式MPC的闭环模拟,并使用明确的MPCMPCMOVE.mpcmoveexplict.函数分别。

准备存储闭环MPC响应。

tf = round(5 / ts);yy =零(tf,1);yyexplicit =零(tf,1);UU =零(TF,1);uuexplicic = zeros(tf,1);

准备模拟中使用的真实植物

sys =汇集(ss(植物),Ts);xsys = (0, 0);xsysExplicit = xsys;

用A.MPCState.对象为两个控制器指定初始状态。

xmpc = mpcstate(mpcobj);xmpcexplicit = mpcstate(mpcobjexplicitsimplificed);

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

为了t = 0: Tf%更新工厂测量ysys = sys.c * xsys;Ysysexplict = sys.c * xsysexplic;%计算传统的MPC动作u = mpcmove(mpcobj,xmpc,ysys,1);%Compute显式MPC操作Uexplicit = MPCMoveExplic(mpcobjexplicit,xmpcexplicit,ysysexplict,1);%储存信号YY (t + 1) = ysys;YYExplicit (t + 1) = ysysExplicit;UU (t + 1) = u;UUExplicit (t + 1) = uExplicit;%更新工厂状态Xsys = sys.a * xsys + sys.b * u;xsysexplicic = sys.a * xsysexplic + sys.b * uexplicit;结尾fprintf(使用MPCMOVE命令的传统MPC响应和显式MPC响应的区别是%g\n'......常态(UU-UUEXPLET)+ NOM(YY-YYEXPLET));
使用MPCMove命令的传统和显式MPC响应之间的差异为2.19461E-13

模拟使用SIM功能

比较了传统MPC和显式MPC的闭环仿真SIM命令分别。

tf = 5 / ts;%模拟迭代[Y1,T1,U1] = SIM(MPCOBJ,TF,1);与传统MPC的仿真(y2, t2, u2) = sim (mpcobjExplicitSimplified, Tf, 1);用显式MPC进行仿真
- - - >转换”模型。将“mpc”对象的“属性”放入状态空间。——>模型转换为离散时间。假设对测量的输出通道#1没有增加任何干扰。——>”模式。mpc对象的Noise属性为空。假设每个测量输出通道上都有白噪声。

仿真结果是相同的。

fprintf(“使用SIM命令之间的传统和显式MPC响应之间的Ndifference是%g \ n'......规范(U2-U1)+常规(Y2-Y1));
使用SIM命令的传统和显式MPC响应之间的差异为2.19384E-13

模拟使用Simulink.金宝app

要运行此示例,需要Simulink。金宝app

如果〜mpcchecktoolboxinstalled('金宝appsimulink') disp ('金宝appSimulink需要运行此示例。返回结尾

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

mdl ='mpc_doubleint';Open_System(MDL)SIM(MDL)

模拟Simulink中的显式MPC控制器。金宝app显式MPC控制器块配置为使用mpcobjexplicitsimplified.作为其控制器。

mdlExplicit ='empc_doubleint';open_system (mdlExplicit) sim (mdlExplicit)

闭环响应是相同的。

fprintf(“在Simulink中的传统和显式MPC响应之间的ndifference是%g \ n'金宝app......常态(Uexplic-U)+常规(yexplicit-y));
Simulink中传统和显式MPC响应之间的差异为2.21176E-13金宝app
BDCLOSE(MDL)BDCLOSE(构建)

相关话题