赞
踩
由于新能源汽车的高速发展,对电池的相关研究越发重 要。然而电池 SOC 不能直接进行测量,只能通过电池的电压、电流、温度等参数来进行估算,而这些参数还会受到电池老化、环境温度变化及汽车行驶状态等多种不确定因素的影响,因此准确的 SOC 估计已成为电动汽车发展中急需解决的问题。
为了研究影响 SOC 值的因素,对数据集进行一定的分析后,分别针对车辆处于静止、运动、充电三种状态进行了深入的研究。
特征 | 说明 |
---|---|
time | 数据时间 |
velocity | 车速 km/h |
SoC | SOC |
voltage | 总电压V |
current | 总电流A |
maximum voltage | 最高电池值 |
minimum voltage | 最低电池值 |
max. tem. | 最高温度 |
min. tem. | 最低温度 |
voltage of ES | 可充电储能装置电压 |
current of ES | 可充电储能装置电流 |
cell num. | 电池总数 |
cell vol. | 单体电池电压列表 |
tem. | 可充电储能装置温度探针个数 |
tem. of ES | 可充电储能装置温度值 |
绘制热力图
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.stats import pearsonr import seaborn as sn pd.set_option('display.max_rows', None) # 数据显示所有的行 pd.set_option('display.max_columns', None) # 数据显示所有列 # 读取数据 csv_name = './data/velocity_SOC.csv' with open(csv_name) as csvfile: csv_data = pd.read_csv(csvfile, header=1) # header=1默然不读取表头 #print(csv_data.head()) # 统计列缺失值 print(csv_data.isnull().sum()) # 统计行缺失值 print('一共有{}行有缺失值'.format(csv_data.isnull().any(axis=1).sum())) csv_data.dropna(inplace=True) print('一共有{}行有缺失值'.format(csv_data.isnull().any(axis=1).sum())) # 获取特征名 feature_names=list(csv_data.columns.values) feature_names.remove('数据时间') feature_names.remove('电池总数') feature_names.remove('可充电储能装置温度探针个数') feature_names.remove('可充电储能装置温度值') feature_names.remove('单体电池电压列表') data=csv_data.loc[:,feature_names] # 求解pearson相关系数 corr = np.corrcoef(data.values.T) print(corr) # 图的准备 plt.figure(figsize=(12,12)) plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.rcParams['axes.unicode_minus']=False sn.heatmap(corr, cbar=True, square=True, xticklabels=feature_names, yticklabels=feature_names, fmt='.2f', annot=True) plt.show()
可以看出,总电压和可充电储能装置电压、总电流和可充电储能电流之间的相关性都为1,对于相关性特别高的特征,只需要其中任意一个即可。在这里我选取了总电压和总电流进行分析。另外对于|相关性|<0.5的特征不予考虑。
绘制SOC和速度随着时间变化的曲线图
import pandas as pd import numpy as np import matplotlib.pyplot as plt pd.set_option('display.max_rows', None) # 数据显示所有的行 pd.set_option('display.max_columns', None) # 数据显示所有列 csv_name = '../data/velocity_SOC.csv' with open(csv_name) as csvfile: data = pd.read_csv(csvfile, header=1) # header=1默然不读取表头 data.dropna(inplace=True) len = data.shape[0] plt.figure() plt.xticks(range(1, len, 50), rotation=10) plt.plot(data['数据时间'], data['车速 km/h'], label='velocity') plt.plot(data['数据时间'], data['SOC'], label='SOC') plt.legend() plt.show()
仔细观察,发现速度和SOC的变化并没有明显的规律,而且从上面的热力图看出他们的相关性为0.17。但是如果分段观察,可以看出数据中的电动车处于静止、运动、充电三种状态。那么分别针对三种状态,我们是否可以建立不同的模型呢?
为了进一步研究,接下来我将对数据做以下处理:
1.对数据集进行一个处理,剔除掉没有用的特征。
2.根据速度,将数据集分别拆分成静止、运动、充电三个部分。
3.针对每个部分,重新研究变量之间的相关性,并且提出问题。
不难看出,可以发现以下规律:
1.静止状态下SOC与总电压、最高电池值、最小电池值、最大温度、最小温度相关性较高;
2.总电压与SOC、电流、最高电池值、最小电池值、最大温度、最小温度相关性较高;
3.电流与总电压、最高电池值、最小电池值相关性较高;
…
因此在静止状态下,可以根据一些特征高效的预测出SOC的值。
import pandas as pd import numpy as np import matplotlib.pyplot as plt pd.set_option('display.max_rows', None) # 数据显示所有的行 pd.set_option('display.max_columns', None) # 数据显示所有列 data = pd.read_csv('../data/static.csv', header=1, encoding='gbk') data.dropna(inplace=True) len = data.shape[0] data.dropna(inplace=True) len = data.shape[0] plt.figure() plt.subplot(121) plt.xticks(range(1, len, 20)) plt.plot(data['数据时间'], data['SOC']) plt.xlabel('time') plt.ylabel('SOC') plt.show()
在静止状态下,SOC值会随着时间而进行衰减,处于亏电的状态,我们可以取一段连续的时间,在理想的状态下,计算SOC的衰减速率。当然这里也可以正对不同的室外环境进一步的拓展,比如温度。
plt.figure()
plt.xticks(range(1, len, 20))
plt.plot(data['数据时间'], data['SOC'], label='SOC')
plt.plot(data['数据时间'], data['最高温度值'], label='max. tem.')
plt.plot(data['数据时间'], data['最低温度值'], label='min. tem.')
plt.xlabel('time')
plt.ylabel('SOC')
plt.legend()
plt.show()
在静止状态下,SOC值与最高最低温度呈现相反的趋势。可以很容易发现,SOC值越大,温度越低,SOC值越小,温度越大。
plt.figure()
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2=ax1.twinx()
plt.xticks(range(1, len, 20))
plt.xticks(range(1, len, 20))
ax1.set_xticklabels(labels = range(1, len, 20))
ax2.set_xticklabels(labels = range(1, len, 20))
ax1.plot(data['数据时间'], data['总电压 V'], label='voltage', c='r')
ax2.plot(data['数据时间'], data['最高电池值'], label='maximum voltage', c='b')
ax2.plot(data['数据时间'], data['最低电池值'], label='minimum voltage', c='orange')
ax1.set_ylabel('voltage')
ax2.set_ylabel('maxOrmin voltage')
plt.legend()
plt.show()
通过查找资料,电动汽车的总电压是由电池组中的每个单体串联得到的,可以通过最高电池值和最低电池值建立模型,对总电压进行预测。但是,当某个单体损坏,预测会出现一定的误差。另外我们也可以通过判断最高电池值和最低电池值的差值来判断电池的健康状态。
不难看出,可以发现以下规律:
1.运动状态下SOC与最大温度、最小温度相关性较高;
2.速度与总电压、最小电池值相关性较高;
3.总电压与总的电流、最高电池值、最小电池值相关性较高;
…
因此在运动状态下,我们只需要根据最大温度和最小温度就能对SOC进行预测分析。
plt.figure() fig = plt.figure() ax1 = fig.add_subplot(211) ax2=ax1.twinx() ax1.plot(range(len), data['总电压 V'], label='voltage', c='r') ax2.plot(range(len), data['车速 km/h'], label='velocity', c='b') ax1.set_ylabel('voltage') ax2.set_ylabel('velocity') plt.legend() ax3 = fig.add_subplot(212) ax4=ax3.twinx() ax3.plot(range(len), data['车速 km/h'], label='velocity', c='r') ax4.plot(range(len), data['最低电池值'], label='mininum voltage') ax3.set_ylabel('velocity') ax4.set_ylabel('mininum voltage') plt.legend() plt.show()
当速度变化剧烈的时候,总电压和最小电池值变化的范围也比较大。当速度上升时,总电压和最小电池值呈现一种下降的趋势。因此可以通过总电压和最小电池值对速度进行回归预测。
plt.figure()
plt.xticks(range(1, len, 40))
plt.plot(range(len), data['车速 km/h'], label='velocity')
plt.plot(range(len), data['SOC'], label='SOC')
plt.legend()
plt.show()
在车辆行驶的状态下,SOC的值在缓慢下降。但是我们观察SOC的曲线,可以发现几个“小山峰”,这里主要是因为电动汽车有回馈制动,刹车的时候动能转成成电能,所以在车辆行驶过程中有长下坡的时候,SOC值可能会增加。
另外我们可以通过曲线与横坐标围成的面积计算在某一段时间内车辆行驶的里程与SOC变化的关系,相当于百公里的耗电量。当然这里的计算值还跟路况、天气等原因相关。
不难看出,可以发现以下规律:
1.充电状态下SOC与总电压、最小电池值、最大电池值、总电流、最大温度、最小温度相关性较高;
2.总电压与SOC、最小电池值、最大电池值、总电流、最大温度、最小温度相关性较高;
…
仔细观察,我们会发现在充电状态下,各特征之间的相关性都非常高,这对于SOC的预测来说,准确性会很高,但也有可能会出现过拟合的现象。
plt.figure()
plt.xticks(range(1, len, 15))
plt.plot(data['数据时间'], data['SOC'], "ro-")
plt.title('predict_charge_SOC')
plt.xlabel('time')
plt.ylabel('SOC')
plt.show()
很显然,在充电状态下,SOC值与时间呈现线性关系。那么,我们可以根据公式y=kx+b,预测出充满电需要多长时间。
1.针对电动汽车的三种状态,我们可以对数据添加标签,训练模型用于判断电动汽车的一个状态。
2.分别针对电动汽车的静止、运动、充电三种状态进行分析,发现SOC值在不同状态下与其他特征相关性有所不同。但是他们都有一个共性,与最小温度和最高温度的相关性都能达到-0.98。反之,我们可以根据SOC值对最大最小温度进行预测,计算出在不同SOC值下温度的一个安全范围。接下来我将根据不同状态对SOC值进行预测,保证模型的准确性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。