AEKF_SOC_Estimation函数使用二阶RC等效电路模型(ECM)和自适应扩展卡尔曼滤波器(AEKF)估计电池的端电压(Vt)和充电状态(SOC)。该函数将以下内容作为输入:

· 电流(A)
· 电压(V)
· 温度(℃)

该函数的输出为:

· 估计SOC

· 估计电压Vt

· 电压Vt误差

function [SOC_Estimated, Vt_Estimated, Vt_Error] =AEKF_SOC_Estimation(Current, Vt_Actual, Temperature)

加载电池模型参数以及不同温度的SOC-OCV关系数据库。如果没有可用的温度数据或使用单一温度,建议使用25℃作为参考。用户应调整变量Cn,即在特定温度下的最大测量容量。

默认情况下,该函数加载提供的“BatteryModel\_Sample”.mat’文件,它是一个带标签的表格。该表分别在第1列至第7列中包含OCV、SOC、、R0、R1、C1、R2、C2数据。SOC的范围为0%至100%,间隔约为10%,但用户可以根据需要增加或减少SOC。

load 'BatteryModel.mat'; % Load the battery parameters and SOC-OCV
curve

SOC-OCV曲线由电池单元的脉冲特性测试产生。通常这是C/20放电和充电测试,每个放电和充电曲线的平均值为每个温度的一个SOC-OCV。重要的是确保没有重复的SOC点(特别是如果这些点具有不同的OCV值),因为这将在函数运行时导致插值错误。通过HPPC或其他特性测试,使用Simulink和Simscape模拟对电池进行建模,以估计电池参数,其他可用方法包括优化算法,如GA遗传算法。T是在表征在驾驶循环测试时测得的电池温度。

1.建模电池参数初始化

将初始SOC设置在0和1之间,其中0为0%,1为100%。可以将其设置为行驶循环初始SOC,或者设置为小于20%左右的值,以测试收敛性和鲁棒性。ΔT是电流矢量和Vt矢量中每个值之间的时间差,用于计算A和B矩阵。

SOC_Init = 1; % intial SOC
X = [SOC_Init; 0; 0]; % state space x parameter intializations
DeltaT = 1; % sample time in seconds
Qn_rated = 4.81 * 3600; % Ah
% initialize scatteredInterpolant functions for battery parameters and
SOC-OCV curve
% this function also allows for extrapolation
F_R0 = scatteredInterpolant(param.T,param.SOC,param.R0);
F_R1 = scatteredInterpolant(param.T,param.SOC,param.R1);
F_R2 = scatteredInterpolant(param.T,param.SOC,param.R2);
F_C1 = scatteredInterpolant(param.T,param.SOC,param.C1);
F_C2 = scatteredInterpolant(param.T,param.SOC,param.C2);
F_OCV = scatteredInterpolant(param.T,param.SOC,param.OCV);

卡尔曼滤波器有3个参数可以调节:R、P和Q。这些参数需要手动或通过优化算法对每个电池进行调整/调谐。R应设置为用于测试电池单元的设备的误差的平方。一旦调整了Q的值,就不能更新R。

n_x = size(X,1);
R_x = 2.5e-5;
P_x = diag(1e-10);
Q_x = [1.0000e-10 0 0;
0 1.0000e-10 0;
0 0 1.0000e-10];

初始化输出向量,并根据当前向量的大小设置for循环的长度。取消注释第25行,以测试0.1A的电流偏移。根据需要更新偏移。

SOC_Estimated = [];
Vt_Estimated = [];
Vt_Error = [];
ik = length(Current);
% Current = Current+0.1;

2.卡尔曼滤波算法

这是自适应扩展卡尔曼滤波算法的开始。 循环基于当前输入电流数据长度。

for k=1:1:ik
T = Temperature(k); % C
U = Current(k); % A
SOC = X(1);
V1 = X(2);
V2 = X(3);
% Evaluate the battery parameter scatteredInterpolant
% functions for the current temperature & SOC
R0 = F_R0(T,SOC);
R1 = F_R1(T,SOC);
R2 = F_R2(T,SOC);
C1 = F_C1(T,SOC);
C2 = F_C2(T,SOC);
OCV = F_OCV(T,SOC);
% OCV = pchip(param.SOC,param.OCV,SOC); % pchip sample for unknown or
single temperature
The following is used to calculate the A and B matrices below on line 66 and 69.
Tao_1 = C1 * R1;
Tao_2 = C2 * R2;
a1 = exp(-DeltaT/Tao_1);
a2 = exp(-DeltaT/Tao_2);
b1 = R1 * (1 - exp(-DeltaT/Tao_1));
b2 = R2 * (1 - exp(-DeltaT/Tao_2));

3.运行更新模型

Vt方程基于:

TerminalVoltage = OCV - R0*U - V1 - V2;

当U(电流)为正时,电池正在放电,库仑效率(η)设置为0.99。当U(电压)为负时,电池在充电,库仑系数(η)。

if U > 0
eta = 0.99; % eta for discharging
elseif U <= 0
eta = 1; % eta for charging
end

通过线性化C矩阵来线性化模型。该函数使用线性插值在特定查询点返回一维函数的插值。

OCV = interp1(param.SOC,param.OCV,SOC,'linear','extrap');
C_x = [OCV -1 -1];
Calculate the Vt error.
Error_x = Vt_Actual(k) - TerminalVoltage;
if abs(Error_x) < 0.01
Error_x = 0.000;
end

保存/更新带有Vt误差的矢量中的SOC和电压估计值。这些是函数的输出向量。

Vt_Estimated = [Vt_Estimated;TerminalVoltage];
SOC_Estimated = [SOC_Estimated;X(1)];
Vt_Error = [Vt_Error;Error_x];

4.EKF

EKF使用两步预测校正算法。使用上述变量计算A和B矩阵:

接下来,完成KF的预测(时间更新)部分。

1.预测未来状态(先验):

2.预测误差协方差:

A = [1 0 0;
0 a1 0;
0 0 a2];
B = [-(eta * DeltaT/Qn_rated); b1; b2];
X = (A * X) + (B * U);
P_x = (A * P_x * A') + Q_x;

接下来,完成KF的校正(测量更新)部分。

1.计算卡尔曼增益:

2.用测量值更新估计值Zk(后验):

3.更新误差协方差:

KalmanGain_x = (P_x) * (C_x') * (inv((C_x * P_x * C_x') + (R_x)));
X = X + (KalmanGain_x * Error_x);
P_x = (eye(n_x,n_x) - (KalmanGain_x * C_x)) * P_x;

5.自适应律协方差匹配(AEKF)

自适应律协方差匹配由下式给出:

Q_x = KalmanGain_x * Error_x * KalmanGain_x';
end

6.下面给出自适应扩展卡尔曼滤波的绘图程序及结果:

% Terminal Voltage Measured vs. Estimated
figure
plot(LiPoly.RecordingTime_Hours,LiPoly.Measured_Voltage);
hold on
plot(LiPoly.RecordingTime_Hours,Vt_Estimated);
hold off;
legend('Measured','Estimated AEKF');
ylabel('Terminal Voltage[V]');xlabel('Time[hr]');
title('Measured vs. Estimated Terminal Voltage (V) at 40 Deg C')
grid minor
% Terminal Voltage Error
figure
plot(LiPoly.RecordingTime_Hours,Vt_Error);
legend('Terminal Voltage Error');
ylabel('Terminal Voltage Error');
xlabel('Time[hr]');
% SOC Coulomb Counting vs. Estimated
figure
plot (LiPoly.RecordingTime_Hours,LiPoly.Measured_SOC);
hold on
plot (LiPoly.RecordingTime_Hours,SOC_Estimated*100);
hold off;
legend('Coulomb Counting','Estimated AEKF');
ylabel('SOC[%]');xlabel('Time[hr]');
title('Coulomb Counting vs. SOC Estimated at 40 Deg C')
grid minor
% SOC Error
figure
plot(LiPoly.RecordingTime_Hours,(LiPoly.Measured_SOC - SOC_Estimated*100));
legend('SOC Error');
ylabel('SOC Error [%]');
xlabel('Time[hr]');
grid minor

1.仿真电压对比

2.仿真电压误差

3.SOC对比

4.SOC误差

基于自适应扩展卡尔曼滤波器(AEKF)的锂离子电池SOC估计(附MATLAB代码)相关推荐

  1. RBF-UKF径向基神经网络结合无迹卡尔曼滤波估计锂离子电池SOC(附MATLAB代码)

    目录 RBFNN训练结果 UKF估计SOC 文章的结尾红色部分有彩蛋 RBFNN训练结果 这篇文章主要介绍如何使用RBF神经网络训练出的参数并结合UKF算法完成锂离子电池SOC的估计,有关RBF参数训 ...

  2. 【SVM分类】基于自适应蚁狮算法优化SVM分类器实现胃肠道病变附matlab代码

    1 简介 2 部分代码 function RWs=RWalks(dim,max_iter,lb,ub,antlion,current_iter)

  3. 【滤波估计】基于双卡尔曼滤波实现soc和soh联合估计附matlab代码

    1 内容介绍 对电动汽车电池管理系统进行电池状态估计非常重要准确充电,实现电池模型参数的在线更新.在本文中,开路电压的估计转换为开路电压拟合的估计参数,快速时变参数开路电压被转换成几个慢时变参数.提出 ...

  4. 【信号分解】基于LMD算法和ELMD算法实现管道泄漏信号处理附matlab代码

    1 内容介绍 在科技水平相当发达的今天,互联网+.大数据慢慢渗透进人们的生活当中,但 科技的进步不仅仅要体现在生活质量水平的提高.经济的快速发展,更应该体现在对社会资源的合理利用.自建国以来,我国管道 ...

  5. 【智能优化算法-白鲸算法】基于白鲸优化算法求解多目标优化问题附matlab代码

    1 内容介绍 在本文中,一种新的基于群体的元启发式算法灵感来自白鲸的行为鲸鱼,称为白鲸优化(BWO),是为了解决优化问题而提出的.三在 BWO 中建立了探索.开发和鲸落的阶段,对应于成对游泳.猎物和鲸 ...

  6. 【智能优化算法-白鲸优化算法】基于白鲸优化算法求解单目标优化问题附matlab代码

    1 内容介绍 白鲸优化算法(Beluga whale optimization,BWO)由Changting Zhong等人于2022年提出,该算法模拟了白鲸游泳,觅食和"鲸鱼坠落" ...

  7. 【元胞自动机】基于元胞自动机实现高速公路收费站交通流问题附matlab代码

    1 简介 近年来,我国高等级公路发展迅速,截止到2012年底,我国高速公路的通车里程已达到97355公里,比2011年增长14.6%.而我国自1984年以来实行"贷款修路.收费还贷" ...

  8. 【毕业设计/Matlab系列】基于PCA和BP神经网络的人脸识别系统(附matlab代码)

    Date: 2022.4.26 文章目录 前言 1.总体介绍 2.详细分析 2.1.训练程序 2.2.测试程序 3.测试效果图 4.测试部分matlab代码 前言 在毕业设计中实现了基于PCA和BP神 ...

  9. 【数学建模】基于SIR模型实现新冠病毒COVID-19估计附matlab代码

    1 内容介绍 COVID-19是由严重急性呼吸综合症冠状病毒2型引发的传染病,它最初病毒携带者是一些动物,传染源主要是COVID-19患者,无症状患者.传播方式主要是呼吸道飞沫近距离传播,接触传播,还 ...

最新文章

  1. colsure php_PHP Closure(闭包)类详解
  2. “跟着菜鸟一起学R语言” 现已更名为“数据志”
  3. OS中阻塞与挂起的区别sleep()的实现原理
  4. 数据操纵语言(DML)
  5. 如何用笔记本建立wifi热点
  6. 文件流导出乱码_Savespss:不使用StatTransfer也可转换dta为sav文件的利器
  7. 小程序 input 换行_小程序 input双向数据绑定
  8. java打印的globa类l_Spring异常集中处理和日志集中打印
  9. PC端编辑 但能在PC端模拟移动端预览的富文本编辑器
  10. Oracle SUn
  11. autocoder自动代码生成器_Spring Boot 集成MyBatis Plus代码生成器
  12. linux中find查找文件和查找文件内容
  13. Oracle 10g client(instantclient)环境配置
  14. AMR文件格式的解释
  15. Oracle删除数据消耗时间大吗,oracle 删除大量数据的方法
  16. 计算机读不了硬盘分区,修复移动硬盘分区故障和无法识别计算机
  17. 破解不加微信看朋友圈
  18. python量化交易系统_Python学员作品-股票量化交易系统
  19. 计算机初级试卷,计算机初级试题及答案
  20. 实验楼原型系统设计-1

热门文章

  1. 微软正式抛弃UWP!
  2. 帝国php忘记密码,一键帝国CMS快速重置管理员密码工具(送给忘记密码的站长)...
  3. r语言 图形一览_R语言常见图形(1)
  4. 书签转json格式代码(chrome,edge...)
  5. 操作系统精选习题——第六章
  6. 利用MS08067远程溢出漏洞抓肉鸡
  7. 关于SQLyog创建函数
  8. 利用nps_payload 免杀360,腾讯电脑管家
  9. VL01N/VL02N-发货单增强:MV50AFZ1
  10. linux ppa安装软件,Linux Ubuntu下安装PPA源软件