第4章:无迹卡尔曼滤波(UKF)——当非线性遇上确定性采样

各位同学,欢迎来到第4章。上一章我们聊了EKF,那个把非线性函数硬掰成线性的“近似派”。说实话,EKF在工程里用得很多,但每次做雅可比矩阵求导时,我心里总有点发虚——万一线性化误差太大怎么办?

今天要讲的UKF,就是来解决这个问题的。它不搞线性化那一套,而是用一种更聪明的方式:用一堆点去逼近概率分布。我个人觉得,这是卡尔曼滤波家族里最优雅的变种之一。

4.1 UT变换:无迹变换的核心思想

先问大家一个问题:一个高斯分布经过非线性变换后,还是高斯分布吗?

答案是否定的。但在工程中,我们往往还是用高斯分布去近似它。EKF的做法是:把非线性函数在均值点处泰勒展开,只保留一阶项。说白了,就是“用切线代替曲线”。

UT变换的思路完全不同。它说:我不去近似函数,我去近似分布

具体怎么做?

  1. 在原分布中选取一组确定的点(称为Sigma点)
  2. 把这些点通过非线性函数传递过去
  3. 用传递后的点重新计算均值和协方差

你想想看,这比EKF高明在哪?EKF只用一个点(均值点)去代表整个分布,而UT变换用了多个点。这些点携带了分布的均值和协方差信息,经过非线性变换后,能更准确地捕捉到分布的变化。

核心要点:UT变换是一种确定性采样方法,它用2n+1个Sigma点(n为状态维数)来近似一个高斯分布。这些点不是随机抽取的,而是按照特定规则计算出来的。

我在项目中遇到过这样一个案例:电池的OCV-SOC曲线在两端非常陡峭,用EKF做SOC估计时,线性化误差导致收敛速度很慢。换成UKF后,同样的工况,收敛时间缩短了40%。这就是UT变换的威力。

4.2 Sigma点选取策略

Sigma点怎么选?这里有个标准流程,我建议你记下来。

假设状态向量x的维度是n,均值为x̄,协方差为P。那么Sigma点是这样计算的:

// 第0个点:均值点本身
χ₀ = x̄

// 第1到n个点:沿主成分方向正向偏移
χᵢ = x̄ + (√((n+λ)P))ᵢ,  i = 1,...,n

// 第n+1到2n个点:沿主成分方向负向偏移
χᵢ = x̄ - (√((n+λ)P))ᵢ₋ₙ,  i = n+1,...,2n

这里λ是一个缩放参数,它控制了Sigma点的散布范围。λ = α²(n+κ) - n,其中:

  • α:控制点的散布程度,通常取0.001到1之间
  • κ:次级缩放参数,对于高斯分布,通常取0或3-n
  • β:用于合并先验分布的高阶信息,对高斯分布最优值为2

每个Sigma点还有对应的权重:

// 均值权重
W₀ᵐ = λ / (n + λ)
Wᵢᵐ = 1 / [2(n + λ)],  i = 1,...,2n

// 协方差权重
W₀ᶜ = λ / (n + λ) + (1 - α² + β)
Wᵢᶜ = 1 / [2(n + λ)],  i = 1,...,2n

经验之谈:我刚开始用UKF时,总纠结α取多少。后来发现,对于电池模型这种非线性程度适中的系统,α取0.5到1之间效果都不错。如果系统非线性很强,可以试试α=0.01,让Sigma点更靠近均值,减少采样误差。

嗯,这里要注意:Sigma点的数量是2n+1个。如果你的状态维数n很大(比如超过20),Sigma点数量会爆炸。这时候你可能需要考虑其他方法,比如容积卡尔曼滤波(CKF)。

4.3 UKF算法流程

有了Sigma点,UKF的流程就清晰了。我把它总结成5步:

  1. 生成Sigma点:根据当前状态估计值和协方差,生成2n+1个Sigma点
  2. 时间更新(预测):把每个Sigma点通过状态方程传递,得到预测的Sigma点,然后加权计算预测均值和协方差
  3. 生成新的Sigma点:根据预测均值和协方差,重新生成一组Sigma点(这一步可以省略,但做了能提高精度)
  4. 观测更新:把新的Sigma点通过观测方程传递,得到观测的Sigma点,计算观测均值和协方差
  5. 状态更新:计算卡尔曼增益,更新状态估计和协方差

你看,整个过程没有求导,没有雅可比矩阵,全是矩阵乘法和加权求和。这就是UKF最大的优势——实现简单,且对非线性系统有更好的近似精度

4.4 UKF与EKF对比分析

咱们来做个对比,看看UKF到底比EKF强在哪。

对比维度 EKF UKF
核心思想 线性化非线性函数 用Sigma点近似分布
实现难度 需要计算雅可比矩阵 无需求导,只需函数调用
计算复杂度 O(n³),n为状态维数 O(n³),但常数项更大
近似精度 一阶泰勒展开,弱非线性时可用 二阶以上精度(对高斯分布可达三阶)
适用场景 弱非线性系统 强非线性系统
数值稳定性 雅可比矩阵可能奇异 更稳定,无求导误差

从表格能看出来,UKF在精度和稳定性上全面占优。那为什么还有人用EKF?

原因很简单:计算量。虽然两者理论复杂度都是O(n³),但UKF需要调用2n+1次非线性函数,而EKF只需要1次。对于高维系统(比如n>10),这个差距就很明显了。

避坑指南:我曾经在一个项目中,把状态维数从6维扩展到12维,结果UKF的计算时间翻了4倍多。后来发现,对于某些弱非线性状态,可以用EKF处理,只有强非线性的部分才用UKF。这种混合策略在实际工程中很实用。

另外,还有一个容易被忽视的点:EKF的雅可比矩阵推导容易出错。我记得有一次调试代码,SOC估计结果总是发散,查了两天才发现是雅可比矩阵的一个符号写反了。换成UKF后,同样的模型,一次就跑通了。

4.5 实际应用中的选择建议

说了这么多,到底什么时候用UKF,什么时候用EKF?我个人的经验是这样的:

  • 状态维数≤5,非线性强:果断用UKF。比如电池SOC+内阻+容量联合估计,3-4个状态,UKF是首选。
  • 状态维数5-10,非线性适中:可以先用EKF试试,如果收敛效果不好再换UKF。
  • 状态维数>10:优先考虑EKF或CKF。UKF的Sigma点数量会变成2n+1,计算量增长很快。
  • 实时性要求极高:EKF更合适。比如在MCU上跑,计算资源有限,EKF的轻量级优势就体现出来了。

最后说一句:UKF不是万能的。它假设状态和噪声都是高斯分布,如果实际分布严重非高斯,UKF也会失效。这时候你可能需要粒子滤波(PF)了——那是另一个故事。

下一章,我们会深入UKF在电池SOC估计中的具体实现,包括如何设计状态方程、如何处理非线性观测模型。到时候我会分享一些实际代码,咱们一起手撸一个UKF-SOC估计器。