电池的故障预测和健康管理PHM是为了保障设备或系统的稳定运行,提供参考的电池健康管理信息,从而提醒决策者及时更换电源设备。不难发现,PHM的核心问题就是确定电池的健康状态,并预测电池剩余使用寿命。但是锂电池的退化过程影响因素众多,不仅受其本身工作模式的影响,外部环境的压力、温度等都会影响锂电池的退化。这些影响因素之间的相互耦合,导致锂电池的退化表现出很强的非线性及不确定性,这给SOH估计和RUL预测带来了很大的困难。
该项目代码较简单,主要包括Capacity predict,RUL predict,Trends predic,以Capacity predict为例,首先加载模块。
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torch.utils.data import DataLoader, TensorDataset
import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
Debug = False
模型定义
# 定义LSTM模型
class LSTMModel(nn.Module):
def __init__(self, conv_input, input_size, hidden_size, num_layers, output_size):
super(LSTMModel, self).__init__()
self.conv=nn.Conv1d(conv_input,conv_input,1)
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True, bidirectional=True).to(device)
#self.fc1 = nn.Linear(hidden_size*2, hidden_size*2)
self.fc = nn.Linear(hidden_size, output_size)
self.num_layers = num_layers
self.hidden_dim = hidden_size
self.dropout = nn.Dropout(p=0.3)
def forward(self, x):
x=self.conv(x)
h0 = torch.randn((self.num_layers, x.shape[0], self.hidden_dim)).to(device) # 初始化隐藏状态
c0 = torch.randn((self.num_layers, x.shape[0], self.hidden_dim)).to(device) # 初始化细胞状态
output, _ = self.lstm(x,(h0,c0))
output = self.dropout(output)
output = self.fc(output[:, -1, :])
return output
导入数据
# 创建一个空列表来存储读取的 DataFrames
dataframes_Cap = []
dataframes_EIS = []
# 使用循环读取文件并分配名称
for i in range(1, 9):
# 构建文件名
file_name_cap= f"Capacity_data/Data_Capacity_25C{i:02}.txt"
file_name_EIS = f"EIS_data/EIS_state_V_25C{i:02}.txt" # 使用状态V
if not os.path.isfile(file_name_cap):
print(f"Cap文件 {file_name_cap} 不存在,跳过...")
continue
elif not os.path.isfile(file_name_EIS):
print(f"EIS文件 {file_name_EIS} 不存在,跳过...")
continue
# 读取文件并添加到列表
df_cap = pd.read_csv(file_name_cap, sep="\t")
df_EIS = pd.read_csv(file_name_EIS, sep="\t")
#print(df_cap.columns)
if i == 1 or i==5:
cap_number = 3
else:
cap_number = 5
#剔除表现不佳的电池
if i == 4 or i == 8:
continue
cycle = []
cap = []
eis = []
cycle_max = df_cap[df_cap.columns[1]].max()
cycle_max2 = df_EIS[df_EIS.columns[1]].max()
cycle_number = min(cycle_max,cycle_max2)
max_scale = df_cap[df_cap[df_cap.columns[1]]==0][df_cap.columns[cap_number]][:].max()
for i in range(1,int(cycle_number)+1):
temp = df_cap[df_cap[df_cap.columns[1]]==i][df_cap.columns[c