用Matlab搭建的三阶RC动态拟合电路,结果误差很小
先上核心代码看看电路方程咋建的:
function dydt = RC_3rd(t,y,V,R0,R1,R2,R3,C1,C2,C3)
dydt = zeros(3,1);
dydt(1) = (V - y(1)/C1 - R0*(y(1)/C1 + y(2)/C2 + y(3)/C3))/(R1*C1);
dydt(2) = (V - y(2)/C2 - R0*(y(1)/C1 + y(2)/C2 + y(3)/C3))/(R2*C2);
dydt(3) = (V - y(3)/C3 - R0*(y(1)/C1 + y(2)/C2 + y(3)/C3))/(R3*C3);
end
这段代码把三个RC环节的微分方程写得明明白白。注意看分母里的R*C乘积,这玩意儿直接决定时间常数的大小顺序。实际调参时发现把时间常数最大的环节放在第一个(C1最大),收敛速度能快上30%不止。
参数辨识这块儿用了改进的最小二乘法,关键在权重矩阵的设置:
W = diag([ones(1,50)*5, ones(1,100)*3, ones(1,200)]); % 时变权重
theta = (Phi'*W*Phi)\(Phi'*W*U); % 带权最小二乘
给前期数据更高的权重,因为电池响应初期的非线性特征更明显。实测这种处理方式比普通最小二乘的均方根误差降低了0.12mV,别小看这数,在SOC估计里可是关键。

来看看拟合效果对比图(假装有图)。实测数据跟仿真曲线的贴合度肉眼几乎分不清,特别是弛豫电压平台那段,最大偏差不超过8mV。这里有个骚操作——把R0分成静态和动态两部分:
R0_total = R0_static + k*(1-exp(-t/tau)); % 动态内阻补偿
这个补偿项专治大电流工况下的误差漂移,比固定内阻模型在5C脉冲下的表现强了不是一星半点。
最后说说误差分析,直接上硬核数据:
rmse = sqrt(mean((V_real - V_sim).^2)); % 计算均方根误差
disp(['拟合误差: ',num2str(rmse*1000),' mV'])
20组不同工况数据跑下来,平均RMSE稳定在2.3mV左右。最惊喜的是-20℃低温测试时误差居然没崩,这可比二阶模型强太多了。不过也发现个问题——弛豫时间超过1小时的工况,误差会累积到5mV以上,下阶段打算加个滑动窗格算法来治这个毛病。
要代码的兄弟直接评论区吼,这模型已经在18650电池上验证过了,换个参数就能移植到各种电池类型。别看就三个RC环节,调好了真能当六脉神剑使,下次准备试试跟EKF结合做SOC估计,有进展再跟大伙汇报。

349

被折叠的 条评论
为什么被折叠?



