在接触非线性控制的时候,我们通常会被迫做出选择:要么用线性化模型牺牲精度换取求解效率,要么用非线性MPC(NMPC)扛着巨大的计算负担在实时性边缘试探。Koopman算子理论提供了一个非常优雅的中间路线——通过把非线性系统“提升”到高维线性空间,将非线性动力学转化为一个高维但线性的预测模型,从而让常规的线性MPC直接落地。这篇文章我会从Koopman模型预测控制的核心原理、数据驱动建模流程,到Matlab完整实现和实测踩坑记录,把这条技术路线从头到尾拆开讲清楚。
很多做控制的人第一次接触Koopman时都会被它的数学形式劝退,但实际上,它的核心思想可以用一句话概括:既然非线性系统难以直接处理,那就把它“嵌入”到一个更高维的空间里,在这个空间里,原本非线性的演化变成了线性演化。这个想法的直接好处是,MPC的在线优化问题从非线性规划(NLP)退化成了二次规划(QP),求解速度和稳定性都有质的飞跃。
这篇文章适合正在做状态估计、轨迹跟踪、非线性MPC方向研究的同学,也想做工程落地的工程师朋友。文章会覆盖Koopman算子理论的最小必要知识、EDMD数据驱动建模的完整流程、基于Koopman模型的线性MPC设计与Matlab实现,以及我实际调试过程中总结的若干关键技巧和坑点。
1. 为什么要用Koopman把非线性系统“线性化”
1.1 直接线性化方案的局限
在传统的控制工程中,处理非线性系统最常用的手段是在工作点附近做泰勒展开,得到一个局部的线性模型,然后基于这个模型设计LQR或者MPC。这套方法在小范围内非常有效,但在系统状态偏离工作点较远时,模型失配会迅速恶化控制性能。比如一个倒立摆,在竖直位置附近线性化效果很好,但摆角超过一定范围后,线性模型的误差就完全不可接受了。
另一种思路是在线实时线性化,也就是在每个采样时刻重新计算Jacobian矩阵。这样做的代价是计算量大,而且在线性化过程中丢失了系统的全局非线性特征,MPC的预测时域只要稍微长一点,线性化误差就会随着预测步数累积,导致控制效果不可靠。
我以前做过一个气悬浮球实验,用局部线性化MPC在高一点的目标位置跟踪效果尚可,但一旦参考轨迹出现大幅跳变,系统就会因为模型失配产生明显的振荡。那个项目让我意识到,如果能在保持线性预测结构的同时捕捉全局非线性动态,会是一个非常理想的状态。
1.2 Koopman算子的核心思想:提升维度的代价换取线性
Koopman算子的出发点不是直接把状态变量当作线性系统来处理,而是寻找一组“观测函数”或者叫“提升函数”,使得系统在这些函数构成的新坐标系下呈现出线性演化行为。
举一个比较形象的类比:在三维空间里,一个螺线管上运动的质点轨迹是曲线,但如果我们把它映射到柱坐标系的某个特定坐标组合里,一个原本看起来复杂的螺旋运动可以被表示为匀速直线运动加上匀速旋转运动——关键是把状态进行了恰当的坐标变换,使得变换后的动态在形式上变得简单。
Koopman算子的核心定理告诉我们,对于任意非线性动力系统,存在一个无限维线性算子作用在观测函数空间上,这个算子完全描述了系统的演化规律。当然,无限维空间在实际计算中不可实现,所以需要用有限维近似——这就是Koopman模型的核心工程折中。
1.3 Koopman模型和传统神经网络的本质区别
很多人会把Koopman模型和深度学习模型混为一谈,因为它们都需要用数据来“训练”。但两者的本质逻辑完全不同。神经网络拟合的是一个输入到输出的映射关系,对于轨迹预测问题,它本质上是在拟合一个序列到序列的映射;而Koopman模型是在寻找一个状态提升映射和一个线性动力学矩阵,使得提升后的状态遵循线性演化。
这个区别带来的实际影响非常直接:Koopman模型天然具有线性系统的全部优秀性质——叠加原理、可控性可观性分析、线性MPC求解。这些性质是普通黑箱神经网络模型不具备的,也是Koopman在控制领域能够得到广泛应用的根本原因。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 如何用EDMD从数据中构建Koopman线性预测模型
2.1 系统描述与数据采集设计
考虑一个离散时间非线性受控系统:
[
x_{k+1} = F(x_k, u_k)
]
其中(x \in \mathbb{R}^n)是系统状态,(u \in \mathbb{R}^m)是控制输入。要构建Koopman模型,我们需要采集系统在不同状态和输入下的转移数据。这里关键点在于数据采集的质量直接决定了模型质量的边界——Koopman模型是一个数据驱动模型
