锂电池容量增量(IC,Incremental Capacity)曲线处理--NASA与Oxford数据集

本文介绍了如何从CALCE、MIT、NASA和Oxford的电池数据集中提取充电和放电过程的IC曲线,并针对异常值处理提供了方法,包括直接舍弃和使用前一循环数据替代。同时,详细展示了如何使用Python读取MAT文件并处理Oxford数据集。
摘要由CSDN通过智能技术生成

'''2024.3.28更新,这些是已经可以跑通的代码,大家自行取用

CALCE放电过程:CALCE电池数据CS2_35放电过程的IC曲线处理代码--对于异常值处理方式是直接舍弃

CALCE充电过程:CALCE电池数据CS2_35充电过程的IC曲线处理代码--对于异常值处理方式是使用前一个循环的数据进行替代

MIT放电过程:

MIT电池IC数据提取--替代补充版本

NASA充电过程:

NASA电池充电过程IC曲线与放电容量提取

Oxford充电过程:

Oxford充电过程IC曲线和放电容量曲线数据处理

这些对某一块电池进行的数据处理,不同电池不同处理方式,还需要自己理解后根据实际情况处理

'''

之前处理的MIT数据集的IC曲线主要是从放电阶段的数据中提取的,这是由于其充电阶段为多阶段的快速充电策略,无法满足IC曲线导出的CCCV条件,而一些更老的数据集如NASA与Oxford电池数据集则是传统的CCCV策略,由此此篇博客我们开始从他们的充电阶段中提取出IC曲线,并讲解一些mat文件读取的注意事项。

NASA电池数据集

每个电池存储为单个的mat文件, 数据存储为充放电混存,因此需要提前将充电和放电周期分开,而每个周期内的数据有“Voltage_measured”,“Current_measured”,“Temperature_measured”,“Current_charge”,“Voltage_charge”,“Time”六个变量,数据结构读取为(B0005.cycle(1).data.Voltage_measured),了解这种结构后方便后续我们读取操作。由于我们只提取IC曲线和放电容量,所以只需用到实际传感器采集的“Voltage_measured”,“Current_measured”和“Time”变量,而放电容量在放电片段直接有记录,无需复杂提取。

开始python部分的数据处理,使用loadmat读取mat数据,这里有个值得注意的是,当读取到“cycle”结构后,并不是如matlab中直接以矩阵结构展示,而是读取成了一个(1,1)的矩阵,我们需要进入矩阵才能索引列变量,所以有[0,0][0]的处理。

#data getin
matFilename = './dataset/B0005.mat'
Battery = scipy.io.loadmat(matFilename)
list(Battery.keys())
# 获取锂电池充电或放电时的测试数据
cycle_data=Battery['B0005']['cycle'][0,0][0]
charge=[]
for cycle in cycle_data:
    if cycle['type'] == 'charge':
                charge.append(cycle['data'])
print("充电循环次数:",len(charge))

#提取放电容量数据
capacity = []
for cycle in cycle_data:
    if cycle['type'] == 'discharge':
                capacity.append(cycle['data'][0,0]['Capacity'][0])
print("放电循环次数:",len(capacity))
plt.plot(capacity)
#与充电循环存在两个cycle差距,舍弃充电数据的第一个(电池准备操作,存在大的异常)和最后一个循环(这个循环没有放电数据)

得到的放电容量图如下,NASA的电池具有明显的容量增生情况,如果大家需要减少这种情况,可以采用核滤波或者EMD分解(这个比较常见用于处理容量增生情况)。

然后进行IC曲线的提取,这里我们设定一个最低的dV值,避免由于采样点过于密集导致dV过小,出现较大的异常值噪声,我们一般设置为0.004V,dQ使用梯形近似积分逼近实际情况,以下代码展示直接从源数据提取出的IC曲线情况。

#查看原始的IC曲线
plt.plot(figsize=(10,5))
for cyc in range (len(charge)):
    v=charge[cyc]['Voltage_measured'][0,0].T
    c=charge[cyc]['Current_measured'][0,0].T
    t=charge[cyc]['Time'][0,0].T
    v,c,t=np.squeeze(v),np.squeeze(c),np.squeeze(t)
    v,c,t=v.reshape(-1),c.reshape(-1),t.reshape(-1)
    #print(v.shape,c.shape,t.shape)
    step = 0.004  # 电压微分最小值,防止dV过小导致的噪声阶跃
    numV = len(v)  # 索引
    i = 0
    #补充一些边缘点的值,防止数值过大
    dV = [1000]
    Vind = [3.10]
    dQ = [0]
    while i < (numV - 2):
            diff = 0
            j = 0
            # 寻找符合电压微分最小值的间隔点
            while (diff < step and (i + j) < (numV - 1)):
                j += 1
                diff = abs(v[i + j] - v[i])
            # 检查是否到达下限,末尾反复波动,截止电压为3.4V
            #选择结束末尾的插值点
            if (diff < step or v[i] > 4.194):
                i += numV - 2
                continue
            else:
                dt = np.diff(t[i:i + j + 1])/3600  # 单位h小时
                ch_c1 = c[i:i + j + 1]
                dc = ch_c1[:-1] + np.diff(ch_c1) * 0.5  # 电流微分,每两个点取一个均值,单位A
                dQ.append(np.sum(dc * dt))
                dV.append(diff)
                Vind.append(v[i] * 0.5 + v[i + j] * 0.5)#取两个点的均值
                i += 1
                continue
    dV.append(dV[-1])
    Vind.append(4.20)
    dQ.append(dQ[-1])
    if (min(Vind)<3):
         continue
    dQdV = np.array(dQ) / np.array(dV)
    #去除相同V值对应的dQdV
    unique_V, unique_indices = np.unique(Vind, return_index=True)
    unique_dQdV = []
    for i in range(len(unique_V)):
        indices = np.where(Vind == unique_V[i])[0]
        mean_dQdV = np.mean(dQdV[indices])
        unique_dQdV.append(mean_dQdV)
    plt.plot(unique_V,unique_dQdV)
    #print(diff_v.shape,diff_t.shape,diff_c.shape)
    #plt.plot(range(len(dQdV)),dQdV)

可以看到IC曲线的特征较为明显的被处理出来了, 但部分循环存在异常,对于图中这种情况,只需对于V为4的点做一个限制,若dQ/dV<1,则使用前一个循环进行替代由此处理异常情况。

最终处理后的结果为,当然若觉得不够光滑,可自己选择合适的滤波窗口进行处理,尽量在特征保留和平滑中取得一个平衡

Oxford数据集

Oxford在python中读取仍有NASA读取时的问题,类似的处理方式进行操作就行,按照Oxford的数据结构进行处理即可。类似的处理后结果如图

欢迎批评指正,如果本文对您有帮助,顺手点赞收藏关注博主,谢谢您的阅读。

本文仅供参考,引用请标注来源,禁止copy。

  • 30
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
增量容量法(Incremental Capacity Analysis)是一种常用的方法,用于从电池充放电曲线中提取特征。以下是基于增量容量法提取IC曲线特征的步骤: 1. 数据采集:首先,需要采集电池充放电过程中的电流和电压数据。这些数据可以通过电池管理系统或专用的测试设备进行采集。 2. 数据处理:对采集到的电流和电压数据进行预处理,如去除噪声、滤波等。确保数据的准确性和可靠性。 3. 计算容量:根据采集到的电流和电压数据,计算每个时间点上的容量值。可以通过积分电流来计算容量,或者利用已知的放电容量曲线进行插值计算。 4. 计算增量容量:计算每个时间点上的增量容量值,即相邻时间点上的容量差值。增量容量可以通过以下公式计算: IC(t) = ΔQ(t) / ΔV(t) 其中,IC(t)表示时间点t上的增量容量,ΔQ(t)表示时间点t与t-1之间的容量差值,ΔV(t)表示时间点t与t-1之间的电压差值。 5. 特征提取:从增量容量曲线中提取特征。常用的特征包括: - 峰值特征:提取增量容量曲线中的峰值容量和对应的电压值。 - 斜率特征:计算增量容量曲线的斜率,可以用于判断电池容量变化速率。 - 曲线形状特征:通过拟合增量容量曲线,提取曲线的形状特征,如指数、多项式等。 - 面积特征:计算增量容量曲线与时间轴之间的面积,可以表示电池的总容量变化情况。 6. 特征分析和应用:对提取的特征进行分析和应用。可以使用统计方法、机器学习等进行特征分析,进一步判断电池的状态和性能。 通过增量容量法提取IC曲线特征,可以帮助理解电池容量变化规律和性能特征。这些特征可以用于电池状态估计、故障诊断、性能评估等应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值