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

这篇具有很好参考价值的文章主要介绍了基于自适应扩展卡尔曼滤波器(AEKF)的锂离子电池SOC估计(附MATLAB代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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方程基于:

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

 

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矩阵来线性化模型。该函数使用线性插值在特定查询点返回一维函数的插值。 

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

 

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矩阵: 

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

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

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

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

 2.预测误差协方差:

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

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.计算卡尔曼增益:

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

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

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

 3.更新误差协方差:

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

 

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)

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

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

 

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.仿真电压对比

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

 2.仿真电压误差

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

 3.SOC对比

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

 4.SOC误差

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

 

硕博期间所有的程序代码,一共2个多g,可以给你指导,赠送半个小时的语音电话答疑。电池数据+辨识程序+各种卡尔曼滤波算法都在里面了,后续还会有新模型的更新。快速入门BMS软件。某鹅:2629471989文章来源地址https://www.toymoban.com/news/detail-422914.html

到了这里,关于基于自适应扩展卡尔曼滤波器(AEKF)的锂离子电池SOC估计(附MATLAB代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用环境中的视觉地标和扩展卡尔曼滤波器定位移动机器人研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码及文章 本文

    2024年02月10日
    浏览(55)
  • 【鲁棒、状态估计】用于电力系统动态状态估计的鲁棒迭代扩展卡尔曼滤波器研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 IEEE14节点  ​ 2.2 IEEE30节点  ​  2.3 

    2024年02月07日
    浏览(41)
  • 【状态估计】基于线性卡尔曼滤波器和粒子滤波器无人机估计地形高度(Matlab代码实现)

      💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 本文模

    2024年02月16日
    浏览(45)
  • 基于变分贝叶斯的自适应卡尔曼滤波(matlab)

        参考文献《Recursive Noise Adaptive Kalman Filtering by Variational Bayesian Approximations》中的算法,用matlab编写了一个小程序测试了一下(demo版本)。程序是按照文章中的内容实现的。     下面是主程序:     下面是调用到的几个函数:     函数一(cholesky分解,

    2024年02月11日
    浏览(45)
  • 卡尔曼滤波器-概述及用递归思想解读卡尔曼滤波器 | 卡尔曼滤波器应用举例(附Matlab程序)| 数学基础-数据融合、协方差矩阵、状态空间方程

      卡尔曼滤波器是最优化的(Optimal)、递归的(Recursive)、数字处理的(Data Processing)算法(Algorithm)。卡尔曼滤波器更像是观测器,而不是一般意义上的滤波器,应用广泛,尤其是在导航中,它的广泛应用是因为生活中存在大量的不确定性。   当描述一个系统的不确

    2024年02月06日
    浏览(61)
  • 卡尔曼滤波器简介——概述

    关于卡尔曼滤波器         大多数现代系统都有许多传感器,可以根据一系列测量来估计隐藏(未知)状态。例如,GPS接收器提供位置和速度估计,其中位置和速度是隐藏状态,卫星信号到达的差分时间是测量值。         跟踪和控制系统的最大挑战之一是在存在不确

    2024年02月01日
    浏览(72)
  • 【图像处理 】卡尔曼滤波器原理

    目录 一、说明 二、它是什么? 2.1 我们可以用卡尔曼滤波器做什么? 2.2 卡尔曼滤波器如何看待您的问题

    2024年02月06日
    浏览(54)
  • 卡尔曼滤波器(目标跟踪一)(上)

    本文主要是针对目标跟踪算法进行一个学习编码,从比较简单的卡尔曼滤波器开始,到后面的deepsort 和最后与yolo算法进行整合,到最后手动实现目标跟踪框架的流程进行。本着,无法造轮子就没有彻底理解的原则进行学习。那么废话不多说开始了。(收藏点赞?VIP:Free,白嫖

    2024年02月08日
    浏览(50)
  • 卡尔曼滤波器简介——α−β−γ滤波器

            现在我们已经准备好了第一个简单的例子。在此示例中,我们估计静态系统的状态。静态系统是在合理的时间段内不会更改其状态的系统。例如,静态系统可以是一座塔,而状态将是它的高度。         在此示例中,我们估计金条的重量。我们有无偏尺度,即

    2024年02月01日
    浏览(121)
  • 卡尔曼滤波器的定义,实例和代码实现

    卡尔曼滤波器(Kalman filter)是一种高效的递归滤波器, 能够从一系列包含噪音的测量值中估计动态系统的状态. 因为不需要存储历史状态, 没有复杂计算, 非常适合在资源有限的嵌入式系统中使用. 常用于飞行器的导引, 导航及控制, 机械和金融中的时间序列分析, 轨迹最佳化等. 卡

    2024年03月09日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包