3、优化问题建模:MPC中的优化问题形式、目标函数设计(跟踪误差、控制增量惩罚)、约束条件(输入约束、输出约束、状态约束)

各位工程师朋友,咱们今天聊聊MPC里最核心的一环——优化问题建模。

说实话,很多初学者觉得MPC难,其实不是难在算法本身,而是难在怎么把实际工程问题翻译成一个“数学上可解、物理上合理”的优化问题。我见过太多人,明明控制器写好了,仿真跑得飞起,一上硬件就炸了。为什么?多半是模型建得不对,或者约束条件没设好。

今天我就把这块掰开揉碎了讲。咱们从三个维度入手:优化问题的标准形式、目标函数怎么设计、约束条件怎么加。嗯,内容有点干,但都是实战经验,你耐心看完,肯定有收获。

3.1 优化问题的标准形式

MPC本质上是在每个采样时刻,求解一个有限时域的开环优化问题。说白了,就是“我现在看到系统状态了,接下来N步我该怎么控制,才能让未来表现最好”。

标准形式长这样:

min  J(x(k), u(k))
s.t. x(k+1) = f(x(k), u(k))   % 系统模型
     x(k) ∈ X                 % 状态约束
     u(k) ∈ U                 % 输入约束
     y(k) ∈ Y                 % 输出约束

这里有几个关键点:

  • 预测时域N:你往前看多少步。我一般建议N取系统主导时间常数的3~5倍,太短了看不到趋势,太长了计算量爆炸。
  • 控制时域M:你打算改变多少次控制量。通常M ≤ N,M越小,计算越快,但控制自由度也越低。
  • 决策变量:就是未来M步的控制序列 u(k), u(k+1), ..., u(k+M-1)。

核心要点:MPC的优化问题是一个“滚动优化”——每步只执行第一个控制量,然后重新求解。所以实时性要求很高,求解器选型很关键。

我在项目中遇到过一种情况:有人把预测时域设得特别大,结果求解时间超过采样周期,控制器直接“掉线”了。嗯,这是个很常见的坑。

3.2 目标函数设计

目标函数就是你要“最小化”的那个东西。MPC里最常用的目标函数包含两部分:跟踪误差和控制增量惩罚。

3.2.1 跟踪误差项

说白了,就是让系统输出尽量接近参考值。数学上写成:

J1 = Σ (y(k+i) - r(k+i))^T Q (y(k+i) - r(k+i))

其中Q是权重矩阵。Q越大,系统对跟踪误差越“敏感”。我个人习惯把Q设成对角矩阵,这样每个输出通道可以独立调参。

举个例子:你控制一个温度系统,目标温度是100°C。如果Q=1,误差1°C带来的惩罚是1;如果Q=100,误差1°C的惩罚就是100。控制器会拼命把温度拉到100°C,哪怕牺牲控制能量。

实战技巧:Q矩阵的数值要和你的物理量纲匹配。比如温度是100量级,位置是0.01量级,那Q的数值就不能一样。我一般先把所有变量归一化到[0,1]区间,再调Q。

3.2.2 控制增量惩罚项

这一项是为了防止控制量“剧烈抖动”。你想想看,如果只惩罚跟踪误差,控制器可能会让执行器疯狂动作——今天开100%,明天关0%,后天又开100%。执行器受得了吗?

J2 = Σ Δu(k+i)^T R Δu(k+i)

Δu是控制增量,R是惩罚权重。R越大,控制动作越“平滑”。

我记得有一次做无人机姿态控制,一开始没加控制增量惩罚,结果电机转速在1ms内从1000rpm跳到8000rpm,电机直接烧了。从那以后,我每次都会检查R的取值。

3.2.3 完整目标函数

把两项加起来:

J = J1 + J2 = Σ (y - r)^T Q (y - r) + Σ Δu^T R Δu

有时候还会加一个终端惩罚项,用来保证稳定性。不过那是进阶内容了,咱们先打好基础。

3.3 约束条件

约束是MPC的“灵魂”。没有约束的MPC,跟LQR没什么区别。约束分三类:输入约束、输出约束、状态约束。

3.3.1 输入约束

这是最直接的约束。执行器有物理极限,比如阀门开度0~100%,电机转速0~6000rpm,电流不超过10A。

u_min ≤ u(k) ≤ u_max

还有控制增量约束:

Δu_min ≤ Δu(k) ≤ Δu_max

增量约束很重要。我见过有人只加幅值约束,结果控制量从0跳到100%只用了1步,执行器响应不过来,系统震荡。加上增量约束后,控制量变化就“温柔”多了。

注意:输入约束是“硬约束”,必须满足。如果求解器告诉你无解,那就要考虑放松约束,或者改成“软约束”(加惩罚项)。

3.3.2 输出约束

输出约束是对系统输出的限制。比如温度不能超过150°C,压力不能超过10MPa,位置不能超出安全范围。

y_min ≤ y(k) ≤ y_max

输出约束有个麻烦:它依赖于系统状态和输入,不是直接可控的。所以输出约束往往是“软约束”——允许轻微违反,但给予惩罚。

我做过一个化工项目,反应釜温度必须控制在200±5°C,否则产品报废。输出约束设得很紧,结果求解器经常报无解。后来我把约束放宽到±10°C,然后在目标函数里加了一个“靠近目标”的惩罚项,效果反而更好。

3.3.3 状态约束

状态约束是对系统内部状态的限制。比如电池的SOC不能超过95%,电容电压不能超过额定值。

x_min ≤ x(k) ≤ x_max

状态约束和输出约束类似,也建议用软约束。因为状态往往不可直接测量,是通过观测器估计的,本身就有误差。约束设得太死,反而容易出问题。

3.4 知识体系结构图

下面这张图总结了MPC优化问题建模的核心逻辑,你可以保存下来,以后做项目时对照着看。

MPC优化问题建模知识体系 MPC优化问题 优化问题形式 预测时域N 控制时域M 决策变量 目标函数设计 跟踪误差项 (Q权重) 控制增量惩罚 (R权重) 约束条件 输入约束 (幅值/增量) 输出约束 (软约束) 状态约束 (软约束) 注:约束条件建议优先使用软约束,避免求解器无解

3.5 实战中的常见问题

最后,我总结几个实战中容易踩的坑:

  1. 权重矩阵Q和R的数值不匹配:如果Q比R大几个数量级,控制器会忽略控制增量惩罚,导致执行器剧烈动作。我一般先设R=1,然后从Q=0.1开始试,逐步增大。
  2. 约束设得太紧:尤其是输出约束和状态约束,如果设得比物理极限还小,求解器很容易无解。建议先设一个宽松的约束,跑通后再收紧。
  3. 忘记归一化:不同物理量的量纲差异很大,比如温度是1000量级,位置是0.001量级。不归一化的话,权重矩阵很难调。
  4. 预测时域太短:如果N小于系统上升时间的一半,控制器看不到完整的动态过程,控制效果会很差。

我的建议:刚开始做MPC项目时,先从一个简单的线性模型入手,不加约束,调好Q和R。然后逐步加入约束,每次只加一个,观察求解器的表现。这样出了问题,你也能快速定位。

好了,关于优化问题建模,今天就聊到这里。记住一句话:模型是基础,目标函数是灵魂,约束是保障。三者缺一不可。


公众号:蓝海资料掘金营,微信deep3321