核心内容摘要
仙踪林秘境:解锁身心愉悦的无限可能
基于扩展卡尔曼滤波的蓄电池组SOC估算 Matlab/Simulink仿真模型成品蹲在实验室调了三天参数之后我终于把这个基于EKF的电池SOC估算模型给盘明白了。
这玩意儿看着高大上其实就是个电池算命先生只不过用的不是龟甲铜钱而是矩阵运算。
先给各位看看整个Simulink模型的结构见图1左边是电池等效电路模型在疯狂飙戏右边那个戴着卡尔曼滤镜的模块才是主角。
基于扩展卡尔曼滤波的蓄电池组SOC估算 Matlab/Simulink仿真模型成品核心代码藏在EKF模块的MATLAB Function里咱们重点看状态更新这部分function [x_est, P_est] ekf_update(dt, U, I, x_prev, P_prev) R0
05; % 内阻老演员了 Cn
3e4; % 电池容量 % 状态方程私房菜 x_pred [x_prev(
- (I*dt)/(3600*Cn); x_prev(
*exp(-dt/(x_prev(
*
)]; % 雅可比矩阵现形记 F [1, 0, 0; 0, exp(-dt/(x_prev(
*
), (dt*x_prev(
)/(10*x_prev(
^
*exp(-dt/(x_prev(
*
); 0, 0, 1]; Q diag([1e-6, 1e-5, 1e-7]); % 过程噪声玄学调参 P_pred F*P_prev*F Q; % 观测方程脱口秀 H [-R0, -1, 0]; y_pred H*x_pred - U; S H*P_pred*H
01; % 观测噪声打码 K P_pred*H/S; x_est x_pred K*(0 - y_pred); # 实测电压来打脸 P_est (eye(
- K*H)*P_pred; end这段代码里藏着三个暗坑首先是状态量x的第三位藏着极化时间常数这个老六变量在指数函数里会引发数值核爆得加个系数10压压惊其次是雅可比矩阵F的第二行第三列求导时特别容易把分母次数搞错最后那个
01的观测噪声调参时差点让我把鼠标砸了。
实测时发现个反直觉的现象当电池处于50%左右SOC时估算精度反而比满电状态差。
后来发现是Thevenin等效电路模型在中等荷电状态时极化电压变化更剧烈就像中年人的血压一样不稳定。
解决办法相当暴力——直接给过程噪声Q矩阵的第二项加了个动态系数Q(2,
1e-5 * (1 abs(x_prev(
-
0.
*
; # 离50%越远越安分调完参跑出来的结果曲线终于像样了见图2SOC估算误差能控制在±2%以内。
不过要提醒各位这个模型对初始SOC值敏感得像初恋少女建议配合安时积分法做联合估计。
最后送个调试彩蛋在Simulink里给电流输入加个5%的随机扰动你会看到卡尔曼增益像蹦迪一样疯狂摆动这时候该去检查雅可比矩阵是不是写串行了。