1.车辆剩余续驶里程的定义

  定义:电动汽车行驶过程中,从电池当前状态当完全放电状态,车辆能够行驶的距离。车辆剩余续驶里程主要由剩余可用能量和汽车未来能耗两个因素决定。在前面的研究中,我们可用利用安培积分法、速度对时间积分、KNN回归预测等方法准确预测出SOC,结合电压就可以估算出电池可用能量。车辆自身质量、结构及其零件的性能、电机效率、电池内阻消耗、胎压、造型这些因素都会对车辆的行驶阻力造成影响,继而影响车辆的行驶能耗。另外不同的驾驶员对车辆内部的需求不同,其中空调的使用对电动汽车的能耗有着较为明显的影响。
  我们很难根据现有的数据预测出汽车的能耗,因此采用基于过去一段时间的平均能耗估计未来行驶的平均能耗的方法来计算电动汽车的平均能耗。

2.电动汽车平均能耗的计算方法

2.1电池可用能量的定义


  利用SOC与放电电压曲线围成的面积来表示电池的可用能量。

2.2SOC与电压的线性表达式

  从前面的研究可以知道,在车辆行驶状态下总电压和SOC之间相关性能够达到0.96以上,建立线性模型,求解出权重w和偏执b。

with open(csv_name) as csvfile:csv_data = pd.read_csv(csvfile)  # header=1默然不读取表头csv_data.dropna(inplace=True)  # 删除SOC为缺失值的行csv_data.reset_index(drop=True, inplace=True)
ls = []
for i in range(csv_data.shape[0]):# 防止出现噪点if csv_data['充电状态'][i] == 3 and csv_data['累计里程'][i] != None and csv_data['总电压'][i] >= 500:ls.append(i)# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(csv_data.iloc[ls, 6:7], csv_data.iloc[ls, 9:10],train_size=0.95, random_state=6)lineModel = LinearRegression()
lineModel.fit(x_test, y_test)
a1 = lineModel.coef_[0][0]
b = lineModel.intercept_[0]
print("SoC=%.4f*S%.4f" % (a1, b))
print("得分", lineModel.score(x_train, y_train))
plt.scatter(x_train, y_train)
plt.plot(x_train, lineModel.predict(x_train), c='red')
plt.xlabel('U')
plt.ylabel('SOC')
plt.show()


  计算得出w=1.0233、b=-507.0399,测试集评分为0.8913,因此只需要根据电动汽车两种状态下的总电压就可以估算出电池的SOC,进而求出电池所消耗的能量。

2.3电动汽车平均功耗定义

  根据公式P=E/S就能够定义出电动汽车的平均功耗。

ls = []
ls_son = []
for i in range(csv_data.shape[0]):if csv_data['充电状态'][i] == 3 and csv_data['累计里程'][i] != None:ls_son.append(i)elif csv_data['充电状态'][i] == 1:if len(ls_son) > 100:ls.append(ls_son)ls_son = []res_ls = []
w = 1.0233
b = -507.0399
for index in ls:data = csv_data.iloc[index, :]# 积分法# ans = trapz(data['总电压'].tolist(), data['SOC'].tolist(), dx=0.001) / (#             data['累计里程'].tolist()[-1] - data['累计里程'].tolist()[0])# 求解围成的面积s = (data['总电压'].tolist()[-1] - data['总电压'].tolist()[0]) * ((w * data['总电压'].tolist()[-1] - b)- (w * data['总电压'].tolist()[0] - b)) / 2res_ls.append(abs(s))plt.scatter(range(len(res_ls)), res_ls, c='r')
plt.xlabel('sample')
plt.ylabel('energy_consumption')
plt.show()


  采用积分法结果如下所示

3.方法改进

3.1续驶里程估计

  直接利用SOC代表电池的可用能量,根据公式s=(soc1-soc2)/p就可用计算出电动汽车的续驶里程。

csv_name = 'C:\\Users\\刘志军\Desktop\\科研\\2021数字汽车大赛创新组赛题数据Part2\\vin2=LVCB4L4D0HM002829\\part-00367-741da358-7624-4bb4-806b-835c106c6b2d.c000.csv'
with open(csv_name) as csvfile:csv_data = pd.read_csv(csvfile)  # header=1默然不读取表头csv_data.dropna(inplace=True, subset=['SOC', '总电压'])  # 删除SOC为缺失值的行csv_data.reset_index(drop=True, inplace=True)
ls = []
ls_son = []
for i in range(csv_data.shape[0]):if csv_data['充电状态'][i] == 3 and csv_data['累计里程'][i] != None:if np.isnan(csv_data['累计里程'][i]):continuels_son.append(i)elif csv_data['充电状态'][i] == 1:if len(ls_son) > 300:ls.append(ls_son)ls_son = []
res_ls = []
for index in ls:data = csv_data.iloc[index, :]ans =(data['SOC'].tolist()[0]-data['SOC'].tolist()[-1])/(data['累计里程'].tolist()[-1] - data['累计里程'].tolist()[0])res_ls.append(abs(ans))
print(np.mean(res_ls))
plt.plot(range(len(res_ls)), res_ls, c='r')
plt.xlabel('sample')
plt.ylabel('energy_consumption')
plt.show()


  可以很容易看出,电动汽车的一个平均功耗在0.75到1.75之间,将平均功耗代入计算公式中,可以估计续驶里程的范围。

csv_name = 'C:\\Users\\刘志军\Desktop\\科研\\2021数字汽车大赛创新组赛题数据Part2\\vin2=LVCB4L4D0HM002829\\part-00367-741da358-7624-4bb4-806b-835c106c6b2d.c000.csv'
with open(csv_name) as csvfile:csv_data = pd.read_csv(csvfile)  # header=1默然不读取表头csv_data.dropna(inplace=True, subset=['SOC', '总电压'])  # 删除SOC为缺失值的行csv_data.reset_index(drop=True, inplace=True)ls = []
ls_son = []
for i in range(csv_data.shape[0]):if csv_data['充电状态'][i] == 3 and csv_data['累计里程'][i] != None:if np.isnan(csv_data['累计里程'][i]):continuels_son.append(i)elif csv_data['充电状态'][i] == 1:if len(ls_son) > 300:ls.append(ls_son)ls_son = []
for index in ls[0:1]:data = csv_data.iloc[index, :]data.reset_index(drop=True, inplace=True)data['累计里程'] = abs(data['累计里程'] - data['累计里程'].tolist()[-1])s1 = []s2 = []for i in range(len(index)):s1.append(float(data['SOC'].tolist()[i] - data['SOC'].tolist()[-1]) / 0.75)s2.append(float(data['SOC'].tolist()[i] - data['SOC'].tolist()[-1]) / 1.75)plt.plot(range(data.shape[0]), data['累计里程'], c='r', label='true')plt.plot(range(data.shape[0]), s1, c='b', label='max')plt.plot(range(data.shape[0]), s2, c='g', label='min')plt.xlabel('time')plt.ylabel('distance')plt.legend()plt.show()





3.2续驶里程和总电压的关系

with open(csv_name) as csvfile:csv_data = pd.read_csv(csvfile)  # header=1默然不读取表头csv_data.dropna(inplace=True, subset=['SOC', '总电压'])  # 删除SOC为缺失值的行csv_data.reset_index(drop=True, inplace=True)ls = []
ls_son = []
for i in range(csv_data.shape[0]):if csv_data['充电状态'][i] == 3 and csv_data['累计里程'][i] != None:if np.isnan(csv_data['累计里程'][i]):continuels_son.append(i)elif csv_data['充电状态'][i] == 1:if len(ls_son) > 300:ls.append(ls_son)ls_son = []
corr_list= []
for index in ls:data = csv_data.iloc[index, :]data.reset_index(drop=True, inplace=True)data['累计里程'] = abs(data['累计里程'] - data['累计里程'].tolist()[-1])correlation = data['累计里程'].corr(data['总电压'])corr_list.append(correlation)plt.plot(range(len(corr_list)), corr_list)
plt.xlabel('sample')
plt.ylabel('correlation')
plt.title('u&mileage correlation')
plt.show()


  很明显,基本上每一个周期中总电流和续驶里程之间相关性很高,则假设他们之间存在某种关系。

3.3基于KNN算法对续驶里程进行回归预测

  根据前面得到的最大估计里程、最小估计里程、总电压对电动汽车真实的续航里程进行估计

data=pd.read_csv('../data/mile.csv', header=1)
x = data.iloc[:, 0:3]
y = data.iloc[:, 3:]
# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8, random_state=6)
# 标准化处理
x_stand = StandardScaler()
x_train = x_stand.fit_transform(x_train)
x_test = x_stand.transform(x_test)
# 超参数
params = {'n_neighbors': [k for k in range(3, 18)],'weights': ['uniform', 'distance'],'p': [ps for ps in range(2, 8)]
}
kr = KNeighborsRegressor()
# 网格搜索--获取最优参数以及最好的比分
grid_knn = GridSearchCV(estimator=kr, param_grid=params, cv=10)
grid_knn.fit(x_train, y_train)
print('最优参数:', grid_knn.best_params_)
print('最优算法:', grid_knn.best_estimator_)
print('最优评分:', grid_knn.best_score_)
print('测试集评分:', grid_knn.score(x_test, y_test))

  网格搜索后找到最佳参数k=17,对模型进行训练。

kr = KNeighborsRegressor(n_neighbors=17)
kr.fit(x_train, y_train)
y_pre = kr.predict(x_test)
mse = np.sqrt(mean_squared_error(y_test, y_pre))
print('均方误差:', mse)
print('测试集评分:', r2_score(y_test, y_pre))
x_index = [i for i in range(x_test.shape[0])]
print(x_index)
plt.figure()
plt.title('predict mileage')
plt.plot(x_index[1000:1200], y_test[1000:1200], c='r', label="True value")
plt.plot(x_index[1000:1200], y_pre[1000:1200], c='g', label="Predict value")
plt.xlabel('sample')
plt.ylabel('mileage')
plt.legend(loc="best")
plt.show()

  训练后得到均方误差为2.44,R2为0.945,截取部分测试集绘图发现,真实值和预测值基本吻合,整个模型的效果还是比较可以。

4.扩展

  对平均能耗进行滤波处理后,发现其类似一条平滑的曲线,是否可以依据时间进行分类分析?

基于机器学习算法对电动汽车能耗估计相关推荐

  1. 基于机器学习算法对电动汽车续驶里程进行估计

    1.概论   本文主要通过采集大量的数据,通过对数据进行处理分析,发现SOC和总电压是影响续驶里程的主要原因.从线性关系出发,建立了SOC.总电压和续驶里程的多元线性回归.为了提高模型的准确性,将线性 ...

  2. 基于机器学习算法的慢性肾病危险因素预测

    摘 要 慢性肾脏病(CKD)患者逐年增加,心血管疾病作为其最主要的并发症,决定着CKD患者的预后.尽管目前临床医师已经对CKD患者进行了相对全面的检查,并已经使用药物对心脏功能进行早期的干预性治疗,但 ...

  3. R语言基于机器学习算法进行特征筛选(Feature Selection)

    R语言基于机器学习算法进行特征筛选(Feature Selection) 对一个学习任务来说,给定属性集,有些属性很有用,另一些则可能没什么用.这里的属性即称为"特征"(featu ...

  4. [当人工智能遇上安全] 5.基于机器学习算法的主机恶意代码识别研究

    您或许知道,作者后续分享网络安全的文章会越来越少.但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个<当人工智能遇上安全>系列博客,详细介绍人工智能与安全相关的论文. ...

  5. MATLAB代码:基于蒙特卡洛算法的电动汽车充电负荷预测 关键词:蒙特卡洛 电动汽车 充电负荷预测

    MATLAB代码:基于蒙特卡洛算法的电动汽车充电负荷预测 关键词:蒙特卡洛 电动汽车 充电负荷预测 仿真平台:MATLAB 主要内容:代码主要做的是电动汽车的充电负荷模拟预测,具体为:从影响电动汽车充 ...

  6. 程序设计-在校整理-07 基于机器学习算法的DGA域名识别(NB、XGboost、MLP初探)

    [在校整理-07 基于机器学习算法的DGA域名识别(NB.XGboost.MLP初探)](注:仅供参考学习使用) 一.课题内容和要求 二.理论基础 2.1 DGA域名生成算法 2.2 DGA算法原理 ...

  7. [量化学院]价值选股策略——基于机器学习算法

    文献回顾 回顾价值策略 价值策略通俗地讲就是买入便宜股票,卖出昂贵股票,思想非常简单和直观.但是实际操作上这非常困难,因为我们没办法直接观察股票的真实价值.投资者可以从不同的视角采用不同的指标来估计股 ...

  8. 基于机器学习算法的LTE高投诉小区预判方法

    摘要:将用户投诉映射到网络性能问题,并利用机器学习算法建立 4G KPI 与用户投诉之间的关联,构造基于网络性能指标的用户投诉预警模型.以用户感知层面的大数据分析结论为抓手,提升网络优化和网络运维的质 ...

  9. m基于机器学习MLP的OFDM信道估计误码率matlab仿真,对比LS和MMSE两种信道估计算法

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 信道估计器是接收机一个很重要的组成部分.在OFDM系统中,信道估计器的设计上要有两个问题:一是导频信 ...

最新文章

  1. Docker部署Jmeter 性能监控服务(常用命令)
  2. centos7 tomcat8 配置 java web环境 熵池不够大 启动慢问题
  3. yii2地址多级联动
  4. mysql受影响的行 0_为什么更新/删除成功时受影响的行返回0?
  5. java - springmvc整合cxf发布webservice
  6. Android圆角图片封装类--copy别人的,不能转载,我也就醉了,谢谢原创
  7. better-scroll在vue中的使用
  8. UVA 12299 - RMQ with Shifts 线段树
  9. Phoenix使用注意事项以及跟标准sql的不同
  10. PhotoShop的10大误区
  11. 中兴新支点操作系统上两个方便的小工具
  12. WRITE_ONCE READ_ONCE 函数的介绍与使用
  13. 手机流量充值 php代码,流量充值异步通知示例代码
  14. android obb权限,解决部分手机读取obb失败的问题
  15. Why-How-What黄金圈法则 的理解和运用
  16. BGP路由选路与负载
  17. Scala中下划线“_“的应用场景
  18. parquet压缩格式参数设置以及简单操作
  19. 帝国EmpireCMS7.5最新后台漏洞审计
  20. 利用geth创建私有链

热门文章

  1. win10下解决编译环境find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer
  2. Abaqus用python读取.odb文件
  3. php+mysql系统网站,PHP+MYSQL 网址导航系统开源 网站分类目录管理系统
  4. CSS中的块级元素、行内元素和行内块元素
  5. Generative Adversarial Networks(CGAN、CycleGAN、CoGAN)
  6. vb.net 窗体接收键盘事件_不用100就能够买到全键盘的无线键鼠套装,双飞燕FG1010魅力依旧...
  7. 数据库-订单发票表(单表)
  8. 避免重要数据泄露的8种方式
  9. 计算机考试打字题遇到字母怎么办,手把手为你解决win10系统打字时莫名其妙出现字母的解决方法...
  10. 使用浏览器抓包获取API