双卡尔曼滤波(KF-UKF)用于考虑电池老化的SOC估计

       这篇博文来介绍一下如何使用Simulink来完成无迹卡尔曼滤波的搭建以估计锂电池非线性系统的SOC。

       (1)KF估计电池老化。电池的容量会随着每次充放电循环而下降,从而导致SOC估计不准确。当电池在充电和放电之间转换时,使用基于事件的线性卡尔曼滤波器来估计电池容量。然后使用估计容量来反映电池的健康状况。

       (2)UKF估计电池SOC。基于二阶RC模型所辨识的参数,使用UKF来实时估计电池的SOC。

1.电池模型

       考虑具有以下等效电路的电池模型:

       其中Uoc为OCV,Ub为终端电压,I为电流,T为温度,R0为内阻,R1、R2为极化电阻,C1、C2为极化电容。

       模型总览:

        电池模型的状态转移方程由下式给出:

       其中,U1,U2分别为两个极化端的电压,Cn为容量,W为过程噪声。

       输入电流在电池放电时随机产生脉冲,在充电时保持恒定。

         测量方程如下所示:

 2.SOC估计

       要使用无迹卡尔曼滤波器模块,需要借助Matlab或function函数指定状态转移方程和量测方程。我们这里使用function函数,如下图所示:

       由于无迹卡尔曼滤波器是离散时间滤波器,因此首先将状态方程离散化。在本例中,采用欧拉离散化。让采样时间不变。对于一般的非线性系统,系统可以离散为:

        非线性电池系统的状态向量为:

 应用欧拉离散化得到以下方程:

       离散状态转移方程在Simulink函数batteryStateFcn中实现。函数输入x是状态向量,函数输出xNext是下一步的状态向量,使用离散状态转移方程计算。在函数中,需要指定x和xNext的信号维度和数据类型。在本例中,x和xNext的信号维数为3,数据类型为double。batteryStateFcn的其他输入是温度、估计容量和电流。请注意,额外的输入是状态转换方程的输入,而不是Unscented卡尔曼滤波器块所需要的。

       同样,测量功能也在名为batteryMeasurementFcn的Simulink函数中实现。

配置Unscented Kalman Filter块参数,如下所示:

       这里主要讲一下协方差矩阵、初始协方差与观测噪声协方差的确定过程,这在很多的文献里是没有讲到的,初学者可能会对这几个参数的调参过程表示迷茫,但其实调参是有规律的,并且是可以通过计算求出来的,而不是随机设置的。这也是该篇博文比较干货的部分。

       (1)过程噪声。

       基于电池系统的动态特性,对电池系统的过程噪声进行了估计。电池的标称容量为30Ah,在15A的平均电流幅值下进行放电或充电循环。因此,一次放电或充电过程大约需要2小时(7200秒)。SOC的最大值是100%,U1、U2的最大值是4V。SOC和U1、U2的每一步的最大变化是

max(|d(SOC)|)=Ts*100%/3600*2;

max(|d(U1)|)=Ts*4/3600*2;

max(|d(U2)|)=Ts*4/3600*2;

       其中Ts为滤波器的采样时间。在本例中,Ts设置为1秒。因此,过程噪声可确定为:

       (2)初始状态。设置为(1;0;0),这个没有什么好纠结的,初始SOC值设置为1,U1、U2分贝设置为0,因为我们没有任何的关于U1、U2的先验信息。

       (3)初始协方差。初始协方差表示初始猜测的准确性和可靠性。假设SOC的最大初始猜测误差为10%,U1、U2的初始猜测误差均为1V,则初始的协方差可设置为:diag(0.1,1,1)。

       (4)无迹变换参数。

Alpha:确定sigma点在x周围的扩散。将Alpha设置为1以获得更大的扩散。

Beta:用于结合分布的先验知识。一般设置为2。

Kappa:二级缩放参数。一般设置为0。

       (5)量测噪声。测量噪声V根据测量设备的精度来估计。用于电池电压测量的电压表的精度约为1%。电池电压在4V左右。因此,我们可以计算出量测噪声为max(dEm)=1%*4V=0.04V,因此V=(max(dEm))^2≈1e-3。

3.估计电池退化

       电池退化是通过容量递减来模拟的。在这个例子中,电池容量被设置为每个充放电循环减少1 Ah,以说明退化的影响。由于时间的关系,电池老化的详细介绍放在下一篇文章里。

4.结果

       在每一个仿真步长内,Unscented卡尔曼滤波器提供了一个估计SOC,基于电压的测量值。绘制实际SOC与UKF预测的SOC的变化曲线,以及它们之间的差异。

% Synchronize two time series
[RealSOC, EstimatedSOC] = synchronize(RealSOC, EstimatedSOC, 'intersection');figure;
subplot(2,1,1)
plot(100*RealSOC,'b','LineWidth',1.5);
hold on
plot(100*EstimatedSOC,'r--','LineWidth',1);
title('State of Charge');
xlabel('Time (s)');
ylabel('SOC (%)');
legend('Actual','UKF estimate','Location','Best','Orientation','horizontal');
axis tightsubplot(2,1,2)
DiffSOC = 100*(RealSOC - EstimatedSOC);
plot(DiffSOC.Time, DiffSOC.Data, 'LineWidth', 1.5);
xlabel('Time(s)');
ylabel('\Delta SOC (%)','Interpreter','Tex');
legend('Difference between Real SOC and Estimated SOC','Location','Best')
axis tight

       在初始估计误差后,SOC迅速收敛到实际SOC。最终估计误差在0.5%以内。因此,Unscented卡尔曼滤波器给出了一个准确的SOC估计。

       在每次充放电转换时,对电池容量进行估计,以改进电池荷电状态的估计。电池系统输出指示灯信号,告知电池处于哪个进程。放电过程在指示灯信号中用-1表示,充电过程用1表示。在本例中,使用指示器信号的变化来确定何时启用或禁用卡尔曼滤波器进行容量估计。我们绘制了实际容量和估计容量以及充放电指示信号。

figure;
subplot(2,1,1);
plot(RealCapacity,'b','LineWidth',1.5);
hold on
plot(EstimatedCapacity,'r--','LineWidth',1.5);
xlabel('Time (s)');
ylabel('Capacity (Ah)');
legend('Actual','KF estimate','Location','Best');subplot(2,1,2);
plot(DischargeChargeIndicator.Time,DischargeChargeIndicator.Data,'b','LineWidth',1.5);
xlabel('Time(s)');
ylabel('Enable Signal');

        一般情况下,卡尔曼滤波能够跟踪实际容量。估计容量与实际容量之间存在半个周期的延迟。这是因为当一个完整的充放电循环结束时,电池容量就会下降。而库仑计数给出了最后一次放电或充电周期的容量测量。

5.总结

       这个模型展示了如何使用Unscented卡尔曼滤波块对锂电池进行SOC估计。此外,还开发用于电池容量估计的基于事件的卡尔曼滤波器。将新估计的容量用于改进无迹卡尔曼滤波器的SOC估计。

6.参考文献

[1] Huria, Tarun, et al. "High fidelity electrical model with thermal dependence for characterization and simulation of high power lithium battery cells." Electric Vehicle Conference (IEVC), 2012 IEEE International. IEEE, 2012.

[2] Wan, Eric A., and Rudolph Van Der Merwe. "The unscented Kalman filter for nonlinear estimation." Adaptive Systems for Signal Processing, Communications, and Control Symposium 2000. AS-SPCC. The IEEE 2000. Ieee, 2000.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9284.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 数据库的概念、常用命令

Redis数据库 一、关系数据库与非关系型数据库概述1、关系型数据库2、非关系型数据库3、关系数据库与非关系型数据库区别(1)数据存储方式不同(2)扩展方式不同(3)对事务性的支持不同 4、非关系型数据库产生背…

pytorch的permute(dims) 函数的功能详解

有三块 二维矩阵 如下 把二维矩阵堆叠起来,就是三维 矩阵 这样的矩阵 从x方向看(0维) 有三块 记为3,每块从y方向看(1维)的行是3,从z方向看(2维)列也是3,故三…

架构师进阶之路 - 架构优化为什么难

目录 业务迭代和技术优化难以兼顾 缺少“上帝”视角思维 系统架构腐化 缺少架构师视角 系统迭代机制 设计规范把控 最近在组织团队内的系统架构优化,总而言之就是难,至于为什么难我这边总结了以下六个方面,记录一下自己的架构师进阶之路吧。&…

2. 日志模块(上)

日志需求分析 无论对于业务系统还是中间件来说,日志都是必不可少的基础功能。完善、清晰地日志可以帮助我们观测系统运行的状态,并且快速定位问题。现在让我们站在 MyBatis 框架开发者的角度,来简单做一下日志功能的需求分析: 作…

【REST规范】JAX-RS有哪些实现

JAX-RS是JAVA EE6 引入的一个新技术。 JAX-RS即Java API for RESTful Web Services,是一个Java 编程语言的应用程序接口,支持按照表述性状态转移(REST)架构风格创建Web服务。JAX-RS使用了Java SE5引入的Java注解来简化Web服务的客…

YUV 8bit转10bit

在有些场景中,我们经常会使用到YUV 8 bit转10bit的场景。 比如YUV420p 8bit 转 P010,P010le,YUV420p10le。 首先说ffmpeg 8 bit 转 10bit. 对于ffmpeg的P010le 和P010be 分别代表小端和大端,那么它转化的时候非常简单,就是8 bit再增加 8bit&…

一篇读懂React、vue框架的生命周期函数

当涉及到前端框架时,React 和 Vue.js 是两个非常受欢迎的选择。它们都提供了强大的工具和功能,帮助开发者构建交互式的、可扩展的应用程序。在这两个框架中,生命周期函数是一个重要的概念,它们允许我们在组件的不同阶段执行特定的…

https安全传输原理:

内容来自思学堂: 信息裸奔——>对称加密——>非对称加密——>非对称和对称加密——>权威第三方机构CA数字签名

Mockito的使用案例

流水线的单元测试 代码没有覆盖到,使用的是Mockito测试框架,原来是Mockito没有正确使用 package com.hmdp;import com.hmdp.controller.BlogController; import com.hmdp.entity.Blog; import com.hmdp.service.IBlogService; import com.hmdp.service.…

Spring学习(三)(类注解和方法注解)

目录 1. 存储Bean对象 1.1 配置扫描路径 1.2 添加注解存储Bean对象 1.2.1 Controller(控制器存储) 1.2.2 Service(服务存储) 1.3 这么多注解???为什么?? 1.3.1 类注解时间的关系 1.4 方法…

J2EE自定义mvc【框架配置及功能】

目录 一、配置步骤 二、配置框架前三步 导入相应的jar 导入相应的Class 导入xml文件 三、优化基本操作(增删改) 1、基础优化 编写实体类 编写BookDao类 优化BookDao JUnit测试 2、后台优化 3、前端优化 一、配置步骤 将框架打成jar包&…

【Hello mysql】 数据库库操作

Mysql专栏:Mysql 本篇博客简介:介绍数据库的库操作 库的操作 创建数据库创建数据库案例字符集和校验规则查看系统默认字符集和校验规则查看数据库支持的字符集和校验规则 校验规则对于数据库的影响操纵数据库查看数据库显示创建语句修改数据库数据库删除…