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

文献思想

作者发现不同循环寿命的电池,第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.mfbz.cn/a/154869.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第四代管网水位监测仪:管网水位监测仪效果怎么样?

随着我国城市化进程的推进,随之而来的是城市规模不断扩大,各类排水管网设施需要检查的范围也日益扩大。尽管市政管理部门已安排人员定期巡查,但仍无法对井下水位进行24小时实时监控。如遇管网阻塞、窨井满溢等情况,若不及时处理将…

Jenkins-Windows节点-参数传入中文乱码的问题

方法一 设置环境变量 变量名:JAVA_TOOL_OPTIONS 变量值:-Dfile.encodingUTF8 还是有部分中文会乱码,进行区域设置

NewStarCTF2023 Reverse方向Week3 ez_chal WP

分析 题目&#xff1a;ez_chal 一个XTEA加密&#xff0c; V6是key&#xff0c;v5是输入&#xff0c;然后v7就是密文。 看了v6&#xff0c;要用动调。 ELF文件用ida的远程调试。 然后在kali上输入长度为32的flag 全部转换成dd 再提取密文。 EXP #include <stdio.h>…

使用阿里云Logstash,从自建es6.2.4迁移数据至云ES7.10测试

一、购买阿里云Logstash服务 4C16G 40G 高效云盘 二、配置管道 2.1 配置启动管道前置工作 logstash要通源端ES网络及http端口,且加白logstash要通目标端ES网络及http端口,且加白目标端ES加配置自动创建索引配置管道前先安装 logstash-output-file_extend插件目标云ES7.10要…

计算机组成原理——第一章

早期冯诺依曼机&#xff1a; 现代计算机&#xff1a; 五大部分&#xff1a; 1. 输入设备&#xff0c;是指将外部信息以计算机能读懂的方式输入进来&#xff0c;如键盘&#xff0c;鼠标等 2.输出设备&#xff0c;就是将计算机处理的信息以人所能接受的方式输出出来&#xff0c;比…

《C++避坑神器·二十二》VS能正常运行程序,但运行exe程序无响应解决办法

原因是某个文件只是放在了项目路径下&#xff0c;没有放在exe路径下&#xff0c;比如Json文件原来只放在了mlx项目下&#xff0c;导致VS可以运行&#xff0c;但运行exe无响应或报错如下&#xff1a; 两种方式修改&#xff1a; 1、把Json文件拷贝一份放到exe路径下 2、利用生成…

企业版远程软件推荐

在当今的数字时代&#xff0c;为您的企业配备远程访问功能至关重要。通过远程访问&#xff0c;您的团队可以在办公室外工作&#xff0c;并且无论身在何处都可以保持相同的生产力水平。在本文中&#xff0c;我们汇总了市场上的四大选择。 我们在远程访问解决方案中寻找什么 远…

为什么要用kubernetes?

第一章 kubernetes介绍 本章节主要介绍应用程序在服务器上部署方式演变以及kubernetes的概念、组件和工作原理。 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物…

freeRTOS--任务通知

一、什么是任务通知 使用任务通知可以替换二值信号量、计数信号量、事件标志组&#xff0c;可以替代长度为1的队列&#xff0c;任务通知速度更快、使用的RAM更少。 任务通知值的更新方式&#xff1a; 发消息给任务&#xff0c;如果有通知未读&#xff0c;不覆盖通知值。发消…

UE5 - ArchvizExplorer - 数字孪生城市模板 -学习笔记(一)

1、学习资料 https://www.unrealengine.com/marketplace/zh-CN/product/archviz-explorer https://karldetroit.com/archviz-explorer-documentation/ 官网下载的是一个简单版&#xff0c;需要下载扩展&#xff0c;并拷贝到项目录下&#xff0c;才有完整版 https://drive.googl…

FileNotFoundError: Could not find module ‘XXX\lib\site-packages\llvmlite

https://aka.ms/vs/17/release/vc_redist.x64.exe 解决方法:安装c环境 FileNotFoundError: Could not find module xxx\workenv\lib\site-packages\llvmlite\binding\llvmlite.dll (or one of its dependencies). Try using the full path with constructor syntax. 装了个新…

NSS [SWPUCTF 2022 新生赛]1z_unserialize

NSS [SWPUCTF 2022 新生赛]1z_unserialize 我敲&#xff0c;报恩题&#xff01; 直接用构造方法构造POC更改$lt和$lly <?php class lyh{public $lt;public $lly;function __construct(){$this->lt"system";$this->lly"tac /flag";} } $a new…

Redis的发布和订阅

Redis发布订阅(pub/sub)是一种消息通信模式&#xff1a;发送者(pub)发送消息&#xff0c;订阅者(sub)接收消息。 Redis客户端可以订阅任意数量的频道。 举例说明&#xff0c;我们创建两个Redis客户端&#xff1a; 客户端1订阅channel1频道&#xff1a; 客户端2给channel1发送消…

ROS Turtlebot3多机器人编队导航仿真

文章目录 前言一、Gzazebo中加载多台Turtlebot3机器人二、RVIZ中加载多个Turtlebot3机器人三.多机器人编队导航总结 前言 前面已经实现了在gazebo仿真环境中机器人一字型编队、三角形编队、N字型编队等仿真&#xff0c;接下来考虑多机器人编队在编队行进过程中的避障问题&…

PON网络是什么

上节介绍到PON网络概念&#xff0c;PON网络具备节省局端光缆资源、避免故障点的同时&#xff0c;还具备拥有更远的传输距离、更高的带宽以及分光特性&#xff08;P2MP&#xff09;的优势。 PON&#xff08;无源光纤网络&#xff0c;Passive Optical Network&#xff09;网络&am…

uniapp 微信小程序分享功能 onShareAppMessage(options)

一、背景 在微信小程序中需要完成转发分享功能&#xff0c;接收人未登录小程序情况下&#xff0c;在微信上打开不用强制登录&#xff0c;可以查看部分分享的内容&#xff1b;如果用户要查看更多内容&#xff0c;可以点击【查看全部】按钮&#xff0c;触发登录逻辑&#xff0c;…

CodeMeter软件保护及授权管理解决方案(一)

概述 CodeMeter是德国威步&#xff08;Wibu-Systems AG&#xff09;2004年1月推出的软件加密及授权管理综合解决方案&#xff0c;用于软件保护实现防盗版、软件授权管理实现软件货币化、以及数据加密实现数字资产保护。 使用CodeMeter综合解决方案&#xff0c;可以实现以下价…

【开源】基于Vue和SpringBoot的用户画像活动推荐系统

项目编号&#xff1a; S 061 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S061&#xff0c;文末获取源码。} 项目编号&#xff1a;S061&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活…

Linux Control Cgroups

无论 Docker 如何进行隔离&#xff0c;无法否认的是我们在当前宿主机中运行的所有容器&#xff0c;它依赖的硬件资源都只是当前机器。 其实启动的每一个容器进程&#xff0c;它本身其实就是当前宿主机的进程之一&#xff0c;那么本质上来说&#xff0c;它也会和宿主机中的其他…
最新文章