主要内容

根据最佳成本切换控制器

此示例显示如何使用MPC控制器块的“最佳成本”出口,以在多个模型预测控制器之间切换,其输出限于离散值。

定义工厂模型

线性植物模型如下::

Plant = SS(TF({1,1},{[1 1.2 1],[1 1]}),'min');%植物有2个输入和1个输出[A,B,C,D] = SSDATA(工厂);%获取状态空间实现矩阵,以在Simulink中使用万博1manbetxx0 = [0; 0; 0];%初始植物状态

设计MPC控制器

指定输入和输出信号类型。

植物= setmpcsignals(植物,'mv',1,'MD',2);百分比首次输入被操纵,第二个是测量干扰

使用MV约束设计两个MPC控制器u = -1u = 1, 分别。仅有的在当前时间量化。随后的计算控制操作可以是-1和1之间的任何值。控制器使用后退地平线方法,因此这些值实际上不会进入植物。

ts = 0.2;%采样时间p = 20;%预测地平线m = 10;%控制地平线MPC1 = MPC(植物,TS,P,M);%First MPC对象MPC2 = MPC(植物,TS,P,M);%第二MPC对象%指定权重mpc1.weights = struct('mv',0,'mvrate',.3,'输出',1);%重量mpc2.weights = struct('mv',0,'mvrate',.3,'输出',1);%重量%指定约束mpc1.mv = struct('min',[ -  1; -1],'最大限度',[ -  1; 1]);操纵变量上的%约束:u = -1mpc2.mv = struct('min',[1; -1],'最大限度',[1; 1]);在操纵变量上的%约束:u = 1
- >“MPC”对象的“权重”属性为空。假设默认为0.00000。- >“权重”属性“MPC”对象的“权重”属性为空。假设默认为0.10000。- >“MPC”对象的“权重”属性为空。假设默认为1.0万。- >“MPC”对象的“权重”属性为空。假设默认为0.00000。- >“权重”属性“MPC”对象的“权重”属性为空。假设默认为0.10000。 -->The "Weights.OutputVariables" property of "mpc" object is empty. Assuming default 1.00000.

在Simulink®中模万博1manbetx拟

要运行此示例,需要Simulink®。万博1manbetx

如果〜mpcchecktoolboxinstalled('万博1manbetxsimulink')disp('万博1manbetxSimulink(R)需要运行此示例。'返回结尾%指定信号:tstop = 40;Ref.Time = 0:TS :( tstop + p * ts);ref.signals.values = double(ref.time> 10)';%步骤在时间t = 10的参考信号改变md.time = ref.time;md.signals.values = double(md.time> 30)';在时间t = 30的测量干扰信号中的%步骤改变

打开并模拟Simulink®型号:万博1manbetx

mdl ='mpc_optimalcost';Open_System(MDL);%Open S万博1manbetximulink(R)模型SIM(MDL,TSTOP);%开始模拟
- >将模型转换为离散时间。- >假设添加到测量的输出干扰,输出通道#1是集成的白噪声。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量的输出通道上的白噪声。- >将模型转换为离散时间。- >假设添加到测量的输出干扰,输出通道#1是集成的白噪声。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量的输出通道上的白噪声。

注意:

  • 从0到时间10到时间10,控制操作在MPC1(-1)和MPC2(+1)之间保持切换。这是因为参考信号是0,并且它需要0处的控制器输出以达到稳定状态,这不能通过MPC控制器实现。

  • 从时间10到30,选择MPC2控制输出(+1),因为参考信号变为+1,它需要在+1处输出达到稳定状态(工厂增益为1),这可以通过MPC2实现。

  • 从时间30到40时,控制操作再次开始切换。这是因为存在测量干扰(+1),MPC1导致0的稳定状态,MPC2导致稳定状态+2,而参考信号仍然需要+1。

使用mpcmove命令模拟

采用MPCMOVE.要执行逐步仿真并计算当前MPC控制操作:

[AD,BD,CD,DD] = SSDATA(C2D(工厂,TS));%离散时间动态nsteps = round(tstop / ts);%仿真步骤数

初始化用于存储仿真结果的矩阵

yy =零(nsteps + 1,1);rr = zeros(nsteps + 1,1);UU =零(nsteps + 1,1);成本=零(nsteps + 1,1);x = x0;%初始植物状态xt1 = mpcstate(mpc1);MPC控制器#1的%初始状态xt2 = mpcstate(mpc2);MPC控制器#2的%初始状态

开始模拟。

为了td = 0:nsteps%构造信号v = md.Signals.Values(TD + 1);r = ref.signals.values(td + 1);%植物方程式:输出更新Y = CD * x + DD(:,2)* v;%计算两个MPC移动选项= mpcmoveopt;options.onlycomputecost = true;%最后一个输入参数告诉“MPCMove”只计算最佳成本[U1,INFO1] = MPCMOVE(MPC1,XT1,Y,R,V,选项);[U2,INFO2] = MPCMOVE(MPC2,XT2,Y,R,V,选项);%比较结果最佳成本并选择输入值%对应于最小成本如果info1.cost <= info2.cost u = u1;成本= INFO1.COST;%更新内部MPC状态到正确的值xt2.plant = xt1.plant;xt2.disturbance = xt1.disturbance;xt2.lastmove = xt1.lastmove;别的u = u2;成本= INFO2.COST;%更新内部MPC状态到正确的值xt1.plant = xt2.plant;xt1.disturbance = xt2.disturbance;xt1.lastmove = xt2.lastmove;结尾%储存工厂信息YY(TD + 1)= Y;rr(td + 1)= r;UU(TD + 1)= U;成本(TD + 1)=成本;%植物方程式:状态更新x =广告* x + bd(:,1)* u + bd(:,2)* v;结尾

绘制结果MPCMOVE.要与Simulink®中获得的模拟结果进行比较:万博1manbetx

子图(131)绘图((0:nsteps)* ts,[yy,rr]);%绘图输出和参考信号网格标题('ov和参考')子图(132)绘图((0:nsteps)* ts,uu);%绘图操纵变量网格标题('mv')子图(133)绘图((0:nsteps)* ts,成本);%绘图最佳MPC值函数网格标题('最佳成本'

这些绘图类似于Simulink®模型中的范围中的图。万博1manbetx

bdclose(mdl);

也可以看看

相关话题