做控制方向的人,大多都有过同一个烦恼:非线性系统一旦强耦合、带约束,预测和控制两件事都会变得很难啃。传统做法要么上NMPC,在每个采样周期解非线性优化,计算量感人;要么在某个工作点做Taylor展开,用局部线性模型凑合,换一个初始条件可能就崩了。这个项目解决的是一个非常实用的折中问题——用Koopman算子把非线性受控系统在“升维空间”里近似成线性系统,然后在这个线性空间直接跑标准的模型预测控制(MPC)。换句话说,我们不硬解非线性优化,而是先把非线性“洗”成线性,再用成熟的线性MPC体系去控制,既保留了预测控制的约束处理能力,又避开了在线非线性的计算负担。
我最近完整实现并调试了这个方案的Matlab版本,核心流程包括:数据激励、字典函数(lifting functions)设计、用EDMD估计Koopman矩阵、然后用condensing方法构造QP并滚动求解。整个过程用了一个受控Duffing振荡器做测试对象,效果稳定到让人意外。这篇文章会从原理到代码再到避坑,把整个实操路径完整拆开,适合正在做Koopman相关课题、或者想给非线性系统换一个“线性预测器”来匹配MPC的工程师和研究生。你可以不看推导直接抄代码,但我建议至少把第2节和第4节的细节过一遍——那些参数设置和踩坑点,直接决定你复现时效果好坏。
1. Koopman线性预测器:为什么非线性系统要“换个坐标系”看
1.1 非线性预测和控制的老大难问题
模型预测控制的思路其实很朴素:在每个时刻,利用系统模型预测未来一段时域内状态的变化,求解一个有限时域最优控制问题,然后只施加第一段控制,等到下一时刻再用新测量值重新求解。难点在于,如果系统模型是非线性的,这个“有限时域最优控制问题”大概率也是一个非线性非凸优化问题,在线求解的耗时和稳定性都很难保证。
常见的工程妥协方案是在参考工作点附近做Jaccobian线性化,得到线性时变模型,再用线性MPC或者LQR的框架去做。这个方案在小范围波动内是有效的,但本质上是“局部近似”,一旦系统偏离工作点较远,模型失配加剧,预测就会失真,控制质量跟着下降。
另一种更激进的路径是直接上非线性MPC,比如用CasADi配合IPOPT在线求解非线性规划。这个方法精度高,但对实时性要求高的场景不友好,而且对初值和求解器参数非常敏感,一个不好的局部最优解就能
