本节,我们将讨论如何操作以更快地运行MPC。
我们仍会用到上一篇文章中提到的“煎饼”进行类比,制作煎饼是一个复杂的过程,你需要准备配料、摊煎饼,在客人失去耐心之前赶紧上菜,难点还在于我们必须在有限的空间内存放所有配料。
同理,在计算领域,MPC也很复杂。一个原因是模型预测控制每步只会处理一种在线优化问题。
MPC问题的产生来源于QP问题的出现,后者强调最小化二次成本函数。MPC算法会随着状态、约束条件、控制长度和预测时域的增多而越发复杂。
如果MPC控制器在大型动态应用服务器上缓慢运行,如工厂流程化作业,那么计算复杂性也不是什么大问题。然而,假设我们想在自动驾驶汽车的ECU上部署MPC算法,那么我们需要在毫秒级的小取样间隔内解决优化问题。另外,嵌入式硬件的内存有限,MPC计算需要存储的矩阵随优化变量数量的增加而快速增长,为此,我们必须确保内存不会耗尽。
哪些方法可以提高通量、减少内存的使用?以煎饼为例,如果某些食材对味道的影响不大但却需要很多时间进行准备,你应果断把其从食谱中将其去掉,这能大大减少备菜和上菜的时间,让所有材料都能轻易地储存在有限的空间内。
同理,为了降低MPC计算的复杂度和时间,你可以尝试“模型降阶”法,舍弃对系统动力没有贡献的状态,这也有助于减少对控制器内存的占用。
此外,为了提高通量、减少内存,我们还可以缩短控制时间和预测范围,减少限制条件的数量或使用更低精度的操作和数据表达来实现MPC。
对于取样时间较短的应用,我们可以采用这些技巧来实现MPC。但是,如果控制系统的取样时间更短,那么可以使用显式MPC。以煎饼类比,显式MPC指的是每次摊煎饼时,我们可以用预先配制好的煎饼粉,而不是临时把所有配料混在一起,以节省时间。
显式MPC不是在线为当前状态解决优化问题,而是离线解决既定范围内的所有状态。对于既定范围内的每个x值,显式MPC都能预先算出最优解,这个解由线性函数组成,分段仿射且在x轴上是连续的,任何约束条件能将“解”切割成不同区域,每个区域映射出唯一最优解。
在二态体系中,可以这样理解,离线计算出最优解后,MPC会在线找到当前状态所在的区域,并评估线性函数,以此创建当前控制操作。将迭代优化过程转化为线性函数,大大简化了运行时间计算,因此,可以在非常短的取样时间内,为应用程序部署显式MPC。
预先配制的调料固然很好,但如果你想要其他不同的口味,那就得多花些时间琢磨了,配制不同口味的调料,都需要占用一定的空间。同理,如果有很多区域,搜索当前状态所在的区域可能十分耗时,此外,存储所有区域又需要占用很大的内存,我们可以通过合并区域来减少区域数量,然而,这也不是最优解。
另一种更快运行MPC的方法是,使用次优解。以煎饼为例,上菜时间会因餐盘装饰的不同而产生很大变化,不想等待太久的顾客,可以选择菜单上的基础款,其他更有耐心、愿意等待更长的时间的人,可以选择豪华款。在MPC问题中,寻找最优解的迭代次数是完全不可预测的,从一个步骤到另一个步骤会发生巨大的变化,在最坏的情形下,计算时间可能超过控制器的取样时间。
然而,我们希望在取样时间内找到解决方案,甚至还有一些空余时间来执行硬件上的其他任务,为了解决这一问题,我们可以确定迭代优化次数的最大值。示例中,我们需要10次迭代才能找到最优解。然而,由于最大迭代次数被设置为5次,当达到5次时,控制器会停止优化并使用该迭代的次优解。注意,尽管是次优解,但仍能满足优化问题的所有约束条件。
如要确定最大迭代次数,可以在硬件上测试算法,确定每次迭代的执行时间。假设每次迭代的执行时间相似,你可以选择最大的迭代次数,前提是总执行时间不超过控制器取样时间。
总之,为了更快地运行MPC, 你可以先尝试这些小技巧,看看它们是否适用于你的系统。对于取样时间极短的快速应用程序而言,我们可以使用显式MPC,通过离线预计算最优解,来大大减少运行时间计算。另外一个提高通量、确保最坏情形下,MPC控制器执行不超时的办法是使用次优解。
如果你想了解更多关于模型预测控制的知识,请观看下列视频:
【MPC模型预测控制器】1_最优化控制和基本概念_哔哩哔哩_bilibili
关于如何使用Simulink和模型预测控制工具箱设计MPC控制器请观看下列视频:
【Model Predictive Control】了解模型预测控制,第六部分:如何使用 Simulink 和模型预测控制工具箱设计 MPC 控制器_哔哩哔哩_bilibili
【Model Predictive Control】了解模型预测控制,第七部分:使用 Simulink 和模型预测控制工具箱 - MATLAB&Simulink_哔哩哔哩_bilibili
文章内容的视频地址如下:
【Model Predictive Control】了解模型预测控制,第五部分:如何加速运行 MPC - MATLAB&Simulink_哔哩哔哩_bilibili