
- SOC(State of Charge,荷电状态)是 BMS 一切功能的起点:续航里程、充放电控制、均衡策略、安全保护,全部建立在这个"估出来的数"之上。
- 它无法被任何传感器直接测量:这决定了 SOC 估算注定是一条"用数学逼近物理"的长路。
- 本文按方法演进脉络,拆解安时积分、卡尔曼滤波家族、深度学习三代方法的能力边界,重点解析 2026 年 Energies 上的串级 LSTM-UKF 融合架构(RMSE 0.0031),并给出可直接运行的 Python 实现。
1. 为什么 SOC 这么难估
先看定义:
SOC(t) = 剩余电量 / 当前实际容量 × 100%
三个致命难点让"直接算"变得不可能:
① 分母本身在漂移。 容量随温度、倍率、老化持续变化。一块标称 100 Ah 的电池,循环 800 次后实际容量可能只剩 80 Ah,-10℃ 低温下可用容量还会再打折扣。用错分母,SOC 从定义上就是错的。
② 分子无法直接测。 电量只能通过对电流积分间接获得,而电流传感器有噪声、有零点漂移。积分运算是误差的"复利放大器":1 A 的恒定测量偏差,1 小时就累积 1 Ah 的电量误差------对 100 Ah 电池就是 1% 的 SOC 漂移,而且单调增长、永不收敛。传感器故障场景下这一误差还会急剧恶化,这正是电压/电流传感器故障诊断成为 BMS 研究独立方向的原因 234。
③ OCV 平台区让电压反演失效。 磷酸铁锂电池的 OCV-SOC 曲线在 20%--80% SOC 区间几乎是一条平线:SOC 变化 60%,开路电压只变化约 20 mV。而车载电压采样精度通常为 ±2~10 mV,量测噪声与信号变化在同一量级------在平台区内,"用电压反推 SOC"在数学上近乎病态问题。
这三条约束共同决定了:SOC 估算必须依赖"模型 + 滤波"或"数据 + 学习"的组合,而不是任何单一手段。
2. 三代方法:每一代都在修上一代的坑
2.1 第一代:安时积分 + OCV 标定
SOC(t) = SOC(t₀) - (1/Cₙ)·∫η·I(τ)dτ
优点是原理简单、计算量极小,至今仍是所有量产 BMS 的基础底座。两个硬伤:初始值依赖 (SOC(t₀) 从哪来)和累积误差(积分不收敛)。行业实践是用 OCV 静置标定来"重置"初始值:长时间停车后电池达到平衡,用 OCV-SOC 查表反推 SOC(t₀)。
问题在于:静置条件苛刻(通常要求 > 30 min 的静息),且一旦进入 LFP 平台区,标定本身就不准。于是第二代方法登场。
2.2 第二代:等效电路模型 + 卡尔曼滤波家族
思路转变:把电池建成动态系统,SOC 是其中一个状态变量,用观测器在线"边滤波边估计"------误差不再单调累积,而是被观测信息持续校正。
二阶 RC 等效电路(2-RC ECM) 是工业界事实标准:
状态方程:
SOCₖ₊₁ = SOCₖ - (η·Δt/Cₙ)·Iₖ
U₁,ₖ₊₁ = exp(-Δt/(R₁C₁))·U₁,ₖ + R₁·(1-exp(-Δt/(R₁C₁)))·Iₖ
U₂,ₖ₊₁ = exp(-Δt/(R₂C₂))·U₂,ₖ + R₂·(1-exp(-Δt/(R₂C₂)))·Iₖ
观测方程:
Uₜ,ₖ = OCV(SOCₖ) - U₁,ₖ - U₂,ₖ - R₀·Iₖ
- R₀:欧姆内阻,表征毫秒级电压跳变
- R₁C₁:电化学极化,秒级
- R₂C₂:浓度差极化,分钟级
在此模型上运行 EKF(扩展卡尔曼滤波) :对非线性观测方程做一阶泰勒展开求雅可比,按"预测→更新"两步递推,用端电压残差不断校正 SOC。UKF(无迹卡尔曼滤波) 则用一组 sigma 点穿过非线性函数传播,避免雅可比推导,对强非线性的 OCV 曲线数值上更稳。DEKF(双 EKF) 进一步把模型参数(R₀、Cₙ)也作为状态在线联合估计,缓解老化漂移 5。
滤波族方法的本质优势:误差有界、有物理意义、可解释。代价是精度天花板被模型误差锁死------二阶 RC 只是电化学系统的粗糙降阶,模型失配(低温、老化工况)时估计偏差会系统性增大。
2.3 第三代:数据驱动(LSTM / GRU / CNN-LSTM)
深度学习绕开显式建模:把电压、电流、温度的时序窗口喂给 LSTM,直接回归 SOC。LSTM 的门控机制天然适合捕捉"电压弛豫、极化累积"这类长时依赖,在动态工况(DST、FUDS、US06)下的精度普遍优于纯滤波方法。
三个工程短板同样明显:
- 黑盒:网络输出没有物理约束,可能出现 SOC > 100% 或斜率与电流符号矛盾之类的"物理不可能解";
- 泛化弱:训练集没覆盖的工况(极端低温、新电芯批次)精度骤降;
- 不可认证:ISO 26262 功能安全体系要求行为可分析、可验证,黑盒网络上车面临 ASIL 定级困境。
3. 2026 年的答案:串级 LSTM-UKF 融合
最新趋势已经很清晰:顶刊不再比拼单一模型,而是比拼融合架构。2026 年 3 月 Energies 上的串级 LSTM-UKF 方案 1 是这一思路的典型样本,在恒流放电与 FUDS 工况下把 RMSE 压到 0.0031,显著优于单独的 LSTM 或 UKF。
3.1 架构:两级流水线
[U, I, T 历史窗口] ──► LSTM 初估 SOC* ──► 作为观测输入 ──► UKF(二阶 RC)最优校正 ──► SOC 输出
第一级(LSTM,学"经验"):从历史电压/电流序列学习电池动态特性,捕捉长程依赖,输出初始 SOC 预测。它干的是"数据驱动擅长的非线性行为学习"。
第二级(UKF,守"物理"):以二阶 RC 模型为状态空间,把 LSTM 的预测值作为观测量送入 UKF 做最优状态校正,抑制模型不确定性与量测噪声。它干的是"模型驱动擅长的约束兜底"。
3.2 为什么串级结构有效
三个机制决定了融合收益:
- 互补去偏:LSTM 的系统性偏差被 UKF 的模型约束拉回物理可行域;UKF 的模型失配误差被 LSTM 的数据驱动预测补偿。
- 误差不再单源累积:安时积分的误差单调发散、单 LSTM 误差无界,而串级结构中 UKF 的观测更新持续收敛误差。
- 鲁棒性提升:工况切换(恒流→FUDS 动态工况)时,单模型方法精度跳水,串级方法仍保持稳定估计 1。
同期的融合变体还有 DEKF-CNN-BiLSTM-AM(注意力加权特征)与 CNN-LSTM-AUKF(自适应 UKF 抑制波动)等,设计哲学一致:数据驱动出初值,物理模型做校正。另一条平行路线是面向 MCU 的轻量化 Transformer(如 BMSFormer 类工作,带状稀疏注意力 + INT8 量化),目标是把注意力机制塞进 KB 级 SRAM------这两条路线将在第 5 节的工程约束下再次交汇。
4. Python 实现
4.1 二阶 RC + EKF 最小可运行实现(NumPy)
import numpy as np
class DualRCEKF:
"""二阶RC等效电路 + EKF 估算SOC(演示级实现,参数需实测标定)"""
def __init__(self, capacity_ah=100.0, dt=1.0,
R0=0.0025, R1=0.0015, C1=2000.0, R2=0.003, C2=10000.0,
Q_init=None):
self.Cn = capacity_ah * 3600.0 # 容量 -> As
self.dt, self.R0 = dt, R0
self.a1 = np.exp(-dt / (R1 * C1)); self.b1 = R1 * (1 - self.a1)
self.a2 = np.exp(-dt / (R2 * C2)); self.b2 = R2 * (1 - self.a2)
self.x = np.array([0.5, 0.0, 0.0]) # [SOC, U1, U2]
self.P = np.diag([1e-4, 1e-6, 1e-6]) # 状态协方差
self.Q = np.diag([1e-10, 1e-8, 1e-8]) # 过程噪声
self.R = 4e-6 # 电压量测噪声(2mV)^2
self.Qs = Q_init if Q_init is not None else self.P.copy()
def ocv(self, soc):
"""OCV-SOC曲线:以三段线性近似LFP平台区(生产环境用查表/多项式)"""
pts = [(0.0,2.50),(0.10,3.05),(0.20,3.20),(0.80,3.32),(0.90,3.42),(1.0,3.55)]
return np.interp(soc, [p[0] for p in pts], [p[1] for p in pts])
def step(self, i_a, v_meas):
"""i_a: 电流A(放电为正) v_meas: 端电压V"""
# ---- 预测 ----
SOC, U1, U2 = self.x
self.x = np.array([SOC - self.dt * i_a / self.Cn,
self.a1 * U1 + self.b1 * i_a,
self.a2 * U2 + self.b2 * i_a])
# 雅可比F: dSOC'/dSOC=1, dU1'/dU1=a1, dU2'/dU2=a2
F = np.diag([1.0, self.a1, self.a2])
self.P = F @ self.P @ F.T + self.Q
# ---- 更新 ----
H = np.array([self._docv(self.x[0]), -1.0, -1.0]) # dUt/dx
v_pred = self.ocv(self.x[0]) - self.x[1] - self.x[2] - self.R0 * i_a
r = v_meas - v_pred # 新息
S = H @ self.P @ H + self.R
K = self.P @ H / S
self.x = self.x + K * r
self.x[0] = min(max(self.x[0], 0.0), 1.0) # 物理约束
IKH = np.eye(3) - np.outer(K, H)
self.P = IKH @ self.P @ IKH.T + K * self.R * K
return self.x[0]
def _docv(self, soc):
h = 1e-4
return (self.ocv(soc + h) - self.ocv(soc - h)) / (2 * h)
# ---- 用恒流放电数据自检(演示收敛性)----
if __name__ == "__main__":
ekf = DualRCEKF(capacity_ah=100)
true_soc, i_load = 0.8, 50.0
rng = np.random.default_rng(0)
tu1 = tu2 = 0.0 # 独立的"真值"极化状态
for k in range(3600 * 2): # 2小时 50A 放电
true_soc -= 1 * i_load / ekf.Cn
tu1 = ekf.a1 * tu1 + ekf.b1 * i_load
tu2 = ekf.a2 * tu2 + ekf.b2 * i_load
vt = ekf.ocv(true_soc) - tu1 - tu2 - ekf.R0 * i_load
est = ekf.step(i_load, vt + rng.normal(0, 2e-3)) # 加2mV量测噪声
if k % 1800 == 0:
print(f"t={k}s true={true_soc:.4f} est={est:.4f} err={abs(est-true_soc)*100:.2f}%")
这份实现刻意保留了所有关键结构:状态方程离散化、雅可比推导、新息更新、物理约束截断。生产代码的差异主要在 OCV 曲线精度(实测高阶多项式/查表)、噪声协方差自适应(DEKF 思路)与数值稳定性处理。
4.2 串级 LSTM-UKF 骨架(PyTorch)
import torch, torch.nn as nn
class SOCLSTM(nn.Module):
"""第一级:LSTM初估(输入[U,I,T]滑窗,输出当前SOC)"""
def __init__(self, n_feat=3, hidden=64, layers=2):
super().__init__()
self.lstm = nn.LSTM(n_feat, hidden, layers, batch_first=True)
self.head = nn.Sequential(nn.Linear(hidden, 32), nn.ReLU(),
nn.Linear(32, 1), nn.Sigmoid()) # 输出约束在[0,1]
def forward(self, x): # x: (B, T, 3)
out, _ = self.lstm(x)
return self.head(out[:, -1, :]) # (B, 1)
def serial_lstm_ukf(lstm, ukf, win, u, i, t):
"""第二级:LSTM输出作为观测量,送入二阶RC-UKF校正"""
with torch.no_grad():
soc_init = lstm(torch.tensor(win)[None]).item()
return ukf.step_as_observation(soc_init, i, u)
# ukf.step_as_observation: 将观测向量中的SOC观测项替换为LSTM输出,
# R 取 LSTM 验证集误差方差 ------ 论文[1]的关键设计
串级的工程要害在两处:观测噪声 R 的设定 (用 LSTM 验证集误差方差,而不是拍脑袋常数)和两级信息流时延对齐(LSTM 窗口长度与 UKF 更新周期匹配)。这两个参数处理不好,融合收益会归零。
5. 工程落地:为什么量产车还没用上 Transformer
算法指标好 ≠ 能上车。三个硬约束划定了落地边界:
① 算力与内存。 车规 BMS 主控(如 ARM Cortex-M7 级 MCU)的典型预算是几百 KB Flash、192 KB SRAM、毫秒级实时约束 6。标准 Transformer 的 O(N²) 注意力矩阵在这个预算下不可行,这正是轻量化路线(带状稀疏注意力、INT8 量化、干掉浮点位置编码)存在的原因。EKF 的计算量是常数级的,永远够用。
② 功能安全。 ISO 26262 体系要求行为可追溯、可验证。EKF 每一步的数学行为可分析,可做 ASIL 分解;黑盒网络目前缺乏成熟的认证路径,只能放在 QM 等级或做冗余监督架构------这也是为什么传感器故障诊断(残差分析、混合建模)至今仍是上车率最高的"AI 相关"技术 234。
③ 标定与维护成本。 EKF 的参数(R₀、R₁C₁、OCV 曲线)有清晰的物理含义,产线可以标定;神经网络的再训练意味着数据回流、版本管理、产线验证的完整闭环,成本结构完全不同。
所以当前最现实的图景是:滤波家族继续守在线估算的"安全底线",深度学习从云端和准在线环节(SOH 估算、老化模型更新、标定辅助)向车内渗透,串级融合架构成为两者的桥。这个格局未来 3--5 年大概率不变------变的只是 DL 那一级从 LSTM 换成更轻的注意力结构。
6. 结论
- SOC 估算三代方法的能力边界:安时积分赢在简单、输在累积误差;KF 家族赢在物理约束、输在模型失配;深度学习赢在拟合、输在泛化与可认证性。
- 2026 年的方法论共识是串级融合:数据驱动出初值,物理模型做校正,RMSE 进入 0.003 量级 1。
- 量产落地的三道墙:MCU 算力、ISO 26262 认证、标定成本------决定了滤波家族短期地位不可替代,DL 从云端向车内渐进渗透。
代码与延伸:第 4 节 EKF 实现可直接运行自检收敛性;建议在 NASA / CALCE 公开数据集上复现 LSTM 初估级,再接入 UKF 完成完整串级闭环。
参考文献
1 Li, Y., Wang, R., Jin, Y., Sun, Z., Liu, H., Liu, Y., Liu, Y., Xu, J., Tao, Y., Jiang, Z., Ma, Y., & Jiang, J. (2026). A Novel SOC Estimation Method for Lithium-Ion Batteries Based on Serial LSTM-UKF Fusion. Energies , 19(6), 1467.
2 ZHENG C, CHEN Z, HUANG D. Fault diagnosis of voltage sensor and current sensor for lithium-ion battery packJ. Energy, 2020, 191: 116504.
3 LIU Z, WANG Y, DU J, et al. A Model-Based Diagnostic Method for State of Health of Lithium-Ion BatteriesC. Energies, 2015, 8(7): 7509-7524. DOI: 10.3390/en8076509.
4 Kosuru VSR, Kavasseri Venkitaraman A. A Smart Battery Management System for Electric Vehicles Using Deep Learning-Based Sensor Fault Detection. World Electric Vehicle Journal. 2023; 14(4):101.
5 Linjie Li, Zhaojun Li, Jingzhou Zhao, and Wei Guo. Lithium-Ion Battery Management System for Electric Vehicles J. Int J Performability Eng, 2018, 14(12): 3184-3194.
6 The Handbook of Lithium-Ion Battery Pack Design - Chapter 8 - Battery Management System Controls. The Handbook of Lithium-Ion Battery Pack Design - Chemistry, Components, Types and Terminology. 2015: 91-101
本文基于公开学术文献与作者工程经验整理,仅供技术学习与研究交流,不构成任何产品选型、工程实施或商业决策依据。文中性能数据均引自公开文献,具体参数以官方最新资料与实测为准。
文中代码为演示级实现,未经产线标定与安全验证,直接用于生产环境可能存在风险;使用者应自行完成充分的测试、验证与合规评估。因使用本文内容(含方法、代码、数据与观点)造成的任何直接或间接损失,作者不承担责任。
文中引用的论文、数据、商标及标准版权归原权利人所有,仅作合理学术引用;如有侵权,请联系作者删除。本文首发于 CSDN,转载请注明原文出处与作者信息。