soh估计:Data-driven prediction of battery cycle life before capacity degradation

news2024/11/23 20:56:12

文献思想

作者发现不同循环寿命的电池,第100次和第10次循环放电容量的差有不同,作者由这一现象,提取出了放电容量差的方差、平均值、最小值等特征,其中放电容量差的方差对数和循环寿命的对数的皮尔逊相关性高达-0.93,然后由此系列特征,用回归模型对循环寿命做估计,最好的模型使用前100个循环的数据预测周期寿命时,有9.1%的测试误差,此时大多数电池还没有表现出容量退化。除此之外,本文还对电池做了低寿命组和高寿命组的分类,仅使用前5个循环数据对电池分类,有4.9%的测试误差。另作者认为石墨负极在这些电池的降解中占主导地位,这些结果可能对其他基于石墨的锂离子电池也很有用。

复现过程

评测指标:MAPE和RMSE
总数据集:124
测试集:40

Fig. 1

a : 124块电池每次循环时总放电容量与循环数的关系,容量衰减轨迹的交叉说明了初始容量与寿命之间的弱关系;和文献里的图略有不同:文献中的图只保留了电池的前1000次循环,这里画出了电池的整个生命周期。
在这里插入图片描述
b : a的详细视图,只显示前100个循环,到100个循环时,还没有出现明显的寿命衰减。
在这里插入图片描述
d : 循环2时的总放电容量与循环寿命对数的相关系数为-0.061。
在这里插入图片描述
e : 循环100时的总放电容量与循环寿命对数的相关系数为0.27(排除寿命最短的电池后为0.08)。这里是文献图的延申:这里画的是循环从1到200时,分别对应的相关系数.
在这里插入图片描述
f : 循环寿命95和100的总放电容量差值和循环寿命对数的相关系数是0.479。
在这里插入图片描述

Fig. 2

b : 124个电池的第100次和第10次循环的放电容量曲线的差值图示,ΔQ100-10(V)。
下图便是论文作者的核心思想:不同循环寿命的电池,容量差不一样。
原始图:

在这里插入图片描述
放电容量差值后的图
在这里插入图片描述
c : 循环寿命的对数和ΔQ100-10(V)的方差的相关系数为-0.93。
在这里插入图片描述

Table 1

‘Variance’ model
和原文一致,测试集上rmse为196,mape为11.4%。

在这里插入图片描述
在这里插入图片描述

思考

本文中同一块电池的工况一直都是保持一致的,实车工况复杂。
实车效果验证周期性太长了。

代码

数据表头:
在这里插入图片描述

import pandas as pd, numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error, mean_absolute_percentage_error
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import json
from sklearn.ensemble import BaggingRegressor
from sklearn import tree
from sklearn import linear_model
from sklearn import svm
from sklearn import neighbors
from sklearn import ensemble
from sklearn import ensemble
from sklearn import ensemble

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

data = pd.read_csv('data/train_Interpolation.csv', header = 0)
x_columns = [x for x in data.columns if x in ['log(Var)']]
# x_columns = [x for x in data.columns if x in ['log(Min)','log(Var)','Skewness','Kurtosis','Q2_sum','maxQ-Q2_sum']]
# x_columns = [x for x in data.columns if x in ['log(Min)','log(Var)','Q2_sum','Average_chargetime_first5',"Integral_Temperature_cycles2_100",'Min_IR_cycles2_100','IR100-IR2_sum','Q50-Q44_sum']]
# x_columns = [x for x in data.columns if x in ['log(Min)','log(Var)','Skewness','Kurtosis','Q2_sum','maxQ-Q2_sum','Average_chargetime_first5',"Integral_Temperature_cycles2_100",'Min_IR_cycles2_100','IR100-IR2_sum','Q50-Q44_sum']]
x_train = data[x_columns].dropna()
y_train = data['log(Cycle Life)'].dropna()

data = pd.read_csv('data/test_Interpolation.csv', header = 0)
x_columns = [x for x in data.columns if x in ['log(Var)']]
x_test = data[x_columns].dropna()
y_test = data['log(Cycle Life)'].dropna()

# 随机划分成训练集和测试集, test_size表示比例(这里训练集:测试集=8:2)
# x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3,shuffle=True)

rf1 = tree.DecisionTreeRegressor()
rf2 = linear_model.LinearRegression()
# rf2=linear_model.Lasso(alpha = 0.0009,fit_intercept=False,warm_start=True)
rf3 = svm.SVR()
rf4 = neighbors.KNeighborsRegressor()
rf5 = ensemble.RandomForestRegressor(n_estimators = 20, max_depth = 5)
rf6 = ensemble.AdaBoostRegressor(n_estimators = 50)
rf7 = ensemble.GradientBoostingRegressor(n_estimators = 100)
rf8 = BaggingRegressor()

rf = rf2.fit(x_train, y_train)

y_train_pred = 10 ** (rf.predict(x_train))
y_test_pred = 10 ** (rf.predict(x_test))
y_train = 10 ** y_train
y_test = 10 ** y_test

print(json.dumps(('训练集RMSE:', mean_squared_error(y_train, y_train_pred) ** 0.5),
                 ensure_ascii = False))
print(json.dumps(('训练集MAPE:', mean_absolute_percentage_error(y_train, y_train_pred) * 100),
                 ensure_ascii = False))

print(json.dumps(('测试集RMSE:', mean_squared_error(y_test, y_test_pred) ** 0.5),
                 ensure_ascii = False))
print(json.dumps(('测试集MAPE:', mean_absolute_percentage_error(y_test, y_test_pred) * 100),
                 ensure_ascii = False))


def plotF(y_train, y_train_pred, y_test, y_test_pred):
    plt.figure(figsize = (10, 5))
    plt.subplot(121)
    plt.plot(np.arange(len(y_train)), y_train, '#20B2AA', label = 'y_train')
    plt.plot(np.arange(len(y_train_pred)), y_train_pred, '#F08080', label = 'y_train_pred')
    plt.legend(loc = 1)
    plt.xlabel('cell')
    plt.ylabel('cycles')
    plt.title('训练集效果评测')

    plt.subplot(122)
    plt.plot(np.arange(len(y_test)), y_test, '#20B2AA', label = 'y_test')
    plt.plot(np.arange(len(y_test)), y_test_pred, '#F08080', label = 'y_test_pred')
    plt.legend(loc = 1)
    plt.xlabel('cell')
    plt.ylabel('cycles')
    plt.title('测试集效果评测')
    plt.show()


def corrF():
    pd.set_option('display.max_columns', None)
    pd.set_option('display.max_rows', None)
    data = pd.read_csv('data/data_Interpolation.csv', header = 0)
    print(data.corr())

附录

数据进一步说明

124块商用LFP/石墨电池,A123 Systems,型号APR18650M1A,标称容量1.1Ah,额定电压为3.3V,制造商推荐的快充协议是3.6C恒定电流-恒定电压 (CC-CV)。

恒温环境室(30°C)中,不同的快速充电条件,相同的放电条件下进行循环,循环寿命从150次到2300次不等。
充电时:采用 "C1(Q1)-C2"的策略,C1和C2分别是第一和第二恒定电流步骤,Q1是电流切换时的充电状态(SOC,%),第二个电流步骤在80%的SOC时结束,此后电池以1C CC-CV充电到3.6V 及C/50的电流截止点。
放电时:4C到2.0V,其中1C为1.1A,先恒流再恒压。
'5.4C(40%)-3.6C’的充电策略如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【精选】JavaScript语法大合集【附代码和超详细介绍以及使用】

JavaScript语法大合集 JavaScript引入到文件 嵌入到HTML文件中 <body><script>var num10;console.log(num);</script> </body>引入本地独立JS文件 <body><script src"./hello.js"></script> </body>引入网络来源…

leetcode:链表的中间结点

1.题目描述 题目链接&#xff1a;876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 我们先看题目描述&#xff1a; 2.解题思路 我们用画图用快慢指针来解决这个问题 定义一个快指针fast&#xff0c;一个慢指针slow 快指针一次走两个结点&#xff0c;慢指针一次…

3GPP协议解读(一)_23.501_23.502_PDU Session_SMF与UDP的交互

UE发起计算服务申请后&#xff0c;网络侧处理的流程 UE发起服务的流程&#xff1a;service request网络侧处理服务涉及的通信数据通过PDU Session进行传输&#xff0c;涉及到SMF与UPF的交互。PDU Session的建立、管理全部由SMF&#xff08;Session Management Function&#x…

Docker与VM虚拟机的区别以及Docker的特点

01、本质上的区别 VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库&#xff0c;然后再安装应用&#xff1b; Container(Docker容器)&#xff0c;在宿主机器、宿主机器操作系统上创建Docker引擎&#xff0c;在引擎的基础上再安装应…

WordPress丸子小程序问题常见解决方案

WordPress丸子小程序问题常见解决方案 下载uniapp&#xff0c;导入项目。修改下图域名为自己的WP博客地址。&#xff08;如下图&#xff09; 发行微信小程序&#xff0c;如果显示不是项目所有者&#xff0c;请重新获取。 重新发行微信小程序&#xff0c;请打开微信开发者工具端…

【leaflet】学习笔记1-4

▒ 目录 ▒ &#x1f6eb; 导读开发环境 1️⃣ 改造greengis的leafletinsCodeinline-module服务器live-server 2️⃣ d1. 初见&#xff1a;Map、TileLayer说明/流程关键代码 3️⃣ d2. 多地图切换&#xff1a;Control.Layers说明/流程关键代码 4️⃣ d3. 标记&#xff1a;Marke…

【Proteus仿真】【51单片机】锂电池管理系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1602显示模块、DS18B20温度传感器、PCF8691 ADC模块、按键、LED蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示温度…

Git-概念与架构

GIT-概念与架构 一、背景和起源二、版本控制系统1.版本控制分类1.1 集中式版本控制1.2 分布式版本控制 2.Git和SVN对比2.1 SVN2.2 GIT 三、GIT框架1.工作区&#xff08;working directory&#xff09;2.暂存区&#xff08;staging area&#xff09;3.本地仓库&#xff08;local…

算法笔记-第五章-大整数运算

算法笔记-第五章-大整数运算 大整数运算大整数比较大整数加法大整数减法大整数乘法大整数乘法2大整数除法 大整数运算 一&#xff1a;使用数组存储整数的时候&#xff0c;整数的高位存储在数组的高位&#xff0c;整数的低位存储 在数组的低位 二&#xff1a;把整数按照字符串读…

除了chatGPT网站外,国内有些可以使用的AI网站 文心一言 讯飞星火 豆包 通义千问 人工智能网站 AI网站

2023年随着人工智能技术的不断发展&#xff0c;AI网站如ChatGPT等越来越受到人们的关注。这些网站具有多种作用&#xff0c;可以帮助人们更方便地获取信息、解决问题&#xff0c;甚至进行创作。 首先&#xff0c;AI网站可以提供智能问答服务。与传统的搜索引擎相比&#xff0c…

DAC实验(DAC 输出三角波实验)(DAC 输出正弦波实验)

DAC 输出三角波实验 本实验我们来学习使用如何让 DAC 输出三角波&#xff0c;DAC 初始化部分还是用 DAC 输出实验 的&#xff0c;所以做本实验的前提是先学习 DAC 输出实验。 使用 DAC 输出三角波&#xff0c;通过 KEY0/KEY1 两个按键&#xff0c;控制 DAC1 的通道 1 输出两种…

Educational Codeforces Round 20 A-E

文章目录 A. Maximal Binary MatrixB. Distances to ZeroC. Maximal GCDD. Magazine AdE. Roma and Poker A. Maximal Binary Matrix 思路&#xff1a;一道很有意思的构造&#xff0c;我们可以发现&#xff0c;按照下述&#xff0c;从外到内进行一层一层的构造一定是最优的。 …

计算机网络———ipv6简解

文章目录 1.前言&#xff1a;2. ipv6简单分析&#xff1a;2.1.地址长度对比2.2. ipv6包头分析2.3. ipv6地址的压缩表示&#xff1a;2.3. NDP&#xff1a;2.4. ipv6地址动态分配&#xff1a; 1.前言&#xff1a; 因特网地址分配组织)宣布将其最2011年2月3日&#xff0c;IANA (In…

LeetCode(25)验证回文串【双指针】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 验证回文串 1.题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&…

Django 配置 Email Admin 详细指南

概要 Django 是一个高级的 Python Web 框架&#xff0c;它鼓励快速开发和清洁、实用的设计。当你正在开发一个 Django 项目时&#xff0c;监控网站的运行情况是非常必要的。Django 提供了一个功能强大的 admin 界面&#xff0c;但同时也可以通过配置 email admin 来获取网站的…

how to find gcc openbug

https://gcc.gnu.org/bugzilla/query.cgi?formatadvanced

决策树,sql考题,30个经典sql题目

大数据&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要学&#x…

C++初阶 | [三] 类和对象(中)

摘要&#xff1a;类的6个默认成员函数&#xff0c;日期类 如果一个类中什么成员都没有&#xff0c;简称为空类。然而&#xff0c;空类并不是什么成员都没有&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成6个默认成员函数。默认成员函数&#xff1a;用户没有显式…

【云原生-Kurbernetes篇】K8s的存储卷/数据卷+PV与PVC

这是一个目录标题 一、Kurbernetes中的存储卷1.1 为什么需要存储卷&#xff1f;1.2 存储卷概述1.2.1 简介1.2.2 volume字段 1.3 常用的存储卷类型1.3.1 emptyDir&#xff08;临时存储卷&#xff09;1.3.2 hostPath&#xff08;节点存储卷&#xff09;1.3.3 nfs1.3.4 cephfs 二、…

为React Ant-Design Table增加字段设置 | 京东云技术团队

最近做的几个项目经常遇到这样的需求&#xff0c;要在表格上增加一个自定义表格字段设置的功能。就是用户可以自己控制那些列需要展示。 在几个项目里都实现了一遍&#xff0c;每个项目的需求又都有点儿不一样&#xff0c;迭代了很多版&#xff0c;所以抽时间把这个功能封装了…