第四章:卡尔曼滤波数学基础
各位同学,欢迎来到第四章。这一章咱们不写代码,不调参数,就专心啃数学基础。
我知道,一提到数学,很多人就开始头疼。但请相信我,卡尔曼滤波的数学,其实没那么可怕。说白了,它就是一套用矩阵和概率论来“猜”系统状态的方法。
我当年刚入行时,也对着协方差矩阵发过呆。后来在项目里调了三个月电池SOC,才真正理解这些公式背后的物理意义。今天,我就把这些经验掰开揉碎了讲给你听。
4.1 高斯分布:一切不确定性的起点
卡尔曼滤波的核心假设是什么?是“噪声服从高斯分布”。
为什么偏偏是高斯分布?因为它在数学上太好处理了。你想想看,一个高斯分布只需要两个参数:均值μ和方差σ²。均值代表“最可能的值”,方差代表“不确定的程度”。
在电池建模中,我习惯用高斯分布来描述两个东西:
- 过程噪声:比如电流传感器的测量误差,或者模型本身的近似误差
- 观测噪声:比如电压传感器的读数波动
举个例子。假设我们测量一节电池的端电压,读数是3.7V,但传感器精度是±0.05V。那么我们可以说:
- μ = 3.7V(最可能的真实电压)
- σ = 0.05V(不确定性的标准差)
嗯,这里要注意:高斯分布假设误差是对称的、单峰的。如果你的传感器有系统性偏差(比如总是偏大0.1V),那就不能用高斯分布来建模了。我在项目中遇到过这种情况,后来发现是ADC的参考电压漂了。
核心要点:卡尔曼滤波假设所有噪声都是零均值的高斯白噪声。如果你的噪声不满足这个条件,滤波效果会大打折扣。
4.2 协方差:变量之间的“暧昧关系”
单个变量用方差描述不确定性。那多个变量呢?比如电池的SOC和端电压,它们之间是有关系的——SOC高时电压通常也高。这种关系,就用协方差来描述。
协方差矩阵长这样:
P = [σ₁² σ₁₂ ]
[σ₂₁ σ₂² ]
其中:
- 对角线元素:各变量自身的方差
- 非对角线元素:变量之间的协方差
如果σ₁₂是正数,说明两个变量同向变化;如果是负数,说明反向变化;如果是0,说明它们不相关。
在卡尔曼滤波中,协方差矩阵P是最重要的变量之一。它告诉我们:当前对系统状态的估计有多自信。P越大,说明越不确定;P越小,说明越有把握。
个人经验:我刚开始做电池SOC估计时,把P的初始值设得特别小,结果滤波器收敛极慢。后来才明白,初始时刻我们对状态一无所知,P应该设大一些。一般我会设成单位矩阵乘以一个较大的数,比如100。
4.3 矩阵运算回顾:卡尔曼滤波的“算术”
卡尔曼滤波的每一步,本质上都是矩阵运算。如果你对矩阵乘法、转置、求逆不熟,现在赶紧补一下。我列几个最常用的:
| 运算 | 符号 | 在卡尔曼滤波中的用途 |
|---|---|---|
| 矩阵乘法 | A·B | 状态预测、协方差更新 |
| 矩阵转置 | Aᵀ | 计算协方差传播 |
| 矩阵求逆 | A⁻¹ | 计算卡尔曼增益 |
| 单位矩阵 | I | 初始化、归一化 |
举个例子。状态预测公式是:
x̂ₖ⁻ = A·x̂ₖ₋₁ + B·uₖ
这里A是状态转移矩阵,B是控制输入矩阵。说白了,就是用上一时刻的状态和当前的控制输入,来预测当前时刻的状态。
协方差预测公式是:
Pₖ⁻ = A·Pₖ₋₁·Aᵀ + Q
这个公式我当年背了好久。后来才理解:A·Pₖ₋₁·Aᵀ 是把上一时刻的不确定性传播到当前时刻,Q是加上过程噪声带来的新不确定性。
避坑指南:我曾经在代码里把矩阵乘法的顺序搞反了,结果滤波器发散得一塌糊涂。记住:矩阵乘法不满足交换律,A·B ≠ B·A。写代码时一定要检查维度是否匹配。
4.4 贝叶斯估计思想:卡尔曼滤波的灵魂
卡尔曼滤波的本质是什么?是贝叶斯估计的一种特例。
贝叶斯思想的核心就一句话:用先验知识 + 观测数据 → 得到后验估计。
在卡尔曼滤波中:
- 先验:根据模型预测的状态(x̂ₖ⁻)
- 似然:观测数据与预测值之间的差异(残差)
- 后验:融合预测和观测后的最优估计(x̂ₖ)
卡尔曼增益K就是用来做这个融合的。它决定了:
- 如果K很大:更相信观测
- 如果K很小:更相信预测
为什么会这样?因为K的计算公式里包含了观测噪声协方差R和预测协方差Pₖ⁻。R越小(观测越准),K越大;Pₖ⁻越小(预测越准),K越小。
我习惯把这个过程想象成一个“信任博弈”:
- 模型说:SOC应该是60%
- 传感器说:电压是3.8V,对应SOC是65%
- 卡尔曼滤波说:我看看谁更靠谱……嗯,模型最近很准,我信模型多一点,最终SOC是61%
核心思想:卡尔曼滤波不是简单地取平均,而是根据不确定性的大小进行加权融合。这就是贝叶斯估计的精髓。
4.5 知识体系总览
下面这张图,是我自己总结的本章知识结构。建议你保存下来,学完后面章节后再回来看,会有更深的理解。
好了,数学基础就讲到这里。下一章我们会把这些公式变成真正的代码,跑一个完整的卡尔曼滤波流程。到时候你会发现,数学懂了,代码就是水到渠成的事。
课后建议:如果你对矩阵运算不熟,建议花半小时手算一个2×2矩阵的乘法、转置和求逆。我在项目里吃过亏,就是因为矩阵求逆算错了,导致滤波器发散。手算一遍,印象会深很多。
公众号:蓝海资料掘金营,微信deep3321