第二章:MPC数学基础
说实话,很多工程师一听到「数学基础」四个字就想跳过。我当年也一样。但做了十几年MPC项目后,我不得不承认——这些数学工具,就是你手里的扳手和螺丝刀。没有它们,你连个像样的控制器都搭不出来。
这一章,咱们就聊聊MPC真正需要的数学底子。我不会跟你扯太深的理论,而是把重点放在「怎么用」上。
2.1 向量与矩阵:MPC的「语言」
MPC里所有的变量,本质上都是向量。控制输入是一个向量,系统状态是一个向量,预测的未来轨迹也是一个向量。你想想看,如果没有向量,你怎么描述一个多变量系统?
举个我实际遇到的例子。有一次做四轮独立驱动车辆的MPC,每个轮子有扭矩和转速两个控制量,一共8个变量。如果不用向量表示,光写公式就能写满一页纸。用向量呢?一行搞定:u = [T1, ω1, T2, ω2, ...]^T。
矩阵就更关键了。状态空间模型里的A、B、C、D矩阵,就是系统的「骨架」。我习惯把A矩阵叫做「系统自带的脾气」——它决定了系统在没有外力干预时怎么演化。
关于特征值,我只说一句:特征值的实部决定了系统的稳定性。如果A矩阵的所有特征值实部都小于0,系统就是稳定的。我在调试一个化工反应器MPC时,就遇到过特征值实部为正的情况——系统发散得飞快,要不是MPC及时拉回来,设备可能就废了。
2.2 优化理论基础:MPC的「大脑」
MPC的核心,说白了就是「每步都解一个优化问题」。你预测未来N步的系统行为,然后找一个最优的控制序列,让某个代价函数最小。
这里有个关键点:MPC用的优化问题,绝大多数是凸优化。为什么?因为凸优化有唯一的最优解,而且求解速度快。你想想看,如果每秒钟要解几十次优化问题,非凸优化根本来不及。
二次规划(QP)是MPC里最常见的优化形式。它的代价函数是二次型,约束是线性的。写成标准形式就是:
min (1/2) x^T H x + f^T x
s.t. A x ≤ b
A_eq x = b_eq
lb ≤ x ≤ ub
这里的H矩阵(Hessian矩阵)必须是对称正定的,否则问题就不是凸的。我曾经踩过这个坑——H矩阵写错了符号,结果求解器一直报错,折腾了两天才发现是正定性出了问题。
在实际工程中,我推荐用OSQP或者qpOASES这类轻量级求解器。它们专门为MPC场景优化过,求解速度很快。我记得有一次做无人机MPC,控制周期只有10毫秒,OSQP能在2-3毫秒内解完一个50维的QP问题。
2.3 状态空间模型:MPC的「对象」
状态空间模型是MPC的基础。它用一组一阶微分方程(或差分方程)来描述系统动态。连续时间形式是:
ẋ(t) = A x(t) + B u(t)
y(t) = C x(t) + D u(t)
离散时间形式(计算机里用的)是:
x(k+1) = A_d x(k) + B_d u(k)
y(k) = C_d x(k) + D_d u(k)
这里有个容易混淆的地方:连续系统的A矩阵和离散系统的A_d矩阵不一样。它们之间通过矩阵指数关联:A_d = e^(A·Ts),其中Ts是采样时间。
我建议你直接用MATLAB的c2d函数做转换,别自己手算。手算矩阵指数很容易出错,尤其是高阶系统。
关于建模方法,我常用的有三种:
- 机理建模:从物理定律出发推导。精度高,但费时费力。适合简单系统。
- 系统辨识:用输入输出数据拟合模型。省事,但需要好的激励信号。
- 混合方法:先机理建模,再用数据修正参数。我个人最推荐,兼顾精度和效率。
说到系统辨识,我踩过一个坑。有一次做温度控制MPC,我用阶跃响应数据辨识出来的模型,仿真时效果很好,但一上实际系统就震荡。后来发现是采样时间选得太小,导致离散模型数值不稳定。嗯,这里要注意:采样时间不能太小,也不能太大。太小了数值不稳定,太大了会丢失系统动态信息。
2.4 本章知识体系
下面这张图总结了本章的核心逻辑。你可以把它当作一个「地图」,以后遇到MPC相关问题时,先看看问题出在哪个环节。
从这张图可以看得很清楚:线性代数是「语言」,优化理论是「大脑」,系统动力学是「对象」。三者缺一不可。我见过不少工程师只盯着优化算法看,忽略了建模精度,结果MPC效果很差。反过来,模型建得再好,求解器不行也白搭。
好了,这一章的内容就到这里。数学基础这东西,光看是学不会的。我建议你找个实际系统,试着建个状态空间模型,再写个简单的QP求解器跑一跑。动手做一遍,比看十遍书都管用。