在电动汽车和储能系统中,电池管理系统(BMS)的核心任务之一就是准确估算电池的荷电状态(State of Charge, SOC)。SOC可以理解为电池的"剩余电量百分比",就像我们手机上的电量显示一样。但工业级的SOC估算远比手机复杂得多,其精度直接影响着电池的使用安全、寿命和性能发挥。
传统SOC估算方法如安时积分法存在累积误差问题,开路电压法又需要电池长时间静置。而基于模型的方法,特别是结合卡尔曼滤波的算法,能够在电池工作时实时估算SOC,成为当前研究的热点。其中,无迹卡尔曼滤波(UKF)及其改进算法因其在处理非线性系统方面的优势,在BMS领域获得了广泛应用。
实际工程中,SOC估算误差要求通常在3%以内。这意味着对于100kWh的电池包,3kWh的误差就可能触发系统告警。
UKF通过无迹变换(Unscented Transform, UT)来解决非线性系统的状态估计问题。与EKF(扩展卡尔曼滤波)不同,UKF不需要对非线性函数进行线性化近似,而是采用一种"确定性采样"的方法:
这种方法的精度可以达到泰勒展开的二阶项,而计算量仅与EKF相当。
电池的等效电路模型通常表示为:
code复制U_t = U_ocv(SOC) - I·R_0 - U_p
其中U_p是极化电压,可以用RC网络描述其动态特性。
对应的状态空间模型为:
python复制def state_eq(x, I):
# x = [SOC, U_p1, U_p2,...]
SOC = x[0]
U_p = x[1:]
# SOC更新
SOC_new = SOC - (I * dt) / Q_max
# 极化电压更新
U_p_new = np.exp(-dt/(R_p*C_p)) * U_p + (1-np.exp(-dt/(R_p*C_p)))*R_p*I
return np.concatenate([[SOC_new], U_p_new])
def measurement_eq(x):
SOC = x[0]
U_p = x[1:]
return U_ocv(SOC) - np.sum(U_p) - I*R_0
实测中发现,在低温环境下需要适当增大过程噪声Q,因为电池模型在低温时准确性下降。
传统UKF在实际应用中可能遇到两个关键问题:
SRUKF通过直接维护协方差矩阵的平方根(S=chol(P))来解决这些问题。这种方法有三大优势:
预测步骤的平方根更新采用QR分解:
python复制# 预测协方差平方根更新
S_minus = qr_update(np.sqrt(Wc[1])*(Sigma_f[:,1:2*n+1]-x_hat_minus),
np.sqrt(Q))
其中qr_update函数实现了高效的QR分解更新。
更新步骤使用Joseph形式协方差更新:
python复制# Joseph形式更新
I_KC = np.eye(n) - np.dot(K, C)
S = np.linalg.cholesky(np.dot(np.dot(I_KC, P_minus), I_KC.T) + np.dot(np.dot(K, R), K.T))
实测数据表明,在持续运行10000次后,SRUKF的SOC估算误差仍能保持在1%以内,而传统UKF可能出现发散现象。
电池系统在实际运行中会面临:
ASRUKF通过新息序列(观测残差)在线调整Q和R:
code复制Q_k = (1-α)Q_{k-1} + α(K_k·y_k·y_k^T·K_k^T)
R_k = (1-β)R_{k-1} + β(y_k·y_k^T - S_zz·S_zz^T)
其中α和β是遗忘因子,通常取0.95-0.99。
python复制def adaptive_update(y, S_zz, K, Q, R):
# 计算自适应调整量
Q_adapt = np.dot(np.dot(K, np.outer(y,y)), K.T)
R_adapt = np.outer(y,y) - np.dot(S_zz, S_zz.T)
# 应用遗忘因子
Q_new = 0.98*Q + 0.02*Q_adapt
R_new = 0.95*R + 0.05*R_adapt
# 施加约束条件
Q_new = np.maximum(Q_new, Q_min)
R_new = np.maximum(R_new, R_min)
return Q_new, R_new
在某型动力电池上的测试数据显示:
| 指标 | UKF | SRUKF | ASRUKF |
|---|---|---|---|
| 计算复杂度 | 1× | 1.2× | 1.5× |
| 常温精度 | 1.5-2% | 1.3-1.8% | 1-1.5% |
| 恶劣条件精度 | 3-5% | 2.5-4% | 1.5-2.5% |
| 数值稳定性 | 一般 | 优秀 | 优秀 |
| 参数敏感性 | 高 | 中 | 低 |
在实际项目中,可以采用动态切换策略:
python复制if temperature_variation > 10 or soc_error > 0.03:
current_filter = asrukf
else:
current_filter = srukf
测试数据表明:
常见问题:
嵌入式实现技巧:
在TI C2000系列DSP上的实测数据:
我在实际项目中发现,将ASRUKF与模型参数在线估计结合,可以使SOC误差在电池全生命周期内稳定在2%以内。特别是在-30℃低温启动场景下,通过增加温度补偿项,仍能保持3%以内的估算精度。