使用CNN-LSTM来预测锂离子电池健康状态SOH(附代码)

news2024/11/27 21:08:01

     对于电动汽车而言,动力锂电池的健康状态(State of Health,SOH)估算方法是电池管理系统中非常重要的一个方面。准确估计锂电池老化状态并预测电池剩余寿命对于电动汽车稳定安全运行有着重要的意义。借助数据驱动方法的思想,本文对锂离子电池寿命历史数据进行分析,通过深度学习方法建立锂电池健康状态评估模型。在模型的选取上,采用长短时记忆循环神经网络(Long short-term memory reccurent neural network LSTM RNN)学习电池的寿命衰减过程,通过迁移学习泛化锂电池SOH评估模型。

     在各种电池特征参数中,电池容量常常被用作表征电池退化的特征。伴随鲤电池充放电循环次数的增加,电池容量会有明显的下降趋势,根据IEEE-1996 标准当电池容量下降到标称容量 80%时,为了保证电池系统安全与稳定运行,建议及时更换新电池。

     尽管理论上循环神经网络可以有效处理时间序列,但随着时间序列的长度增加,网络参数可能会在反向传播的过程中趋近于零或是无穷,这会导致梯度下降或者梯度爆炸,丢失前期的有效信息,从而使得预测准确率下降。因此,出现了一系列改进 RNN 的算法。长短时记忆循环 (LSTM)神经网络就是其中效果较好的一种LSTM 网络通过精妙的门控制将加法运算带入网络中,一定程度上解决了梯度消失的问题。只能说一定程度上,过长的序列还是会出现“梯度消失”,所以 LSTM 叫长一点的“短时记忆”。如图1所示为LSTM单元的结构图。

图1 LSTM单元的结构图

与基础的RNN 所不同的是,LSTM 通过添加复杂的“门”结构来实现过滤几余信息的作用。用于输入信息的叫做“输入门”,用于遗忘的门叫做“遗忘门”,控制输出的叫“输出门”。通过这三个门的逻辑控制单元,LSTM 可以有效决定是否更新或是遗弃某些信息,从而某种程度上克服了容易产生梯度消失和爆炸的缺点。

下面介绍如何使用代码来实现LSTM预测锂离子电池的SOH。

1.首先是程序运行的环境搭建。

举个例子,就比如下面代码的第二行,matplotlib是一个Python的绘图库,它可与 NumPy 一起使用,可以代替Matlab使用。可以将数据进行可视化,使数据更直观。由于其是第三方库,所以需要安装才可以使用。

from SOH_func_scaler import *
import matplotlib.pyplot as pl
from tensorflow import summary as sm
from tensorflow import keras
from keras import models, layers
from keras.callbacks import ModelCheckpoint
from keras.callbacks import TensorBoard
import datetime
import os

2.将图2的电池数据导入,分别将数据赋值给变量FILE_00、FILE_01、FILE_02、FILE_03、FILE_04、FILE_05、FILE_06。同时初始化均方根误差RMSE、绝对误差的平均值MAE、以及迭代次数epoch_index。其中电池数据是以.csv格式保存的,部分数据如图3(有密集恐惧症的可自动忽略该图)所示。其中包括:充电_ _容量(ah),放电容量(ah),累计_容量(ah)、充电_能量(wh)、放电_能量(wh),累计_能量(wh),库仑_ _能量效率(%)、效率(%)、最大_电压(v)、充电_最终电压(v),放电_最终电压(v),单位充电容量(ah / g)、单位放电容量(ah / g)

VERSION = 'Epochs' # 수정

FILE_00 = 'data_csv/CYCLE_CSV_data00.csv'
FILE_01 = 'data_csv/CYCLE_CSV_data01.csv'
FILE_02 = 'data_csv/CYCLE_CSV_data02.csv'
FILE_03 = 'data_csv/CYCLE_CSV_data03.csv'
FILE_04 = 'data_csv/CYCLE_CSV_data04.csv'
FILE_05 = 'data_csv/CYCLE_CSV_data05.csv'
FILE_06 = 'data_csv/CYCLE_CSV_data06.csv'
    
RMSE_ = {}
MAE_ = {}
epoch_index = 0

 图2 电池数据

 图3 电池部分数据(有密集恐惧症的可自动忽略)

3.将上述数据分配至x、y坐标,分配至x坐标的有序号、cycle、累计容量、累计能源、库仑效率、能量效率、最大电压、最终充电电压、单位充电容量、放电最终电压、单位放电容量。

y坐标为:序号、cycle、充电号码容量、累计容量、能源、充电放电能源、累计_能源、库仑效率、能源效率、最大电压、最终电压、充电放电最终电压、单位充电容量、放电最终电压、单位放电容量。

第三行就是参数的设置:如窗口数设置为3,迭代次数设置为1000次,

接着就是使用try except语句来检测一段代码是否出现的异常并将异常信号进行输出。

drop_labels_x = ['序号', 'cycle', '累计_容量(ah)', '累计_能源(wh)', '库仑_ _效率(%)', '能源效率(%)', '最大_电压(v)', '最终充电电压(v)', '单位_ _充电容量(ah / g)', '放电最终电压(v)', '单位_ _放电容量(ah / g)']
drop_labels_y = [‘序号”、“cycle”、“充电_ _号码容量(ah)”、“累计_容量(ah)”、“_能源(wh)”、“充电放电_能源(wh)”、“累计_能源(wh)”、“库仑_ _效率(%)”、“能源效率(%)”、“最大_电压(v)”、“_最终电压(v)”、“充电放电_最终电压(v)”、“单位_ _充电容量(ah / g)”、“放电最终电压(v)”、“单位_ _放电容量(ah / g)”]

param = {'seq_len' : 20, 'num_units' : 32, 'num_filters' : 128, 'window' : 3, 'dropout': 0.2, 'num_epochs' : 1000, 'num_dense': 16}

log_dir = f"logs/{VERSION}/" + datetime.datetime.now().strftime("%Y%m%d-%H%M") + f'-{param["num_filters"]}FL-{param["num_units"]}UN-{param["num_epochs"]}EP-{param["seq_len"]}SQ'
file_path = f'Checkpoints\{VERSION}\SOH_Checkpoint\{param["num_filters"]}FL-{param["num_units"]}UN-{param["num_epochs"]}EP-{param["seq_len"]}SQ\{datetime.datetime.now().strftime("%Y%m%d-%H%M%S")}.h5'
hist_freq = 250

save_path = f'outputs\{VERSION}\{param["num_filters"]}FL-{param["num_units"]}UN-{param["num_epochs"]}EP-{param["seq_len"]}SQ'
try:
    if not os.path.exists(save_path):
        os.makedirs(save_path)
except OSError:
    print('Error Creating Directory...')

4.使用get_data函数来读取csv数据,并返回数据(最多2D)和data_y (1D),数据正则化0~1。相当于MATLAB的plot函数。绘图结果如图4所示。

data00, data_cap00 = get_data(FILE_00, drop_labels_x, drop_labels_y)
# data01, data_cap01 = get_data(FILE_01, drop_labels_x, drop_labels_y)
data02, data_cap02 = get_data(FILE_02, drop_labels_x, drop_labels_y)
data04, data_cap04 = get_data(FILE_05, drop_labels_x, drop_labels_y)
data_test, data_cap_test = get_data(FILE_04, drop_labels_x, drop_labels_y)

 5.使用LSTM神经网络进行训练数据的代码如下:训练的一些参数如图5所示:

x_train00 = seq_gen_x(data00, param['seq_len'])
y_train00 = seq_gen_y(data_cap00, param['seq_len'])
# x_train01 = seq_gen_x(data01, param['seq_len'])
# y_train01 = seq_gen_y(data_cap01, param['seq_len'])
x_train02 = seq_gen_x(data02, param['seq_len'])
y_train02 = seq_gen_y(data_cap02, param['seq_len'])
x_train04 = seq_gen_x(data04, param['seq_len'])
y_train04 = seq_gen_y(data_cap04, param['seq_len'])
x_test = seq_gen_x(data_test, param['seq_len'])
y_test = seq_gen_y(data_cap_test, param['seq_len'])
print(x_train00.shape)
print(y_train00.shape)
# print(x_train00[0:5, :, 1])
# print(y_train00[:4])
inputs = layers.Input(shape=(param['seq_len'], x_train00.shape[-1]), name = 'Inputs')
x1 = layers.Conv1D(param['num_filters'], param['window'], padding='causal', name = 'Conv1D')(inputs)
x2 = layers.LSTM(param['num_units'], return_sequences = True, name = 'LSTM_sequence')(inputs)
x = layers.concatenate([x2, x1])
x = layers.LSTM(16, name = 'LSTM_add')(x)
x = layers.Dropout(param['dropout'], name = 'Dropout')(x)
outputs = layers.Dense(1, name = 'Outputs')(x)
model = models.Model(inputs = inputs, outputs = outputs, name = 'CNN_LSTM_PARALLEL')
model.compile(loss = 'mse', optimizer = 'Adam')
model.summary()
BATCH_SIZE = 128
callback_list = [ModelCheckpoint(filepath = file_path, monitor = 'val_loss', save_best_only = True),
                 TensorBoard(log_dir=log_dir, histogram_freq=hist_freq)]
fitdata = model.fit(x_train00, y_train00, epochs=param['num_epochs'], verbose = 2, batch_size=BATCH_SIZE, validation_split=0.2, callbacks=callback_list)
# callback_list = [ModelCheckpoint(filepath = file_path, monitor = 'val_loss', save_best_only = True),
#                  TensorBoard(log_dir=log_dir, histogram_freq=hist_freq)]
# fitdata = model.fit(x_train01, y_train01, epochs=param['num_epochs'], verbose = 2, batch_size=BATCH_SIZE, validation_split=0.2, callbacks=callback_list)
callback_list = [ModelCheckpoint(filepath = file_path, monitor = 'val_loss', save_best_only = True),
                 TensorBoard(log_dir=log_dir, histogram_freq=hist_freq)]
fitdata = model.fit(x_train02, y_train02, epochs=param['num_epochs'], verbose = 2, batch_size=BATCH_SIZE, validation_split=0.2, callbacks=callback_list)
callback_list = [ModelCheckpoint(filepath = file_path, monitor = 'val_loss', save_best_only = True),
                 TensorBoard(log_dir=log_dir, histogram_freq=hist_freq)]
fitdata = model.fit(x_train04, y_train04, epochs=param['num_epochs'], verbose = 2, batch_size=BATCH_SIZE, validation_split=0.2, callbacks=callback_list)

 图5

6.结果及绘图:最后的训练对比图如图7所示,训练的误差如图8所示:

pl.figure(dpi=150)
line = pl.plot(Error_rate)
pl.ylim(-10, 10)
pl.ylabel('SOH Error (%)')
pl.xlabel('Cycles')
pl.setp(line, color='b', linewidth=0.5)
pl.savefig(f'{output_path}\\ErrRate-RMSE({RMSE:.4f})MAE({MAE:.4f}).png')
pl.show()
print(f'RMSE({RMSE:.6f}), MAE({MAE:.6f})')

图7 LSTM预测SOH对比

图8 LSTM神经网络预测误差 

 预测的结果:RMSE=0.006097,MAE=0.05406

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

 

 

 

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

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

相关文章

【案例实战】SpringBoot整合EasyExcel实现列表导出功能

这篇文章会给大家实操一个关于列表导出成excel表格的功能,相信大家在日常工作中也会遇到列表导出的需求,看完本篇文章那么你就可以轻松的去整合列表导出的功能。 本次使用的导出工具是阿里巴巴开源的EasyExcel,关于EasyExcel我这里简单的介绍…

Nacos使用详解

一、部署nacos 1、方式一(一般的windows和linux部署) 需要的nacos-server-1.4.1文件:https://download.csdn.net/download/yueyue763184/87822434?spm1001.2014.3001.5503 一般的nacos部署方式教程:https://blog.csdn.net/yue…

敲代码都两年半了,还不会用SDL、C语言rap一个推箱子?

前言 欢迎来到小K的SDL专栏第三小节,本节将为大家带来小项目~C语言SDL版坤坤推箱子详细讲解,这里也为大家上传了源码和图片资源,需要的自取看完以后,希望对你有所帮助 ✨效果如下 文章目录 前言一、推箱子思路讲解二、加SDL绘图代…

离散系统函数零积点分析

离散系统函数零积点分析 在 Matlab中,系统函数的零极点就可以通过函数 roots 得到。 函数的零极点也可以通过函数 tf2zp 获得,其调用格式为:[Z, P, K] tf2zp(B, A),函数 tf2zp 可以将H(z)的有理分式转换为零极点增益形式&#…

WEB端唤起 百度|腾讯|高德 地图一键导航功能

WEB端唤起 百度|腾讯|高德 地图一键导航功能 目录 腾讯地图: 百度地图: 高德地图: 坐标拾取器: 腾讯地图: 极简写法: https://3gimg.qq.com/lightmap/v1/marker/index.html?markercoord:纬度,经度;t…

工业设备状态监测:振动常见原因分析

在工业生产中,设备的正常运行和可靠性对于保障生产效率和安全至关重要。然而,工业设备在运行过程中常常会出现振动现象,这可能是由于多种原因导致的。 根据设备劣化趋势P-F曲线我们可以知道,振动信号监测是状态监测过程中可以被快…

Markdown编辑器 测试

测试一下TOC 你好Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支…

MongoDB的应用

目录 一、MongoDb是什么 1.特点 2.功能 3.基本的指令 二、MongoDB的使用场景 1.适用场合 2.常见应用场景 三、可能遇到的问题 1.MongoDB是否支持事务? 2.MongoDB大数据迁移怎么做? 3.MongoDB的水平扩展是什么原理? 4.MongoDB出现负…

Jenkins UI与接口自动化测试持续集成实战

篇幅较长,要耐心阅读哦~ 基础知识简要回顾 持续集成、持续交付的好处与产生的必然性Jenkins服务的搭建方法Jenkins节点管理与用户权限Jenkins插件Jenkins父子多任务关联运行Jenkins报警机制 目录 SeleniumUI自动化测试持续集成演练接口自动化测试持续集成演练 …

采埃孚-4D毫米波雷达拆解分析

采埃孚4D毫米波雷达拆解分析 4D毫米波雷达具有4个维度的信息,分别是距离、速度、方向角和高度。下面分析采埃孚再飞凡汽车上的4D毫米波雷达。 4D毫米波雷达共由四部分组成,分别为:数字接口板及结构件、屏蔽罩、发射单元及PCB以及雷达天线罩…

如何在 Linux、Windows 和 Mac 上查找 WiFi 密码?

无线网络已成为我们日常生活中不可或缺的一部分,我们经常需要连接各种WiFi网络。但是,有时我们可能会忘记自己的WiFi密码,或者需要连接到一个以前连接过的网络。在这种情况下,我们可以使用一些方法来查找已连接网络的密码。 本文将…

研报精选230526

目录 【行业230526山西证券】有色金属行业周报:锂价强势反弹回30万元or吨 【行业230526开源证券】食品饮料行业投资策略:消费复苏贯穿全年,结构分化择机布局 【行业230526德邦证券】核电行业深度系列报告:积极安全有序发展核电&am…

8-JDBC 编程

目录 1.数据库编程的必备条件 PS:程序是怎么操作数据库的? 2.什么是JDBC? 2.1.JDBC定义 2.2.JDBC工作原理 3.JDBC使用 3.1.创建项目并添加MySQL驱动包 3.2.使用代码操作数据库 3.2.1.获得数据源 3.2.2.获得连接 3.2.3.获得执行器 …

软考A计划-2022年11月软件设计师下午真题及答案解析

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

【云原生|Kubernetes】06-Pod的生命周期和重启策略

【云原生|Kubernetes】06-Pod的生命周期和重启策略 文章目录 【云原生|Kubernetes】06-Pod的生命周期和重启策略Pod生命周期生命周期Pod的状态Pod子状态 Pod重启策略调试PodPod 停滞在 Pending 状态Pod 停滞在 Waiting 状态Pod 处于 Crashing 或别的不健康状态Pod 处于 Running…

【LeetCode热题100】打卡第4天:寻找两个正序数组的中位数

文章目录 寻找两个正序数组的中位数⛅前言🔒题目🔑题解 寻找两个正序数组的中位数 ⛅前言 大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏! 精选 100 道力扣(LeetCode)上最热门的…

89.qt qml-WorkerScript多线程使用(无需C++代码)

由于我们自定义Table中需要实现排序,如下图所示: 考虑到如果数据量太大的情况,为了避免主线程阻塞,所以我们添加多线程排序功能,为了方便大家更好学习qml组件,所以学习WorkerScript实现多线程,无需C++ 1.描述 使用 WorkerScript 在新线程中运行操作。这对于在后台运行操…

微信小程序为什么不用HTML5、CSS,自己搞了个WXML、WXSS,很多框架用不了,好处一点不知道?

你在小程序中需要使用HTML5、 CSS来创建页面,那么你一定会碰到一些问题,比如: 1.小程序中的布局没有 JS支持,没有 JS渲染逻辑。 2.没有内置 css,都是靠 JS自己实现的。 3.很多框架不能使用,比如&#xf…

5年华为外包,外包究竟怎么样....

最近身边很多人进了外包或者被问到进到外包公司怎么样,感觉大家对外包公司不是很了解,也有一些误解,我们看看过来人怎么说。 5年外包时光 我曾是华为外包软件测试员工,就职于东莞松山湖,2017年9月12号入职&#xff0c…

ARM--计算机基础知识

目录 一.Linux层次结构 谈谈对嵌入式的理解 三层: 应用层 内核层 硬件层 二、计算机的进制 三、计算机的组成 1.输入设备 2.输出设备 3.存储器 4.运算器 5.控制器 总线 四、ARM存储模型 1. Cache:高速缓冲存储器 2. 主存储器:相当于内存 …