这个例子展示了如何使用显式MPC控制直流伺服机构在电压和轴扭矩约束下。
有关使用传统隐式MPC的类似示例,请参见具有输出量约束的直流伺服电机.
线性开环动态模型定义为植物
.多变的TAU
是要用作输出约束的最大可接受扭矩。
(植物、τ)= mpcmotormodel;
指定MPC控制器的输入和输出信号类型。第二个输出,扭矩,是无法测量的。
植物= setmpcsignals(植物,“MV”,1,'莫',1,'uo',2);
操纵变量被限制在+/- 220伏之间。由于工厂的输入和输出是不同数量级的,您还可以使用比例因子来促进MPC的调整。标度因子的典型选择是上限/下限或操作范围。
MV =结构(“最小值”, -220,“马克斯”,220,“ScaleFactor”, 440);
为了限制显式MPC设计的复杂性,仅在前三个预测步骤中施加扭矩输出约束。
ov = struct(“最小值”,{正无穷,τ,τ;τ;负)},…“马克斯”,{正无穷,τ;τ,τ;正]},…“ScaleFactor”,{2 * pi,2 * tau});
控制任务是使角位置的跟踪偏移量为零。由于您只有一个操纵变量,轴扭矩可以通过将其权重设置为零而在其约束范围内浮动。
重量=结构(“MV”,0,'mvrate', 0.1,'ov', 0.1 [0]);
使用采样时间创建MPC控制器Ts
,预测地平线p
,控制视界米
.
ts = 0.1;p = 10;m = 2;MPCOBJ = MPC(植物,TS,P,M,重量,MV,OV);
显式MPC执行由传统的隐式MPC控制器定义的MPC控制法的等效显式分段仿射版本。要从隐式MPC控制器生成显式MPC控制器,必须指定每个控制器状态,参考信号,操纵变量和测量干扰的范围,以便在这些范围定义的参数集中解决了多参数二次编程问题.
创建一个范围结构,您可以随后为每个参数指定范围。
范围= generateExplicitRange (mpcobj);
- >将模型转换为离散时间。假设没有添加到测量的输出通道#1中的干扰。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量的输出通道上的白噪声。
指定控制器状态的范围
MPC控制器状态包括来自植物模型,扰动模型和噪声模型的状态。设置状态变量的范围有时难以在状态不对应于物理参数时困难。在这种情况下,要收集状态范围数据,建议使用具有典型参考和干扰信号的多个开环工厂模拟。
range.State.Min (,) = -1000;range.State.Max (,) = 1000;
通常,您知道在工厂中标称工作点使用的参考信号的实际范围。用于生成显式MPC控制器的范围必须至少与实际范围一样大。请注意,扭矩参考范围是固定的0
因为它具有零重量。
Range.Reference.min = [-5; 0];Range.Reference.max = [5; 0];
如果被限制的被限制,则用于生成显式MPC控制器的范围必须至少与这些限制一样大。
range.ManipulatedVariable.Min = MV。分钟- 1;range.ManipulatedVariable.Max = MV。Max + 1;
使用指定的范围创建显式MPC控制器。
mpcobjexplicit = generateexplicitmpc(mpcobj,范围)
发现/未开拓的地区:75/0明确MPC控制器 --------------------------------------------- 控制器样品时间:0.1(秒)多面区域:75数量的参数:6是解决方案简化:没有状态估计:默认卡尔曼增益 --------------------------------------------- “mpcobjExplicit类型。为原始的隐式MPC设计。“mpcobjExplicit类型。'的有效参数范围。“mpcobjExplicit类型。OptimizationOptions'用于多参数QP计算的选项。“mpcobjExplicit类型。piecewiseaffinsolution '的区域和增益在每个解决方案。
你可以回顾任何由显式MPC控制律定义的分段仿射划分的二维部分。为此,首先创建一个参数结构,您可以在其中指定要绘制哪个2-D区域。
params = generatePlotParameters (mpcobjExplicit);
在此示例中,将第一状态变量绘制对第二状态变量。所有其他参数必须以各自范围内的值固定。
修复其他状态变量。
params.State.Index = [3 4];params.State.Value = [0 0];
修复参考信号。
params.Reference.Index = [1 2];params.Reference.Value = [pi 0];
解决操纵变量。
params.ManipulatedVariable.Index = 1;params.ManipulatedVariable.Value = 0;
绘制指定的二维剖面。
plotSection (mpcobjExplicit params);轴([-。3.3 -2 -2]);网格标题(分区的部分(x3 (t) = 0 x4 (t) = 0, u (t - 1) = 0, r (t) =π)”)Xlabel(“x1 (t)”)ylabel(“x2 (t)”)
sim卡
功能比较隐式MPC和显式MPC控制器之间的闭环仿真结果。
tstop = 8;%秒Tf =圆(Tstop / Ts);%模拟迭代R = [0];%的参考信号(y1, t1, u1) = sim (mpcobj, Tf, r);%仿真与传统MPC(y2, t2, u2) = sim (mpcobjExplicit, Tf, r);%模拟显式MPC
- >将模型转换为离散时间。假设没有添加到测量的输出通道#1中的干扰。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量的输出通道上的白噪声。
仿真结果是相同的。
流('隐式和显式MPC轨迹之间的区别=%g \ n',…规范(u2-u1) +规范(y2-y1));
隐式和显式MPC轨迹之间的差异= 4.60623E-12
要运行此示例,需要Simulink®。金宝app
如果~ mpcchecktoolboxinstalled (“金宝app模型”)disp(运金宝app行这个示例需要Simulink(R)。)返回结束
模拟Simulink中线性植物模型的闭环控制。金宝app显式MPC控制器块配置为使用mpcobjexpreic
作为控制器。
mdl =“empc_motor”;open_system (mdl) sim (mdl)
闭环响应与设计的传统MPC控制器相同具有输出量约束的直流伺服电机.
要减少内存足迹,可以使用简化
减少分段仿射解决方案区域的数量的功能。例如,您可以删除Chebyshev Radius小于的区域0.08
.但是,您支付的价格是控制器性能是次优。
mpcobjexplicitsimplificed = simplify(mpcobjexplicitic,“半径”, 0.08)
要分析的区域:75/ 75——>删除37个区域。明确的MPC控制器 --------------------------------------------- 控制器样品时间:0.1(秒)多面区域:38号参数:6是解决方案简化:是的状态估计:默认卡尔曼增益 --------------------------------------------- “mpcobjExplicitSimplified类型。为原始的隐式MPC设计。“mpcobjExplicitSimplified类型。'的有效参数范围。“mpcobjExplicitSimplified类型。OptimizationOptions'用于多参数QP计算的选项。“mpcobjExplicitSimplified类型。piecewiseaffinsolution '的区域和增益在每个解决方案。
分段仿射区的数量已减少。
比较了次优显式MPC和显式MPC的闭环仿真结果。
[Y3,T3,U3] = SIM(MPCobjExplicitsimplified,TF,R);
- >将模型转换为离散时间。假设没有添加到测量的输出通道#1中的干扰。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量的输出通道上的白噪声。
模拟结果是不一样的。
流(精确和次优显式MPC轨迹之间的差异= %g\n',…规范(u3-u2) +规范(y3-y2));
精确和次优显式MPC轨迹之间的差异= 439.399
情节结果。
图次要情节(3、1、1)的阴谋(t1, y1 (: 1), t3、y3 (: 1),“o”)网格标题(“角(rad)”)传说(“明确”,'次优显式'次要情节(3、1、2)情节(t1, y1 (:, 2), t3、y3 (:, 2),“o”)网格标题('扭矩(nm)')传说(“明确”,'次优显式')子图(3,1,3)绘图(T1,U1,T3,U3,“o”)网格标题(“电压(V)”)传说(“明确”,'次优显式')
使用次优显式MPC的仿真结果略差。
[1] A. Bemporad和E. Mosca,“通过引用管理实现不确定线性系统中的硬约束”自动第34卷第3期4、1998年。
BdClose(MDL)