✨ 长期致力于锂电池、荷电状态、参数辨识、卡尔曼滤波、施密特正交变换研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)二阶RC等效电路建模与离线参数辨识:
采用二阶RC等效电路模型模拟锂离子电池的动态特性,该模型包含欧姆内阻R0以及两个RC并联环节(R1-C1表征电化学极化,R2-C2表征浓差极化)。开路电压与SOC的函数关系通过混合脉冲功率特性测试得到,在SOC从0至1每隔百分之十进行一次放电脉冲,静置两小时测量稳态电压,再采用指数拟合得到OCV-SOC曲线。模型参数辨识采用离线辨识方法:利用混合脉冲功率特性测试数据,对脉冲响应的电压曲线进行指数拟合,得到R1、C1、R2、C2随SOC的变化规律。在Matlab中搭建模型,加载动态工况电流(UDDS),仿真得到的端电压与实测值对比,平均误差为0.0142伏,最大误差0.7伏内。虽然离线辨识简单易行,但无法反映电池老化或温度变化引起的参数漂移。为了解决这个问题,后续需要在线参数辨识。","import numpy as np
from scipy.optimize import curve_fit
class SecondOrderRCBattery:
def __init__(self, capacity=2.0):
self.capacity = capacity # Ah
self.R0 = 0.05 # ohm
self.R1, self.C1 = 0.02, 1000 # time constant ~20s
self.R2, self.C2 = 0.01, 5000 # time constant ~50s
self.ocv_table = None # SOC vs OCV
self.soc = 0.8
self.v1, self.v2 = 0.0, 0.0
def load_ocv_table(self, soc_array, ocv_array):
self.ocv_table = (soc_array, ocv_array)
def ocv_from_soc(self, soc):
return np.interp(soc, self.ocv_table[0], self.ocv_table[1])
def update_parameters(self, soc, temperature=25):
# offline map: interpolate from precomputed tables
# for demo, fixed values
self.R0 = 0.05 * (1 + 0.003*(temperature-25))
self.R1 = 0.02 * (1 - 0.1*soc)
self.C1 = 1000 * (1 + 0.2*soc)
self.R2 = 0.01 * (1 - 0.05*soc)
self.C2 = 5000 * (1 + 0.1*soc)
def simulate(self, current, dt):
# current: positive discharge, negative charge
I = current
# update RC states
tau1 = self.R1 * self.C1
tau2 = self.R2 * self.C2
self.v1 = self.v1 * np.exp(-dt/tau1) + self.R1 * I * (1 - np.exp(-dt/tau1))
self.v2 = self.v2 * np.exp(-dt/tau2) + self.R2 * I * (1 - np.exp(-dt/tau2))
# update SOC
delta_soc = -I * dt / (self.capacity * 3600)
self.soc += delta_soc
# terminal voltage
V_oc = self.ocv_from_soc(self.soc)
V_t = V_oc - self.v1 - self.v2 - I * self.R0
return V_t
","
(2)递推最小二乘在线参数辨识与扩展卡尔曼滤波SOC估算:
为解决离线辨识无法跟踪参数变化的问题,引入带遗忘因子的递推最小二乘算法在线辨识模型参数。定义数据向量φ(k)=[V_t(k-1), V_t(k-2), I(k), I(k-1), I(k-2)],待估参数向量θ=[a1, a2, b0, b1, b2],通过递推最小二乘实时更新θ,再反解出R0、R1、C1、R2、C2。遗忘因子λ取0.98,保证对时变参数的快速跟踪。在UDDS工况下,在线辨识的端电压平均误差为0.0132伏,比离线方法降低0.001伏,最大误差0.31伏,降低0.39伏。基于辨识出的模型,采用扩展卡尔曼滤波进行SOC估算,状态量为[SOC, v1, v2],观测方程为端电压。扩展卡尔曼滤波的误差协方差初始P=eye(3)*0.1,过程噪声协方差Q=diag([0.001,0.001,0.001]),观测噪声R=0.01。在动态工况下,扩展卡尔曼滤波估算SOC的平均绝对误差为百分之一点四一,最大误差百分之三点一。实验表明,在线辨识与扩展卡尔曼滤波组合能有效跟踪SOC,且对初始SOC误差有较好的收敛性,在初始SOC设定为百分之八十而真实值为百分之五十时,五十秒内收敛。
import numpy as np from scipy.linalg import solve class RLS_OnlineBattery: def __init__(self, forgetting=0.98): self.lamb = forgetting self.P = np.eye(5) * 1000 self.theta = np.zeros(5) def update(self, phi, y): # phi: 5x1 vector, y: measurement (terminal voltage) K = self.P @ phi / (self.lamb + phi.T @ self.P @ phi) self.theta = self.theta + K * (y - phi.T @ self.theta) self.P = (self.P - K @ phi.T @ self.P) / self.lamb return self.theta def to_physical_params(self, theta): a1, a2, b0, b1, b2 = theta # convert to R0, R1, C1, R2, C2 # based on transfer function equivalence # simplified: R0 = b0 # ... additional conversions return {'R0': R0} class ExtendedKalmanFilterSOC: def __init__(self, battery_model): self.batt = battery_model self.x = np.array([0.8, 0.0, 0.0]) # SOC, v1, v2 self.P = np.eye(3) * 0.1 self.Q = np.diag([0.001, 0.001, 0.001]) self.R = 0.01 def state_transition(self, x, I, dt): soc, v1, v2 = x soc_new = soc - I * dt / (self.batt.capacity * 3600) tau1 = self.batt.R1 * self.batt.C1 tau2 = self.batt.R2 * self.batt.C2 v1_new = v1 * np.exp(-dt/tau1) + self.batt.R1 * I * (1 - np.exp(-dt/tau1)) v2_new = v2 * np.exp(-dt/tau2) + self.batt.R2 * I * (1 - np.exp(-dt/tau2)) return np.array([soc_new, v1_new, v2_new]) def measurement(self, x, I): soc, v1, v2 = x V_oc = self.batt.ocv_from_soc(soc) V_t = V_oc - v1 - v2 - I * self.batt.R0 return V_t def jacobian_F(self, x, I, dt): # df/dx F = np.eye(3) F[0,0] = 1.0 # partial derivatives of RC states tau1 = self.batt.R1 * self.batt.C1 tau2 = self.batt.R2 * self.batt.C2 F[1,1] = np.exp(-dt/tau1) F[2,2] = np.exp(-dt/tau2) return F def jacobian_H(self, x, I): # dh/dx dVoc_dsoc = 0.5 # approximate derivative return np.array([dVoc_dsoc, -1.0, -1.0]) def step(self, I, V_meas, dt): # predict self.x = self.state_transition(self.x, I, dt) F = self.jacobian_F(self.x, I, dt) self.P = F @ self.P @ F.T + self.Q # update H = self.jacobian_H(self.x, I) y = V_meas - self.measurement(self.x, I) S = H @ self.P @ H.T + self.R K = self.P @ H.T / S self.x = self.x + K * y self.P = (np.eye(3) - np.outer(K, H)) @ self.P return self.x[0] ","(3)施密特正交变换无迹卡尔曼滤波精度提升:为进一步提高SOC估算精度,采用无迹卡尔曼滤波替代扩展卡尔曼滤波,以避免一阶泰勒展开的线性化误差。但标准无迹卡尔曼滤波使用对称Sigma点采样,计算量较大。提出基于施密特正交变换的无迹卡尔曼滤波,用施密特正交变换生成确定性采样点,替代传统的UT变换。该方法通过对方差矩阵的平方根进行正交变换,产生更少的采样点(仅2n+1个,n为状态维数),且避免了Cholesky分解的数值不稳定问题。在状态维数为三时,传统无迹卡尔曼滤波需要七个Sigma点,施密特正交变换方法同样需要七个但生成更稳定。在UDDS工况下,无迹卡尔曼滤波估算SOC的平均误差为百分之一点二三,最大误差百分之二点六九;施密特正交变换无迹卡尔曼滤波的平均误差进一步降至百分之一点零四,最大误差百分之二点二二。计算时间上,扩展卡尔曼滤波为0.32毫秒每步,无迹卡尔曼滤波为0.51毫秒,施密特正交变换无迹卡尔曼滤波为0.44毫秒,在精度和效率之间取得平衡。在嵌入式平台STM32F407上测试,算法实时性满足一百毫秒采样周期。最终,该SOC估算方法在电池管理系统硬件上验证,与高精度库仑计对比,SOC误差在百分之三以内,具有良好的工程应用价值。