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优化问题建模的核心逻辑,你可以保存下来,以后做项目时对照着看。
3.5 实战中的常见问题
最后,我总结几个实战中容易踩的坑:
- 权重矩阵Q和R的数值不匹配:如果Q比R大几个数量级,控制器会忽略控制增量惩罚,导致执行器剧烈动作。我一般先设R=1,然后从Q=0.1开始试,逐步增大。
- 约束设得太紧:尤其是输出约束和状态约束,如果设得比物理极限还小,求解器很容易无解。建议先设一个宽松的约束,跑通后再收紧。
- 忘记归一化:不同物理量的量纲差异很大,比如温度是1000量级,位置是0.001量级。不归一化的话,权重矩阵很难调。
- 预测时域太短:如果N小于系统上升时间的一半,控制器看不到完整的动态过程,控制效果会很差。
我的建议:刚开始做MPC项目时,先从一个简单的线性模型入手,不加约束,调好Q和R。然后逐步加入约束,每次只加一个,观察求解器的表现。这样出了问题,你也能快速定位。
好了,关于优化问题建模,今天就聊到这里。记住一句话:模型是基础,目标函数是灵魂,约束是保障。三者缺一不可。
公众号:蓝海资料掘金营,微信deep3321