
简介这是一套面向控制领域学习者、研究生及算法工程师的 Tube-MPC管模型预测控制示例资源聚焦鲁棒 MPC 在系统不确定性下的设计与实现适用于处理模型失配、外部扰动等工程场景。压缩包共 15 个文件以 MATLAB 源码为主辅以 Markdown 说明文档与 JPG 效果图整体仅 176KB轻量易部署。项目将核心算法、工具函数与示例脚本分开组织源码覆盖线性系统建模、内层管约束控制、外层预测优化以及图形化结果展示各环节模块化程度高示例脚本完整演示了扰动不变集的计算、Tube-MPC 与标准 MPC 的对比以及最优控制器的调用过程方便读者从零复现并理解鲁棒管预测控制的实现细节。目前已有 1980 人学习下载配合 README 可快速了解项目结构与运行方式进一步降低上手门槛。既可用于研究生课题验证也可作为本科课程设计或工程应用前的算法验证。1. 为什么普通MPC的确定性假设会在工程现场露出缺口经典模型预测控制最容易被忽视的前提是“模型对未来状态的预测足够准确”。一旦被控对象存在未建模动态、时变参数或者有界外部扰动这套确定性预测就会逐个失效名义约束明明没有违反实际轨迹却频繁越界预测时域越长误差反而越不可控。鲁棒Tube-MPC的解法是把所有可能轨迹装进一个“管”里离线构造一个扰动不变集在线只优化管中心的标称轨迹余下的鲁棒性交给提前设计的反馈增益K。这样既保留了预测控制的滚动优化能力又获得了集合不变性带来的硬约束保证。这个源码包正是围绕这套思想组织起来的覆盖扰动不变集计算、标称MPC求解、Tube闭环控制和图形验证适合已经能建立LTI模型但被不确定性问题困扰的工程师也适合想把Tube-MPC论文算法落成可运行代码的研究者。2. Tube-MPC从管集合构造到约束收紧的完整推导2.1 扰动不变集Tube的边界到底由什么决定先给出最常用的离散LTI描述。标称模型写为x̄_{k1} A x̄_k B ū_k实际被控对象带有有界扰动x_{k1} A x_k B u_k w_k其中 w_k ∈ WW是一个凸紧集工程上通常取超矩形或者椭球包络。误差e_k x_k - x̄_k控制律拆成标称控制和误差反馈两部分u_k ū_k K e_k此时误差动态变成e_{k1} (A BK) e_k w_kTube-MPC的全部理论都建立在这个误差方程上。它要求找到一个集合Z使得任意e∈Z且任意w∈W依然满足:(A BK) e w ∈ Z满足这个包含关系的Z叫扰动不变集。注意这里的Z与线性系统的单纯稳定性不同即使ABK的谱半径小于1也不等于Z自动存在或容易计算它还需要对W做逐项叠加最后收敛到一个非空的有界区域。2.1.1 集合迭代的工程实现扰动不变集的标准做法是用Minkowski和做有限步迭代写成Z_{i1} (A BK) Z_i ⊕ W这里的⊕表示Minkowski和。在这个源码包里example_dist_inv_set.m处理的就是这个迭代过程。实际执行时一般从原点开始迭代20到50步把每一步得到的(ABK)^i W做凸包合并当两次迭代后的集合差异小于某一阈值就停止。Z W; % 初始化从扰动集W开始 for i 1:50 Z_next (A B*K) * Z W; % 逐级膨胀逼近真实不变集 if max(abs(Z_next - Z), [], all) 1e-6 break; end Z Z_next; end这里每一轮循环都是纯粹的多面体或者区间运算计算代价并不高。需要注意的细节是有限步停下来的Z只是近似值尾项(ABK)^M W被丢弃了。为了安全实践中通常把W先外扩一个比例因子δ也就是用δW重新迭代相当于把截断误差补偿进去。K的选择直接影响Z的体积。从收敛速度看(ABK)的谱半径越小衰减越快Z越小。所以这一步与LQR设计是强耦合的不是随便给一个K就能得到窄管。2.2 分离式设计名义控制与局部反馈的协作Tube-MPC的实现通常走分离式设计路线离线做两件事第一用LQR或者极点配置确定K第二依据K构造扰动不变集Z。在线部分只负责一个标准二次规划决策变量是标称控制序列v不再直接把原始输入u放进约束。整体控制律是u_k v_k K (x_k - z_k)z_k是管中心的名义状态v_k是对应的名义控制。由于实际状态x_k被约束在z_k ⊕ Z内要让所有可能轨迹都不违反物理约束标称轨迹必须提前收紧x̄_k ∈ X ⊖ Zū_k ∈ U ⊖ KZ这里的⊖是Pontryagin差直观理解是把原约束向内缩小一圈缩小量等于管截面的尺寸。约束收紧才是“tube预测控制”真正区别于普通MPC的地方在线优化器看到的约束比物理约束更紧紧出来的这一部分就是为不确定性预留下的鲁棒裕度。一个值得记住的工程结论是如果W取大了X⊖Z可能是空集此时问题无解这不是求解器问题是K或者W的设定问题。我应该提醒读者调参时如果遇到无解先回头看Z有没有胖到吃掉整个可行域。2.3 三种MPC变体的直觉对比与选型变体离线设计在线决策变量对扰动的处理方式典型适用场景标称MPC无输入序列u忽略扰动模型精确、扰动极小最小最大鲁棒MPC无每步分支控制律在线求解最坏情况扰动大、约束严格Tube-MPCK和Z标称控制序列v离线构造管、在线收紧约束有界扰动下的LTI系统最小最大鲁棒MPC的在线计算量随预测时域呈指数增长这是它很难走向工程实现的主要原因。Tube-MPC的在线部分与标称MPC同等复杂度只是多了一组离线集合运算工程落地友好得多。但需要注意Tube-MPC的鲁棒性保证只对有界扰动成立。如果w_k超界管就会被击穿约束保证失效。如何把W取得足够诚实我会在最后一章专门讲。3. 源码解构从LinearSystem.m到TubeModelPredictiveControl.m的完整调用链3.1 包内文件结构与依赖顺序先把源码包的文件映射到职责文件类型主要职责LinearSystem.m模型封装定义A、B矩阵状态/输入约束扰动集WOptimalControler.m离线设计求解LQR增益K和终端代价PModelPredictiveControl.m标称求解器忽略扰动求解标准MPC二次规划TubeModelPredictiveControl.m主控制器把标称MPC与管不变集结合起来Graphics.m可视化绘制管截面、名义轨迹、实际轨迹example_dist_inv_set.m示例计算并绘制扰动不变集Zexample_tubeMPC.m示例完整Tube闭环仿真我不建议按文件名顺序读代码而是沿着“离线集合构造→标称QP求解→Tube闭环”这条链读因为后两个模块只是解决前两个模块准备好之后的问题。3.2 OptimalControler.m 与 ModelPredictiveControl.m 的分工OptimalControler.m内部比较典型的结构是function [K, P] OptimalControler(A, B, Q, R) [K, P] dlqr(A, B, Q, R); K -K; % 统一反馈符号约定u -K*x endMATLAB的dlqr返回值约定里K满足u -Kx。但Tube-MPC在误差反馈中通常写u K e。不同作者对符号的处理不一致读代码时如果发现管迭代发散第一个要排查的就是这个负号。终端代价P直接取dlqr的返回值即可它天然满足李雅普诺夫方程能保证末端状态稳定。ModelPredictiveControl.m解决的是一个稀疏二次规划问题。名义MPC的标准形式是min Σ (x_k^T Q x_k u_k^T R u_k) x_N^T P x_N约束包含动态方程逐拍展开后的等式约束以及每个时域步上的输入和状态不等式约束。在这个包里收紧操作通过修改约束集合完成而不是修改动态方程Xtight Xset - Z; % 状态约束收紧 Utight Uset - K*Z; % 输入约束收紧 U ModelPredictiveControl(A, B, N, Q, R, z0, Xtight, Utight);把约束集合换成收紧后的版本这看起来只是参数替换但它是整个Tube-MPC能兑现鲁棒性的关键。名义MPC与Tube-MPC共用一套求解器也符合工程上易于回退的要求需要关闭鲁棒化时只需恢复原始约束集合。3.3 TubeModelPredictiveControl.m 的完整算法骨架把前几个模块串起来Tube-MPC的主循环大致是下面这个样子function [u_seq, z_seq, x_seq] TubeMPC_loop(A, B, Q, R, N, Z, x0, T) [K, P] OptimalControler(A, B, Q, R); z x0; % 初始管中心取当前实测状态 x x0; for k 1:T [v_seq, z_pred] ModelPredictiveControl(... A, B, N, Q, R, z, Xtight, Utight); u v_seq(1) K*(x - z); % 实际控制 标称控制 误差反馈 x A*x B*u w; % 施加到真实系统 z z_pred(2); % 下一拍的管中心 end end注意这里有三套状态在交互真实状态x、管中心z、以及MPC预测的z_pred。最容易出现的理解偏差是拿真实状态x去滚动MPC。实际上标称MPC内部只认识z真实状态只通过误差反馈进入控制量。这是Tube-MPC与普通MPC在状态反馈路径上的本质差别。输入约束U ⊖ KZ的含义也需要展开说。由于实际控制量等于v加上反馈修正输入约束必须写成不等式组对每个预测步既要管住v又要给K(x-z)留出余量。收缩后的输入约束经常让初学者误以为“浪费了输入能力”但正因为每次v都留有余地实际输入才有能力抵抗扰动。3.4 Graphics.m 在复现与排错中的作用这个包的Graphics.m承担的是调试放大器不是摆设。sample1.jpg显示的是闭环状态轨迹与管截面的关系灰蓝色区域是Z深色细线是不同扰动序列下的实际运行轨迹红色虚线是名义轨迹。判断鲁棒化是否生效第一眼就看实际轨迹有没有跑出管边界。sample2.jpg对应输入序列。最典型的特征是输入序列会贴着收紧后的输入边界而不是原始边界。如果看到输入频繁碰到原始约束边界说明管没有真正收紧。4. 实操复现跑通example_tubeMPC.m并做参数边界测试4.1 先跑example_dist_inv_set.m把不变集看清楚拿到源码包后第一个步骤是计算扰动不变集。cd robust-tube-mpc-master matlab -nodesktop -r example_dist_inv_set; quit这个脚本只做离线计算输出一个多面体或者区间包络图。它代表的是一个误差轨迹的在最大边界。如果图形显示两个方向宽度悬殊对应的是系统在该方向开环增益偏大或者扰动偏强这是正常的耦合现象。我在实际操作中还会把脚本里的迭代次数临时改大对比50次和200次的集合差异。如果200次迭代后集合仍然明显变化说明ABK的收敛速度偏慢此时先不要继续调MPC参数回去重设计K更高效。4.2 闭环复现在扰动下观察状态管接着运行主示例example_tubeMPC;代码包内部会随机生成多组扰动序列并驱动闭环系统。观察重点是实际状态轨迹是否始终包裹在管截面内以及管中心z的轨迹是否平滑真实状态是否在围绕z小范围波动。这种“预测轨迹光滑、真实轨迹抖动”的双层结构是Tube-MPC肉眼上区别于普通MPC的特征。如果关闭Tube功能只跑example_MPC.m在相同扰动下状态轨迹会偏离标称预测越来越远而Tube版本会持续把状态拉回管中心附近代价是标称轨迹更保守。4.3 调参三件套预测时域、终端代价、管收缩系数参数影响方向风险经验调整方式预测时域NN越大标称轨迹越平滑求解变慢约束提前生效从10起步性能无改善就不用再加Q、R权重Q决定误差衰减速度R决定输入代价Q过大会让K谱半径接近1管变宽Q、R都从单位阵出发逐步尝试W扩张系数δ补偿有限步截断误差过大会让收紧后约束变空从1.05试起不超过1.2真正的调参顺序是先固定K再算Z最后微调N。如果Z太胖先改Q、R让谱半径降下来而不是增加W的扩张系数。4.4 约束收紧有效性的直接检查脚本复现过程中最需要防范的坑是二次规划求解成功但实际约束仍然违反。原因多半是约束容差和集合运算浮点误差叠加。Xtight Xset - Z; if isempty(Xtight) || min(volume(Xtight)) 1e-6 warning(收紧后约束接近空集请减小W或调K); end加上这条检查后跑通example_tubeMPC.m基本不会遇到莫名的无解问题。5. 鲁棒性验证与三个易踩的坑5.1 用蒙特卡洛验证管约束的兑现程度鲁棒性不是一个抽象概念它可以用统计方式验证。取一千组独立同分布的w_k序列对每组执行一次完整闭环仿真统计整个过程中状态落在原始约束X之外的次数。如果违反率为零说明管构造和约束收紧是匹配的。单次仿真看到轨迹在管内并不证明任何结论因为扰动序列只是随机生成的一撮样本。只有遍历W的边界才能检验约束满足的边界。5.2 把名义MPC权重调大不等于鲁棒MPC这是最容易被误解的地方。在普通MPC里把Q调大状态确实收敛得更快但收敛速度不改变扰动不变集W本身的边界也不容忍管的存在约束违反仍然是概率性事件。真正决定鲁棒性的是ABK的谱半径和Z的结构不是反馈增益的大小在名义预测里被夸大的程度。判断一个控制器是不是Tube-MPC看它的在线优化器约束里是否出现了X⊖Z和U⊖KZ而不是看它宣称的鲁棒名词。5.3 对不确定性边界W做诚实估计如果W取的是实测扰动残差的凸包我一般会在结果上外扩5%来留余量w_min min(W_data, [], 1); w_max max(W_data, [], 1); W_bound [w_min; w_max] * 1.05;用这个外扩后的W_bound重新计算Z并完成蒙特卡洛验证。若违反率仍然为零说明Tube-MPC的鲁棒承诺在工程意义上是可兑现的若W取小了管偏窄表面上性能漂亮但扰动超界的瞬间约束保证就会失效这是鲁棒控制里最危险的隐性失败。本文还有配套的精品资源点击获取