使用扩展卡尔曼滤波(EKF)估计电池SOC(附MATLAB程序及详解)part1主函数篇

一、数据导入      

       这个脚本的主要目标是提供一个使用扩展卡尔曼滤波器(EKF)的电池荷电状态(SOC)估计的程序。使用二阶RC等效电路模型来分析电池在使用中的SOC和端电压(Vt),并考虑到电池表面温度的影响。该分析中使用的电池数据可在https://data.mendeley.com/datrxm/1.上公开获得。

       首先,加载实验测量的电池时间、电压、电流和温度数据。这将作为EKF_SOC_Estimation函数的输入。由于真实的SOC不能直接测量并与EKF估计的SOC进行比较,因此使用颜色计数进行计算。 在这个程序中,真实的数据以前被组织成一个结构类型,然后保存为一个.mat文件。一旦执行“load”命令,工作区中的“meas”数据将加载,其中包含电池时间、电压、电流和温度数据。如果将数据保存在Excel电子表格中,则使用命令“xlsread”,并相应地将数据分配给相应的LiPoly结构。 

load('04-12-19_04.45 765_LA92_40degC_Turnigy_Graphene.mat');
LiPoly.RecordingTime            = meas.Time;
LiPoly.Measured_Voltage         = meas.Voltage;
LiPoly.Measured_Current         = meas.Current;
LiPoly.Measured_Temperature     = meas.Battery_Temp_degC;

nominalCap                      = 4.81; % Battery capacity in Ah taken from data.
LiPoly.Measured_SOC             = (nominalCap + meas.Ah).*100./nominalCap;  % Calculate the SOC using Coloumb Counting for comparison

       根据数据的大小,可能需要重新采样以节省计算时间。在下面的代码行中,数据从10 Hz重新采样到1 Hz。如果需要,可以对这部分进行更改。

LiPoly.RecordingTime            = LiPoly.RecordingTime(1:10:end);
LiPoly.Measured_Voltage         = LiPoly.Measured_Voltage(1:10:end);
LiPoly.Measured_Current         = LiPoly.Measured_Current(1:10:end);
LiPoly.Measured_Temperature     = LiPoly.Measured_Temperature(1:10:end);
LiPoly.Measured_SOC             = LiPoly.Measured_SOC(1:10:end);

        本脚本将电流的正值作为放电电流,将负值作为充电电流。如果用户记录的数据具有相反的定义,那么使用第17行中的命令来反转此定义,否则则注释第17行。为了绘图目的,将采样时间从秒转换为小时。

% 电流定义: (+) 放电, (-) 充电
LiPoly.Measured_Current_R       = - LiPoly.Measured_Current;

% 将秒转化成小时
LiPoly.RecordingTime_Hours      = LiPoly.RecordingTime/3600;

EKF_SOC_Estimation Function

       给定测量的电流、电压、SOC和温度,以下函数输出SOC和Vt的估计值,以及与测量相关误差。EKF_SOC_Estimation Function模块的详细设计将在下一篇博客进行讲解。

[SOC_Estimated, Vt_Estimated, Vt_Error] = EKF_SOC_Estimation(LiPoly.Measured_Current_R, LiPoly.Measured_Voltage, LiPoly.Measured_Temperature);

二、绘制结果并计算误差

1.测量端电压vs估计端电压

figure
plot(LiPoly.RecordingTime_Hours,LiPoly.Measured_Voltage);
hold on
plot(LiPoly.RecordingTime_Hours,Vt_Estimated);
hold off;
legend('Measured','Estimated EKF');
ylabel('Terminal Voltage[V]');xlabel('Time[hr]');
title('Measured vs. Estimated Terminal Voltage (V) at 40 Deg C')
grid minor

 2.端电压误差

figure
plot(LiPoly.RecordingTime_Hours,Vt_Error);
legend('Terminal Voltage Error');
ylabel('Terminal Voltage Error');
xlabel('Time[hr]');

 3.真实SOC vs EKF估计的SOC

figure
plot (LiPoly.RecordingTime_Hours,LiPoly.Measured_SOC);
hold on
plot (LiPoly.RecordingTime_Hours,SOC_Estimated*100);
hold off;
legend('Coulomb Counting','Estimated EKF');
ylabel('SOC[%]');xlabel('Time[hr]');
title('Coulomb Counting vs. SOC Estimated at 40 Deg C')
grid minor

 4.SOC误差

figure
plot(LiPoly.RecordingTime_Hours,(LiPoly.Measured_SOC - SOC_Estimated*100));
legend('SOC Error');
ylabel('SOC Error [%]');
xlabel('Time[hr]');
grid minor

 5.计算端电压(Vt)和SOC的均方根误差(RMSE)和最大误差(MAX)

RMSE_Vt     = sqrt((sum((LiPoly.Measured_Voltage - Vt_Estimated).^2)) /(length(LiPoly.Measured_Voltage)))*1000 % mV
RMSE_SOC    = sqrt((sum((LiPoly.Measured_SOC - SOC_Estimated*100).^2)) /(length(LiPoly.Measured_SOC))) % (%)
Max_Vt      = max(abs(LiPoly.Measured_Voltage - Vt_Estimated))*1000 % mV
Max_SOC     = max(abs(LiPoly.Measured_SOC - SOC_Estimated*100)) % (%)

RMSE_vt = 1.3154;

RMSE_soc = 1.9440;

Max_vt = 17.7890;

Max_soc = 2.8007;

  • 3
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
以下是一个简单的粒子群算法结合扩展卡尔曼滤波估计电池SOCMATLAB 代码: ``` % 设置初始参数 N = 50; % 粒子数 max_iter = 100; % 最大迭代次数 w = 0.8; % 惯性权重 c1 = 2; % 个体学习因子 c2 = 2; % 群体学习因子 dt = 1; % 采样时间 % 读取电池数据 data = xlsread('battery_data.xlsx'); voltage = data(:,1); current = data(:,2); % 初始化粒子位置和速度 x = rand(N,1); v = rand(N,1); % 初始化权重矩阵 W = diag([0.01, 0.01]); % 初始化估计值和协方差矩阵 x_hat = [0;0]; P = diag([1,1]); % 循环迭代 for iter = 1:max_iter % 计算每个粒子的适应度值 fitness = abs(voltage - current.*x); % 找到最优解 [best_fitness, best_idx] = min(fitness); best_x = x(best_idx); % 更新每个粒子的速度和位置 for i = 1:N v(i) = w*v(i) + c1*rand*(best_x - x(i)) + c2*rand*(best_x - x(i)); x(i) = x(i) + v(i); end % 执行扩展卡尔曼滤波估计 A = exp(-1/(3600*3.9)); B = 1-exp(-1/(3600*3.9)); C = 1; D = 0; u = current(iter); y = voltage(iter); x_hat = A*x_hat + B*u; P = A*P*A' + W; K = P*C'*inv(C*P*C'+1); x_hat = x_hat + K*(y-C*x_hat); P = (eye(2)-K*C)*P; % 输出估计SOCsoc = x_hat(1); fprintf('Iteration %d, SOC = %f\n', iter, soc); end ``` 这个程序使用粒子群算法优化电池SOC估计,然后使用扩展卡尔曼滤波器对估计值进行修正。每次迭代后都会输出当前的SOC估计值。注意,此代码仅供参考,实际应用中需要根据具体情况进行修改和调整。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新能源BMS佬大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值