🔋 电池SOC估计实战:从EKF到UKF,手把手教你用卡尔曼滤波搞定锂电池电量估算
准确估计电池剩余电量,是电动车、储能系统的核心技术难题。本文带你深入理解扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)在锂电池SOC估算中的应用,附完整MATLAB代码实现。
一、为什么SOC估算这么难?
锂电池的荷电状态(State of Charge,SOC)无法直接测量,只能通过电流积分(安时积分法)或电压查表法间接推算。然而:
- 安时积分法受初始误差和累积误差困扰
- 开路电压法需要电池静置数小时,实时性差
- 电池内部复杂的电化学特性、温度、老化等因素使SOC估算成为一项“看不见、摸不着”的挑战
卡尔曼滤波家族正是解决这类动态系统状态估计问题的利器。本文将展示如何基于Thevenin等效电路模型,分别用扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)实现高精度SOC估计。
二、电池建模:一阶RC等效电路
我们采用最常见的一阶Thevenin模型,结构简单又能捕捉电池动态特性:
电路方程(电流放电方向为正):
UL(t) = UOC - Up(t) - Ro·I(t) I(t) = Up(t)/Rp + Cp·dUp(t)/dt其中:
UL– 负载端电压(可测量)UOC– 开路电压(与SOC是非线性函数)Up– 极化电容两端电压(状态量)Ro– 欧姆内阻Rp,Cp– 极化电阻和电容
离散化后的状态方程(采样间隔Δt):
SoC(k) = SoC(k-1) - η·Δt/Qn · I(k-1) Up(k) = exp(-Δt/τ)·Up(k-1) + Rp·(1-exp(-Δt/τ))·I(k-1)其中τ = Rp·Cp,η为库伦效率,Qn为额定容量。
写成矩阵形式:
X(k) = A·X(k-1) + B·I(k-1)状态向量X = [SoC; Up],矩阵A、B由模型参数构成。
三、扩展卡尔曼滤波(EKF)核心步骤
EKF的核心思想:对非线性函数做一阶泰勒展开,将其线性化。
3.1 预测阶段
根据上一时刻状态和当前电流,预测当前状态:
States_pre=A*States_upd(:,T-1)+B*I_ob;P_Cov=A*P_Cov*A'+[Qs0;0Qu];同时预测端电压:
UL_pre=UOC_pre-Up_pre-I_ob*Ro_pre;3.2 线性化
对观测方程UL = g(SoC, Up, I)求偏导:
C1=dUOC/dSoC;% 由UOC-SoC拟合多项式求导得到C=[C1-1];% 观测矩阵3.3 更新阶段
计算卡尔曼增益,融合实际测量电压UL_ob修正状态:
K=P_Cov*C'/(C*P_Cov*C'+R);States_upd=States_pre+K*(UL_ob-UL_pre);P_Cov=P_Cov-K*C*P_Cov;整个过程清晰明了,就像“预测→修正”的智慧闭环。
四、无迹卡尔曼滤波(UKF):更高阶的替代方案
EKF的线性化会引入截断误差,对于高度非线性的UOC-SoC关系,UKF通过Sigma点采样直接传递概率分布,精度更高。
UKF关键步骤:
- 构造Sigma点集:围绕当前状态均值,按一定规则生成2n+1个采样点
- 非线性传播:每个Sigma点通过状态方程和观测方程
- 计算预测均值和协方差
- 更新:类似卡尔曼滤波,但增益基于Sigma点统计量
核心代码片段:
% Sigma点采样sigma=[Xsigma,Xsigma+sqrt((n+lambda)*P),Xsigma-sqrt((n+lambda)*P)];% 预测状态forks=1:2*n+1sigma(ks)=sigma(ks)-I_ob*ts/(Capacity*3600);sxk=Wm(ks)*sigma(ks)+sxk;end% 计算卡尔曼增益并更新SoC_UKF(T)=sxk+kgs*(UL_ob_UKF-syk);UKF不需要显式计算雅可比矩阵,实现起来反而更简洁,且对强非线性系统更鲁棒。
五、参数辨识与工况验证
5.1 模型参数拟合
通过HPPC(混合脉冲功率特性)测试数据,将UOC,Ro,Rp,Cp拟合为SOC的多项式函数(6次多项式效果最佳)。例如UOC的拟合公式:
UOC=3.44003+1.71448*SoC-3.51247*SoC^2+5.70868*SoC^3-5.06869*SoC^4+1.86699*SoC^5;5.2 动态工况测试
采用BBDST作为输入电流,电流波形剧烈变化,接近真实行车场景。
5.3 仿真结果对比
在MATLAB中运行主函数main(1,1),得到以下结果:
- 蓝色实线:真实SOC
- 紫色点划线:安时积分法(误差随时间累积)
- 绿色点划线:EKF估计(迅速收敛)
- 橙色点划线:UKF估计(精度最高,抖动小)
误差统计(典型运行结果):
| 方法 | 平均误差 | 标准差 |
|---|---|---|
| 安时积分 | 0.0234 | 0.0312 |
| EKF | 0.0051 | 0.0076 |
| UKF | 0.0038 | 0.0053 |
UKF在SOC初始值错误(比如设为1而实际为0.8)的情况下,仍能快速收敛到真值,展现出强大的鲁棒性。
六、Simulink与脚本双实现
项目提供了两种实现方式:
Simulink模型(
Improved_EKFSim.slx):适合快速原型验证,模块化清晰MATLAB脚本(
EKF_UKF_Thev.m+main.m):便于参数调优和算法对比
运行方式:
>>main(1,1)% 工况1(BBDST),初始SOC=1>>main(2,0.8)% 工况2(恒流间歇),初始SOC=0.8脚本会输出估计误差的平均值和标准差,并自动绘制SOC曲线和误差曲线。
七、总结与工程建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 安时积分 | 简单,计算量极小 | 累积误差,需频繁校准 | 短时估算,低成本BMS |
| EKF | 成熟稳定,计算适中 | 线性化引入误差 | 大多数车载BMS |
| UKF | 精度高,无需雅可比矩阵 | 计算量稍大(Sigma点) | 高精度需求、强非线性系统 |
工程实践小贴士:
- 过程噪声协方差Q和观测噪声协方差R需要根据实际传感器特性调试,不是固定值
- 电池参数随温度、老化变化,建议加入在线辨识(如递推最小二乘)
- UKF的Sigma点参数(α, β, κ)可参考标准文献:α=0.01~1,β=2(高斯分布最优)
本项目完整代码可以直接下载运行,修改参数、对比算法,快速搭建自己的电池SOC估计器。
思考:当电池老化后,模型参数会偏移,卡尔曼滤波还能保持精度吗?
欢迎在评论区留言讨论!后续我们将带来自适应卡尔曼滤波和电池健康状态(SOH)联合估计的干货内容。