在快速MPC应用程序使用次优的解决方案
这个例子展示了如何保证最坏执行时间的MPC控制器实时应用程序通过使用优化解算器返回的次优的解决方案。
一个理想的解决方案是什么?
模型预测控制(MPC)解决了二次规划(QP)问题在每个控制区间。内置的QP解算器使用一个迭代为MPC应用有效集算法是有效的。然而,当约束存在,没有办法预测需要多少解决迭代找到一个最佳的解决方案。同时,在实时应用中,迭代的数量可以改变戏剧性地从一个控制间隔下。在这种情况下,最坏执行时间可以超过允许的极限,在硬件平台上,由控制器样品时间。
你能保证最坏执行时间为你的MPC控制器通过应用一个次优的解决方案在优化迭代的数量超过了指定的最大值。最坏执行时间,首先确定一个单一的优化迭代所需的时间由标称条件下试验控制器。然后,设置一个小的数量上限每控制区间迭代。
默认情况下,当达到最大迭代次数,MPC控制器不使用次优的解决方案。相反,控制器设置一个错误标志(状态= 0
),冻结其输出。可用的解决方案往往在早期迭代是足够好,但是需要细化,找到一个最优解,从而导致许多额外的迭代。
这个例子展示了如何配置你的MPC控制器使用次优的解决方案。理想的解决方案是一个可行的解决方案在最后的迭代(修改,如果有必要,以满足任何硬约束的操纵变量)。确定理想的解决方案为您的应用程序提供可接受的控制性能,运行模拟您的操作范围。
定义植物模型
工厂模式是系统随机生成的稳定状态。它有10
州,3
被操纵的变量(MV)3
输出(OV)。
rng (1234);nX = 10;11月= 3;nMV = 3;工厂= rss (nX 11月,nMV);工厂。d = 0;t = 0.1;
设计限制MVs和ov MPC控制器
创建一个MPC控制器除了约束所有控制器参数的默认值。指定约束操作和输出变量。
冗长= mpcverbosity (“关闭”);%暂时禁用命令行信息。mpcobj = mpc(植物、Ts);为i = 1: nMV mpcobj.MV(我)。最小值= -1.0;mpcobj.MV(我)。Max = 1.0;结束为i = 1: 11月mpcobj.OV(我)。最小值= -1.0;mpcobj.OV(我)。Max = 1.0;结束
同时限制操作和输出变量都需要一个相对大量的QP迭代确定最优控制序列。
在MATLAB模拟随机输出干扰
首先,模拟MPC控制器在每个控制间隔使用的最佳解决方案。只专注于输出干扰抑制性能,设置输出引用值为零。
T = 5;N = T / T + 1;r = 0(11月1日);SimOptions = mpcsimopt ();SimOptions。OutputNoise = 3 * randn (N, 11月);[y, t, u, ~, ~, ~,状态]= sim (mpcobj N r, [], SimOptions);
阴谋每个控件中使用的迭代次数间隔。
图楼梯(状态)在标题(的迭代次数)
最大的是21日的迭代次数和平均是5.8迭代。
创建一个MPC控制器使用相同的设置,但是配置使用次优的解决方案。
mpcobjSub = mpcobj;mpcobjSub.Optimizer。UseSuboptimalSolution = true;
减少迭代的最大数量为默认激活集QP解决一个小数目。
mpcobjSub.Optimizer.ActiveSetOptions。MaxIterations = 3;
模拟相同的第二个控制器输出扰动序列。
[ySub tSub uSub, ~, ~, ~, statusSub] = sim (mpcobjSub N r, [], SimOptions);
情节的迭代的数量用于每个控制间隔相同的情节。对于任何控制间隔达到最大迭代次数,statusSub
是零。策划的结果之前,这些时间间隔的迭代次数3
。
statusSub (statusSub = = 0) = 3;楼梯(statusSub)传说(“最优”,“次优”)
现在最多的迭代3,平均是2.8迭代。
比较两个控制器的性能。当次优的解决方案是使用,没有严重恶化相比,控制性能最优解决方案。
图为ct = 1:3次要情节(3、1,ct)情节(t、y (ct):,, t, ySub (ct):,)结束次要情节(1,1)标题(“输出”)传说(“最优”,“次优”)
对于实时应用程序,只要每个迭代解算器只需要不到30毫秒硬件,最坏执行时间不超过控制器样品时间(0.1
秒)。一般来说,它是安全的假设每个迭代使用的执行时间或多或少是一个常数。
在仿真软件模拟随机输出干金宝app扰
打开包含控制器和模金宝app拟仿真软件模型。
模型=“mpc_SuboptimalSolution”;open_system(模型)sim(模型)
在命令行仿真,平均每个控制区间的QP迭代数没有显著影响控制性能下降。
mpcverbosity(详细);%启用命令行信息。bdclose(模型)