3、SOC估算进阶:卡尔曼滤波在SOC估算中的应用,状态方程与观测方程

好,咱们进入正题。

前面聊了安时积分和开路电压法,说白了,它们各有各的短板。安时积分怕电流不准,开路电压法又得让电池歇着才能用。那有没有一种方法,能把这两者的优点结合起来,还能自动修正误差?

有,就是卡尔曼滤波。

我个人习惯把卡尔曼滤波比作一个「聪明的裁缝」。它手里有两把尺子:一把是模型预测的尺子(状态方程),另一把是实际测量的尺子(观测方程)。它不偏信任何一把,而是根据当前情况,动态地给两把尺子分配权重,最后缝出一件最合身的「SOC估算结果」。

3.1 卡尔曼滤波的核心思想:预测+校正

你想想看,我们估算SOC,本质上是在做一个「猜谜游戏」。

第一步,我们根据上一时刻的SOC和电流,猜一下当前时刻的SOC大概是多少。这就是预测

第二步,我们测量一下电池的端电压,看看这个电压值跟模型算出来的电压值差多少。如果差得大,说明我们猜得不准,得赶紧修正。这就是校正

卡尔曼滤波干的事,就是把这个「猜」和「改」的过程,用一套严谨的数学公式给固定下来。

核心逻辑:

卡尔曼滤波不是一次性算准SOC,而是通过「预测-测量-校正」的循环,让估算值一步步逼近真实值。它不害怕初始值不准,因为它有自我修正的能力。

我记得刚入行时,总觉得卡尔曼滤波很神秘。后来亲手在BMS上跑了一遍,才发现它其实就是一套「带权重的平均」算法。只不过这个权重(卡尔曼增益)是动态计算的,非常巧妙。

3.2 状态方程:描述系统如何演变

状态方程,说白了就是描述「电池这个系统,它的内部状态是怎么随时间变化的」。

在SOC估算里,我们关心的内部状态,通常就是SOC本身。当然,为了更精确,我们还会把极化电压也当作状态变量加进去。这里我们先从最简单的单状态模型讲起。

离散时间下的状态方程长这样:

x(k) = A * x(k-1) + B * u(k-1) + w(k-1)

别被符号吓到,我们拆开来看:

  • x(k):当前时刻的状态,也就是我们想知道的SOC。
  • x(k-1):上一时刻的状态,上一时刻的SOC。
  • u(k-1):系统的输入,这里就是电流(I)。
  • A:状态转移矩阵。在SOC估算里,如果只考虑SOC,A通常就是1。因为SOC本身不会自己变化,它只受电流影响。
  • B:输入矩阵。它描述了电流对SOC的影响程度。B = -η * Δt / Q_nom。η是库仑效率,Δt是采样时间,Q_nom是电池额定容量。
  • w(k-1):过程噪声。它代表模型的不确定性,比如电流测量误差、库仑效率不准等。

所以,把SOC代入,状态方程就变成了我们熟悉的安时积分公式:

SOC(k) = SOC(k-1) - (η * I(k-1) * Δt) / Q_nom + w(k-1)

你看,状态方程本质上就是安时积分。但卡尔曼滤波高明的地方在于,它不把这个结果当作最终答案,而是当作一个「初步猜测」。

避坑指南:

我曾经在一个项目中,直接把A设成1,B按公式算,结果发现SOC估算在低温下发散得厉害。后来排查发现,是过程噪声w的协方差矩阵Q设得太小了。低温下电池特性变化大,模型不确定性增加,Q值必须相应调大。记住,Q值不是一成不变的,它反映了你对模型的信任程度。

3.3 观测方程:描述如何测量系统

状态方程是「猜」,观测方程就是「看」。

我们虽然猜出了SOC,但没法直接测量SOC来验证。我们能直接测量的,是电池的端电压。观测方程就是建立「内部状态(SOC)」与「外部测量(电压)」之间的桥梁。

观测方程长这样:

z(k) = H * x(k) + v(k)

同样,拆开来看:

  • z(k):当前时刻的观测值,也就是我们实际测到的端电压。
  • x(k):当前时刻的状态,SOC。
  • H:观测矩阵。它描述了SOC与开路电压(OCV)之间的关系。说白了,就是OCV-SOC曲线。H = d(OCV)/d(SOC),也就是曲线在某一点的斜率。
  • v(k):观测噪声。它代表电压测量误差、以及OCV-SOC模型本身的误差。

这里有个关键点:我们实际测到的是端电压,不是开路电压。所以观测方程里,z(k) 应该是端电压的预测值。它等于开路电压减去欧姆内阻压降,再减去极化电压。为了简化,很多入门教程会直接用OCV-SOC曲线来近似,但实际工程中必须考虑内阻和极化的影响。

注意:

观测方程的非线性是卡尔曼滤波在SOC估算中最大的挑战。OCV-SOC曲线不是一条直线,尤其在磷酸铁锂电池中,中间有一段非常平坦的区域。这意味着H值(斜率)在某些SOC区间几乎为0。当H=0时,观测方程就失效了,卡尔曼滤波会退化成纯安时积分。这就是为什么磷酸铁锂电池的SOC估算比三元锂电池难做的根本原因。

3.4 状态方程与观测方程的协同工作

现在,我们把这两个方程放在一起看。

状态方程负责「向前看」,它根据历史信息预测未来的SOC。观测方程负责「回头看」,它用实际测量值来检验预测的准确性。

卡尔曼滤波的整个流程,就是在这两个方程之间来回切换:

  1. 时间更新(预测):用状态方程,根据上一时刻的最优估计,预测当前时刻的状态和误差协方差。
  2. 测量更新(校正):用观测方程,计算卡尔曼增益,然后用实际测量值来修正预测值,得到当前时刻的最优估计。

这个循环每来一个新数据就执行一次。所以卡尔曼滤波是递归的,它不需要存储所有历史数据,计算量小,非常适合在BMS的MCU上实时运行。

我个人习惯把卡尔曼增益K看作一个「信任调节旋钮」。当测量值很可靠(观测噪声小)时,K会变大,我更相信测量值。当模型预测很可靠(过程噪声小)时,K会变小,我更相信预测值。这个旋钮是自动调节的,非常智能。

3.5 核心逻辑框架图

下面这张图,是我自己总结的卡尔曼滤波在SOC估算中的核心逻辑。你可以把它当作一个「思维导图」来理解。

卡尔曼滤波SOC估算核心逻辑 初始SOC估计 时间更新(预测) 状态方程:SOC(k|k-1) = SOC(k-1) + B*I 误差协方差预测:P(k|k-1) = A*P(k-1)*A' + Q 计算卡尔曼增益 K(k) = P(k|k-1)*H' / (H*P(k|k-1)*H' + R) 测量更新(校正) 观测方程:z(k) = H * SOC(k|k-1) + v SOC(k) = SOC(k|k-1) + K(k)*(V_meas - z(k)) 输出最优SOC估计 递归循环(下一时刻) 状态方程 基于模型预测 观测方程 基于测量校正

嗯,这张图把整个流程串起来了。你从「初始SOC估计」开始,先走预测路径,再走校正路径,最后输出最优估计。然后这个最优估计又作为下一时刻的初始值,继续循环。这就是卡尔曼滤波的递归本质。

3.6 实际应用中的几点提醒

理论讲完了,说点实际的。

  • 矩阵维度要匹配:如果你把极化电压也作为状态变量,那A、B、H矩阵的维度都会变化。写代码时一定要检查矩阵乘法维度是否匹配,这是最常见的bug来源。
  • Q和R的调参:过程噪声协方差Q和观测噪声协方差R,是卡尔曼滤波里最需要「手感」的参数。Q越大,滤波越相信测量值,响应快但噪声大。R越大,滤波越相信模型,响应慢但平滑。我一般先让电池静置,调R使电压噪声匹配,再让电池大电流充放,调Q使SOC跟踪误差最小。
  • 初始化P矩阵:初始误差协方差P(0)如果设得太大,滤波初期会剧烈震荡。如果设得太小,收敛会很慢。我习惯设一个中等值,比如1,让滤波自己快速收敛。

一个小技巧:

在实际BMS代码中,我通常不会直接用浮点数矩阵运算,而是把卡尔曼滤波的公式展开成标量形式。这样既减少了计算量,也避免了矩阵库的依赖。对于单状态SOC估算,展开后的代码其实只有十几行。

好了,关于状态方程和观测方程,就聊到这里。记住,它们是卡尔曼滤波的两条腿,缺一不可。理解了它们,你就掌握了卡尔曼滤波在SOC估算中的精髓。


专注资料整理