简介:《模型预测控制:理论、计算与设计》第二版是一部面向控制工程专业学生、研究人员与工程师的经典教材,系统解决MPC理论与实际计算间的衔接问题。内容涵盖动态模型构建、预测模型简化、优化问题设定、约束处理及稳定性分析,并特别新增第8章“数值最优控制”,介绍导数计算、Hessian近似及不等式处理等数值优化方法,同时提供基于CasADi与MPCTools的Octave/MATLAB软件支持,便于读者完成书中示例与练习。压缩包内为1个PDF文件,大小5.66MB,内容为英文原版经典著作,已有376人学习下载。书中深入讨论线性规划、二次规划与非线性规划等求解算法,以及参数整定、鲁棒性设计等实践方法,读者可据此构建从理论推导到仿真实现的全链路预测控制能力,适合入手MPC学习与进阶。
1. 模型预测控制理论学习与实战落地:为什么这本 MPC 教材值得当案头书反复翻
做先进过程控制或者运动控制的工程师,多半都经历过这样的阶段:PID 调得再好,一碰到输入约束、状态耦合、多变量交互就开始压不住,这时候自然会被引导到模型预测控制(MPC)上。而真正开始学 MPC 之后又会发现,理论书很多,但能把“为什么要这样设计”“算不出来怎么办”讲透的很少。这本英文原版 MPC 教材第二版,来自三位在化学工程与电气工程领域深耕多年的作者,恰好把理论与实践之间的空白补上了——它不仅讲清楚预测控制的核心思想,还专门在第二版里加了一整章数值最优控制和配套的软件工具链。对于想在 matlab 或 Octave 环境里把预测控制跑起来、又不想被公式困住的从业者和研究生来说,这本书属于那种可以逐章精读、顺着代码复现实验的经典。
如果你读 MPC 相关论文经常卡在稳定性引理和优化算法上,或者你在用 Simulink 搭好模型之后发现控制器根本解不出来,那你缺的很可能不是控制理论,而是数值优化这门课。这本书第二版用第 8 章补上了这个缺口,同时把软件工具一并交付,让学习和验证不再脱节。接下来我把全书的内容主线、新增重点、软件用法和实操中的坑依次拆开讲。
2. 全书理论主线:从线性调节器到约束非线性系统的层层递进
2.1 第一章的铺垫方式:只讲能推广到约束情形的 LQR 论证
很多读者翻开第一章时以为只是线性二次型调节器的快速回顾,实际上这一章选了非常巧妙的切入角度。它没有把 LQR 当作一个孤立的经典问题来讲,而是刻意只用那些能顺利推广到非线性、带约束场景的论证路径,把线性二次调节器和最优 Kalman 滤波重新推导了一遍。这样做的用意很直白:到了后面几章,你会发现所有非线性 MPC 的稳定性证明、终端代价函数设计、滚动时域估计的收敛性分析,用的论证骨架和第一章是同一套。第一次读的时候如果觉得第一章偏基础,可以快速过,但等到研读第二、三、四章再回头来看第一章,才会意识到那些“看似简单”的推导埋了多少伏笔。
对于没有系统学过现代控制理论的同学,第一章足够撑起后续阅读;对于已经上过研究生系统课的读者,它起到的是复习加预演的双重作用。教材里还有配套的附录放在资源网站上,涵盖数学基础、稳定性分析和优化理论三块内容,正文行文里不打断推导节奏,需要补背景时再去查附录,这种结构对自学非常友好。
2.2 第二章:非线性约束系统的调节与三大增量主题
第二章是全书最核心的部分,内容量也最大。它的主线是讨论非线性、带约束系统如何调节到原点,并把过去二十年 MPC 研究里关于稳定性的主要成果做了统一梳理。你会看到终端等式约束、终端代价函数、控制 Lyapunov 函数这些概念如何被组织进同一个框架。关键结论是:若想让闭环系统渐近稳定,优化问题里必须加入终端成分——要么用终端约束把状态压进一个不变集,要么用终端代价函数保证目标函数在末端仍然下降。工程上很多人第一次自己搭 MPC 只写了预测误差和输入惩罚项,结果仿真的闭环不收敛,往往就是漏了终端这一环。
这版新加的几节直接踩在工业需求上。经济 MPC 不再盯着设定值跟踪,而是直接优化经济指标,比如反应器产率或能耗,目标函数里不再有“参考轨迹”的概念,稳定性分析路径完全不同。离散执行器那一节面向的是只有开关量或有限档位的执行机构,这类问题不能用常规 QP 表述,需要引入混合整数或组合搜索的处理办法。书里还讨论了一种次优 MPC 的形式,它放弃了每步都精确求解原问题,但可以证明鲁棒稳定,而且计算上足够快,能支撑在线处理非凸 MPC 问题。这条思路在实际部署时非常实用,因为工业现场的非线性模型往往没法在采样周期内解出全局最优。
2.3 第三章:鲁棒 MPC 与管道控制的设计思想
第三章解决的是模型不确定性带来的问题。书里把重心放在管道 MPC(tube MPC)方向上,核心思想是不再维护单条标称轨迹,而是维护一束轨迹。控制器的任务分为两层:一层是设计一个基准控制器驱动标称轨迹,另一层是用一个反馈项把实际状态拉回到标称轨迹周围的鲁棒不变集内。这样做的好处很明显:约束满足和稳定性分析可以分别在两套系统上论证,误差集合只需要计算一次,在线求解时把实际状态与标称轨迹的偏差反馈进去。相比靠单一标称轨迹然后外加扰动抑制的传统思路,管道方法在理论上更干净,对非线性系统也更自然。
第三章还讨论了随机 MPC,这一节在第二版里做了更新。随机 MPC 面对的是概率意义上的扰动描述,目标函数里出现期望项,约束变成概率约束或者期望约束。对工程从业者来说,读这部分的关键不是背公式,而是建立直觉:当扰动有界且分布信息可靠时,随机 MPC 能用更小的保守性换到更好的经济性能;但如果对分布估计不可信,管道 MPC 那种硬约束的设定反而更安全。这种“什么时候该用哪种假设”的判断力,恰恰是工程上最值钱的积累。
3. 数值最优控制:CasADi 与求解器选型是第二版的最大增量
3.1 为什么必须把数值优化单独拿出来讲
模型预测控制本质上是“每个采样周期解一个优化问题”,所以 MPC 的理论再漂亮,如果数值求解这步跑不通,控制器就只是一个数学符号。过去的教材往往默认读者自己会去补数值优化的背景,但这本第二版改变了这个习惯:新增第 8 章专门讨论非线性最优控制的数值解法。这一章由在数值最优控制领域非常有经验的学者执笔,内容覆盖两条主线:一是微分方程的仿真,二是数值优化与导数计算。
许多读者第一次接触非线性 MPC 时最容易犯的错误,是用有限差分去算梯度或雅可比矩阵,然后发现仿真步长怎么调都别扭——步长大了导数不准,步长小了舍入误差又冒出来。第 8 章给出的解决路径是采用自动微分或基于符号工具的导数计算,配合合适的 NLP 求解器结构来利用最优控制问题的稀疏性。它还详细讲了不等式约束的处理、Hessian 近似方法、以及如何利用 MPC 问题的目标函数和约束在时间轴上的特殊块结构来加速求解。对只用过 MATLAB 里的 quadprog 来解决小规模 QP 的工程师而言,读完这一章才算真正理解为什么工业级 MPC 需要专门定制的非线性规划求解器和实时迭代策略。
3.2 配套软件:基于 CasADi 的 MPCTools 与 Octave/MATLAB 流程
第二版随书发布了一套开源软件,这是最有价值的变化之一。软件栈由两层组成:底层是 CasADi,一个广泛用于最优控制和优化问题的符号数值框架;上层是 MPCTools,一组面向 Octave/MATLAB 的高层接口,用来快速搭建 MPC 问题。书里所有需要数值计算的例子和习题都可以在这套工具链上跑通,而且作者在多年的短期课程里反复测试过这组工具,稳定性足够。
安装顺序我一般建议这样走:
# 1. 先装 Octave(如果已经有 MATLAB 就跳过这一步) sudo apt-get install octave # 2. 下载并安装 CasADi 的 Octave/MATLAB 接口包 # 解压后把 casadi 文件夹加到 Octave/MATLAB 的搜索路径 # 3. 下载 MPCTools 源码包,按 README 指引把路径配置好 # 通常在 startup.m 或 .octaverc 里加入: addpath('/your/path/mpctools'); addpath('/your/path/casadi'); savepath;这里的逻辑拆开说。CasADi 提供的是符号表达式和自动微分能力,它能把用户定义的系统动态函数转成求解器需要的一阶导数和二阶导数信息,省掉手写雅可比的巨大工作量;MPCTools 则是站在 CasADi 之上的一层封装,它让建模过程更接近 MPC 的原始数学表达:定义状态、输入、动力学方程、约束、代价函数,然后直接调用内置的求解入口。顺序上必须先装 CasADi,因为 MPCTools 的底层调用依赖它;启动文件中路径的先后顺序也有讲究,把 MPCTools 放在 CasADi 之后可以避免函数命名空间冲突。
装完之后建议先跑 book 源码包里的一个简单例子,确认 CasADi 的符号计算和 IPOPT 求解器能被正常调用。这一步会比想象中更容易出问题:很多人的 Octave 版本太旧、缺少动态库或者求解器二进制文件没给执行权限,症状都是“调用求解器时报错但是不知道错在哪”。这道坎跨过去,后面跑书里的仿真就是顺水推舟的事。
3.3 一个最小线性 MPC 示例:滚动时域控制的骨架代码
为了让你对这套流程有直觉,我在这里给一个不依赖 CasADi 的极简版本,用 MATLAB/Octave 自带的 quadprog 实现线性 MPC。这个例子虽然简单,滚动时域控制的基本骨架是完整的:预测、优化、施加第一步、状态更新、再预测。
% 线性离散系统: x(k+1) = A x(k) + B u(k) A = [1.1, 1.0; 0.0, 1.0]; B = [1.0; 0.5]; nx = 2; nu = 1; % 权重矩阵与预测时域 Q = eye(nx); R = 0.1; N = 10; % 约束: |u| <= 1, |x(1)| <= 2 u_min = -1; u_max = 1; x1_min = -2; x1_max = 2; % 构建稠密 QP 形式: min 0.5*U'*H*U + f'*U, 满足 G*U <= w % 预先分配矩阵 [H, f, G, w] = deal(zeros(...)); % 示意,实际需计算 % 利用递推公式展开 x(k+j|k) = A^j x(k) + sum_{i=0}^{j-1} A^{j-1-i} B u(k+i) % 将代价函数和约束全部转换为 U 的表达式 % 滚动时域主循环 x = [0; 0]; % 初始状态 sim_steps = 50; u_log = zeros(sim_steps, 1); for k = 1:sim_steps % 根据当前 x 更新 QP 的目标函数与约束矩阵 % 然后调用 quadprog 求解 options = optimoptions('quadprog', 'Display', 'off'); U_opt = quadprog(H, f_k, G, w_k, [], [], [], [], [], options); u_log(k) = U_opt(1); % 只取第一步 x = A * x + B * u_log(k); % 状态推进 end plot(u_log); title('MPC control input');逻辑说明:变量 U 是把未来 N 步控制输入摞成的列向量,代价函数里的状态序列通过递推公式展开成 U 的二次型,物理约束也逐段转换成关于 U 的线性不等式。quadprog 返回的 U_opt 包含完整的最优输入序列,但预测控制只取第一项输入实际作用到系统上,下一拍重新测状态、重新求解,这就是“滚动时域”的含义。参数上最关键的是 N 的选择:N 太小时预测视野不够,闭环性能明显变差;N 太大时稠密 QP 的决策变量和约束数量线性增长,实时性压力马上上来。这个极简版本虽然没用到 CasADi 和稀疏结构,但用来理解 MPC 的运作逻辑完全够用。真正做非线性 MPC 时,把 A、B 换成连续时间模型加数值积分器,再把 quadprog 换成 IPOPT 或 SQP 求解器,骨架还是一样的。
4. 状态估计与移动时域估计:第四章的工程化取舍
4.1 全信息估计与移动时域估计的边界条件
第四章是全书修订力度最大的部分之一,重点放在滤波与状态估计。MPC 要正常工作,前提是状态可测或可估计,而实际工程里很多状态变量根本装不了传感器,比如反应器内部浓度、电池的 SOC 内阻分布,只能靠模型和测量信号反推。这一章先把经典扩展 Kalman 滤波和无迹 Kalman 滤波交代清楚,然后把重心放在移动时域估计(MHE)和全信息估计(FIE)上。
全信息估计的思路是用所有历史测量数据去估计当前状态,理论上最优,但计算量和存储量随时间线性增长,实际不可能长期运行。移动时域估计退一步,只用一个固定长度的滑动窗口,把窗口之外的信息压缩成先验项(通常用 arrival cost 表示),从而把问题规模限制住。两者的关系很像无限时域最优控制与滚动时域控制的差异,理解了 MPC 的人可以很自然地把这套逻辑搬到估计问题上去。第二版在有界且持续的扰动模型下,对两种估计器的稳定性与收敛性做了更精细的分析,比第一版里依赖高斯噪声假设的论述适用范围更广、结论更贴近工程场景。
4.2 粒子滤波被移除:维度灾难带来的工程决策
一个值得单独说的变动是:这一版把粒子滤波从正文里移除了,只保留在网站补充材料中。官方给出的原因很直接——粒子滤波的采样策略在状态维数高于大约五维时,会因为维度灾难导致估计精度迅速崩坏,需要的粒子数量指数级上涨。这个决策对从业者其实是个非常重要的提醒:技术选型时“看起来高级”不等于“能落地”。粒子滤波适用于低维强非线性、非高斯问题,一旦状态维数抬高,粒子数需求暴涨,在线实时估计根本不现实。
对大多数化工过程、机电系统而言,扩展 Kalman 滤波或移动时域估计是更实用的起点。如果你遇到非线性强、扰动分布明显偏离高斯的过程,可以先把过程拆解成几个低维子问题分别估计,而不是一股脑上粒子滤波。这个工程判断比背会十个滤波算法更有价值。
4.3 状态估计如何与 MPC 构成完整闭环
状态估计不是独立环节,它与 MPC 的关系需要在闭环里看。第四章讲估计,第五章讲基于输出测量的 MPC 设计,第六章讲分布式 MPC,第七章讲显式 MPC(pre-computed control law),这几章是从不同维度回答同一个问题:MPC 从理论走向工程实现时,要绕过哪些障碍?
第五章基于输出测量而非状态测量来设计 MPC,这在现场尤其常见——你只能测温度、压力、流量,但 MPC 需要的是全部状态。第六章分布式 MPC 面向的是大系统分解成多个相互作用的小子系统的问题,比如化工装置中多个单元设备之间有物料和能量耦合,集中式求解不现实,分布式设计让每个单元用自己的控制器独立求解、邻居之间交换信息,书里给出了非线性系统分布式 MPC 的专门设计方法。第七章显式 MPC 则完全避开了在线优化:把约束线性系统的控制律预先解出来,存成一组分段线性函数,在线只需要查表。这个思路曾经很热门,但它的瓶颈是状态维数和约束数量增长时临界区域数量爆炸,书里这版还带了计算临界区域的配套代码,可以自己做实验感受这个爆炸增长的边界在哪。
读这三章时建议带着工程视角去选路线:如果系统规模中等、采样周期在秒级以上,集中式 MPC 加上一个扩展 Kalman 滤波通常是最稳的选择;如果采样周期要求毫秒级、且系统是线性约束系统,才有必要研究显式 MPC;如果真的面对分布在不同地理位置或不同执行单元系统,才需要动分布式 MPC。
5. MPC 学习与实现避坑:教材翻完到代码跑通的五个常见问题
MPC 的理论框架和配套软件都齐了,但真正动手从零写一个能稳定跑的控制器时,每个工程师都会踩进同一个类型的坑。我把实践中反复出现的五个问题按“现象—原因—解决”的结构写在这里,都是血泪换来的经验,建议保存下来对照排查。
现象一:按教材搭好了 MPC 仿真,闭环状态在时域末端振荡甚至发散,但单步优化明明是收敛的。原因通常是终端代价或终端约束缺失,导致优化问题在有限时域内只是“近视眼”,看不到时域外的发散趋势。解决方法是按第二章的分析,在目标函数里加入终端代价项,或对末端状态施加约束,把它限制在一个可证明稳定的终端集里。先加终端代价通常比加终端约束更容易调通,因为终端约束会让可行域明显变窄、有时甚至找不到初始可行解。
现象二:非线性 MPC 里手写雅可比矩阵和梯度,仿真一开始求解器就报“singular matrix”或“NaN in solution”。原因是手写导数时符号或索引出错,这在状态维数超过三维之后几乎无法避免。解决方法是立刻切换到 CasADi 或类似支持自动微分的工具,让符号引擎替你算导数。这正好是第三章里那个“数值最优控制”章节存在的理由——不要把宝贵的调试时间浪费在手工求导上。
现象三:同一个 MPC 代码在 matlab 上能跑,换到 Octave 环境突然报一堆函数找不到。原因是使用了 MATLAB 专有工具箱的函数,比如 Control System Toolbox 或 Optimization Toolbox 中的部分接口,在 Octave 里没有对应的实现。解决方法是把代码中依赖工具箱的部分隔离出来,用基础矩阵运算重写,或者直接改用 MPCTools 的接口,它的设计目标就是在两个平台上保持一致行为。顺手检查一下 Octave 版本,旧版本对 classdef 和某些矩阵函数的支持不够完整。
现象四:预测模型与实际被控对象偏差一大,MPC 的控制效果明显变差,甚至出现稳态偏差。原因是模型失配被反复累加到预测里,控制器对模型过度信任。解决方法是加入输出反馈校正:要么用状态估计器的残差在线修正预测模型的初始状态或模型参数,要么采用第四章里讲过的带有界扰动假设的鲁棒估计框架,把不确定项的包络信息包含进优化问题。另一个常被忽略的点是:模型失配的响应通常出现在低频段,可在被控对象前串联一个一阶惯性项来补偿稳态增益偏差。
现象五:增大预测时域 N 后控制效果反而下降,而且求解时间急剧上升。原因是对普通线性 MPC 而言,稠密 QP 的复杂度随 N 上升较快,更重要的是时域末端的终端代价如果没有按理论要求来取,过大的 N 会把不稳定的终端部分也纳入优化视野,导致控制律过于激进。解决方法是:在可接受采样时间内先从小到大调 N,观察闭环性能拐点,然后固定一个折中值;同时检查终端权重是否满足 Lyapunov 方程对应的稳定性条件。记住一个原则——N 不是越大越好,它必须和终端项配套使用才有理论保证。
6. 把理论变成可复现实验:三步从线性 MPC 迁移到非线性 MPC
最后分享一个我每次从零搭建 MPC 控制器都会走的验证路径。它不复杂,但能省掉大量试错时间,也能帮你确认书里的理论确实和代码行为对得上。整套思路分三步走。
第一步,先在线性系统上跑通滚动时域逻辑。不管目标系统多复杂,先找一个低阶线性近似模型,用第二节里那种 quadprog 极简实现把预测、求解、施加第一步、状态更新这条链路跑通。这步验证的是控制架构本身:采样周期是否合理、约束是否被正确编码、滚动时域实现有没有引入时间延迟。很多新手忽略了这个中间层,直接跳到非线性 MPC,结果一旦收敛失败,分不清是模型数值问题还是优化器设置问题,只能抓瞎。
第二步,切换到 CasADi 表示非线性模型并做开环验证。把原来的线性状态转移方程替换为非线性连续时间模型,用 CasADi 的符号接口表达微分方程,然后做一次开环仿真:固定初始状态和输入序列,验证积分结果和物理直觉是否一致。这一步专门排查模型方程本身的问题,比如单位不统一、反应速率常数数量级不对、积分器步长太大等。开环结果可信后再进闭环,否则闭环里的振荡和发散会让你误判控制器的问题。
第三步,用 KL 稳定性定义去检查闭环数据。这本教材贯穿全书的稳定性定义是 KL 类函数表述,比起经典定义它更适合描述约束系统的收敛行为。工程验证时不需要做严格的数学分析,但至少要确认两个指标:一是目标函数值随时间呈现下降趋势;二是状态范数被一个递减函数所上界约束,且上界本身在逐步收窄。这两点满足,基本可以判断控制器行为与理论预测一致。如果目标函数值偶尔上升但状态仍然收敛,先检查是不是热启动策略把上一次的解带偏了方向,再检查估计器的 arrival cost 是否在更新。
完成这三步后,再去读书里更深的内容,比如鲁棒管道设计和经济 MPC 的扩展,就有了一个能跑的基线和对照物。所有新加的理论改进都可以从这个基线出发做 A/B 对比。从那以后我每次拿到新对象的第一件事,都是强制自己先走一遍这套三步验证,而不是急着上复杂算法。希望帮到你。
本文还有配套的精品资源,点击获取