4. 线性MPC(一):无约束线性MPC的推导与求解、代价函数设计、预测时域与控制时域的选择
各位工程师朋友,欢迎来到线性MPC的第一讲。
说实话,MPC这个领域内容很多。但咱们得从最基础的开始——无约束线性MPC。为什么先讲这个?因为它是理解所有复杂MPC的基石。我当年刚接触MPC时,就是先把这个啃透,后面学约束、非线性、鲁棒MPC才顺风顺水。
4.1 无约束线性MPC的核心思想
MPC说白了就是:看几步,走一步。
你想想看,开车的时候你会只看眼前一米吗?不会。你会看前方几十米甚至更远,然后决定当前方向盘怎么打。MPC也是这个道理——它基于当前状态,预测未来一段时间的系统行为,然后求解一个优化问题,得到当前时刻的最优控制量。
对于线性系统,如果没有任何约束,这个优化问题有解析解。这就是无约束线性MPC最迷人的地方——不需要迭代求解,直接算出来。
核心公式:无约束线性MPC = 线性模型 + 二次型代价函数 + 解析求解
4.2 系统模型与预测
我们先从离散时间线性系统开始:
x(k+1) = A·x(k) + B·u(k)
y(k) = C·x(k)
这里x是状态,u是控制输入,y是输出。A、B、C是系统矩阵。
嗯,这里要注意:模型精度直接影响MPC性能。我在项目中遇到过,有人直接用一阶近似模型做MPC,结果预测偏差太大,控制效果还不如PID。所以模型辨识这步别偷懒。
4.2.1 预测方程推导
假设当前时刻为k,我们已知状态x(k)。那么未来Np步的状态可以这样预测:
x(k+1|k) = A·x(k) + B·u(k)
x(k+2|k) = A·x(k+1|k) + B·u(k+1)
= A²·x(k) + A·B·u(k) + B·u(k+1)
...
x(k+Np|k) = A^Np·x(k) + Σ(A^(Np-i-1)·B·u(k+i))
写成矩阵形式会更清爽。我个人习惯用这种紧凑表示:
X = F·x(k) + G·U
其中:
- X = [x(k+1|k); x(k+2|k); ...; x(k+Np|k)] 是预测状态序列
- U = [u(k); u(k+1); ...; u(k+Nc-1)] 是控制序列(Nc为控制时域)
- F 和 G 是由A、B构成的矩阵
我的经验:推导F和G矩阵时,建议先手算小规模情况(比如Np=3, Nc=2),找到规律后再编程实现。我当年就是直接写通用代码,结果调试了整整两天才发现是索引错了。
4.3 代价函数设计
代价函数是MPC的「指挥棒」。它告诉优化器:什么才是好的控制。
标准形式是二次型:
J = Σ||x(k+i|k)||²_Q + Σ||u(k+i)||²_R
展开写:
J = Σ[x(k+i|k)^T·Q·x(k+i|k)] + Σ[u(k+i)^T·R·u(k+i)]
这里:
- Q矩阵:状态权重。Q越大,系统越「着急」让状态回到零
- R矩阵:控制权重。R越大,控制动作越「温柔」
4.3.1 Q和R怎么选?
这个问题我经常被问到。说实话,没有万能公式,但有经验法则:
| 场景 | Q/R比值 | 效果 |
|---|---|---|
| 快速跟踪 | Q >> R | 响应快,但控制动作大 |
| 节能控制 | Q << R | 动作平缓,但响应慢 |
| 平衡型 | Q ≈ R | 折中方案 |
避坑指南:我曾经在一个温控项目中,把Q设得特别大,结果控制器输出频繁饱和,执行器寿命大打折扣。后来把R适当调大,效果反而更好。记住:不是越快越好。
4.4 预测时域Np与控制时域Nc的选择
这两个参数是MPC设计的「灵魂参数」。选对了,事半功倍;选错了,事倍功半。
4.4.1 预测时域Np
Np决定了MPC「看多远」。选择原则:
- Np要覆盖系统的主要动态。一般取系统上升时间的1.5~3倍
- Np太小:只看眼前,失去MPC的预见性优势
- Np太大:计算量大,而且远期预测不准(模型误差累积)
我个人的经验是:先取系统时间常数的3~5倍对应的采样步数,然后根据仿真结果微调。
4.4.2 控制时域Nc
Nc决定了MPC「有多少自由度来调整」。选择原则:
- Nc ≤ Np(这是必须的)
- Nc太小:控制自由度不够,可能达不到理想效果
- Nc太大:计算量大,且容易导致控制动作过于激进
实用建议:对于大多数工业过程,Nc取3~10就足够了。我做过一个化工项目,Nc从5增加到20,控制效果几乎没有提升,但计算时间翻了三倍。
4.5 无约束MPC的解析解
好了,重头戏来了。无约束情况下,代价函数J是U的二次函数,最小值可以通过求导得到:
∂J/∂U = 0 → U* = -(G^T·Q·G + R)^(-1)·G^T·Q·F·x(k)
这就是传说中的MPC控制律。注意,我们只取U*的第一个元素u(k)作用于系统,这就是「滚动优化」的精髓。
写成更直观的形式:
u(k) = -K_mpc·x(k)
其中K_mpc是常数增益矩阵。你看,无约束线性MPC本质上就是一个线性状态反馈控制器!
有意思的地方:虽然MPC看起来很复杂,但在无约束线性情况下,它等价于一个精心设计的LQR控制器。区别在于:MPC的增益是通过预测优化得到的,而LQR是通过求解Riccati方程得到的。
4.6 完整求解流程
咱们把整个流程串起来:
- 初始化:设置Np、Nc、Q、R,计算F和G矩阵
- 在每个采样时刻k:
- 获取当前状态x(k)
- 计算增益矩阵K_mpc = (G^T·Q·G + R)^(-1)·G^T·Q·F
- 计算控制量u(k) = -K_mpc(1,:)·x(k)(取第一行)
- 将u(k)作用于系统
- 等待下一个采样时刻
你看,整个过程就是矩阵运算,没有任何迭代。这就是无约束MPC的魅力——简单、快速、可靠。
4.7 本章知识体系
下面这张图总结了本章的核心逻辑:
这张图展示了无约束线性MPC的完整流程:从系统模型出发,构建预测方程,设计代价函数,然后通过解析求解得到控制律,最后滚动优化执行。参数选择(Np、Nc、Q、R)贯穿整个过程,直接影响控制效果。
4.8 小结
这一章我们讲了无约束线性MPC的核心内容:
- 预测模型:用线性模型预测未来状态
- 代价函数:用Q和R权衡状态偏差与控制代价
- 解析解:无约束情况下可以直接算出最优控制
- 参数选择:Np看动态,Nc看自由度,Q和R看偏好
说实话,这些内容看起来简单,但真正用好需要大量实践。我建议你找个简单的例子(比如一阶系统),自己动手推导一遍,再写代码仿真一下。相信我,亲手做一遍比看十遍书都管用。
最后说一句:无约束线性MPC虽然简单,但它是理解更复杂MPC的必经之路。下一章我们会加入约束,那时候才能真正体现MPC的威力——但那是后话了。