2023年数维杯数学建模B题节能列车运行控制优化策略求解全过程文档及程序

2023年数维杯数学建模

B题 节能列车运行控制优化策略

原题再现:

  在城市交通电气化进程快速推进的同时,与之相应的能耗增长和负面效应也在迅速增加。城市轨道交通中的快速增长的能耗给城轨交通的可持续性发展带来负担。2018 年,北京、上海、广州地铁负荷占全市总负荷的 1.5%-2.5%,成为了城市电网的最大单体负荷[1]。在“双碳”政策下,城轨系统换用 ATO 驾驶模式、光伏+地铁等方法都取得了较好的减碳节能效果。城轨系统的需求侧响应可以在保证乘客满意度的情况下降低牵引能耗成本[2],可进一步发掘城轨系统减碳节能的潜力。
  在列车运行过程中,列车与外界会产生各种摩擦,进而消耗列车牵引的能量。列车运行过程中,被考虑的因素较多,如列车与轨道的摩擦、列车受到的空气阻力、列车势能的变化、列车运行过程中的位置限速等。在同一段旅途中,列车使用不同的驾驶策略通常会产生不同的能量和时间的消耗。单列车在两个站台之间的运行过程如图一所示。
在这里插入图片描述
  问题1
  假设一辆列车在水平轨道上运行,从站台A运行至站台B,其间距为5144.7m,运行的速度上限为100km/h,列车质量为176.3t,列车旋转部件惯性的旋转质量因数p= 1.08,列车电机的最大牵引力为310KN,机械制动部件的最大制动力为760KN。列车受到的阻力满足Davis阻力方程f = 2.0895 + 0.0098v + 0.006v^2,该公式中的速度单位为m/s,阻力单位为KN。
  你如何通过建模方法编写程序以获得列车运行过程的速度-距离曲线、牵引制动力-距离曲线、时间-距离曲线与能量消耗-距离曲线?程序的运行时间是多长?需要获取列车以最短时间到达站台B、在最短运行时间上分别增加10s、20s、50s、150s、300s到达站台B总共六组曲线。
  在列车运行的实际情况中,需要考虑的因素更多,模型也更加复杂。列车运行的旅途中不同的路段的限速是不同的,旅途中亦有不同的坡度情况,电机的动态特性也更加复杂,此外,储能装置在列车节能领域有着重要的应用,列车制动时,会将一定比例的能量储存至储能装置中,以待后续使用。如图二所示。
在这里插入图片描述
  本赛题提供两个附件。从 XEQ 站至 SMKXY 站的路况数据与包含电机牵引/制动动态特性的列车相关参数数据。介绍如下:
  附件一:从 XEQ 站至 SMKXY 站的路况数据(xls 格式),其包含 XEQ 站到 SMKXY站的路途中的坡度变化信息以及限速变化信息。详情见附件一.xls。
在这里插入图片描述
  附件二:附件二介绍了电机的动态特性与参数并给出了静态电机牵引率与制动再生率。详情见附件二.docx。
  问题 2
  考虑附件一、二的路况信息以及电机的复杂动态过程。若列车计划运行时间为 T,请你设计优化方案得到可行的速度轨迹,使得运行过程的能耗降低(越低越好)。参照问题一,获取列车以最短时间到达站台 B、在最短运行时间上分别增加 10s、20s、50s、150s、300s 到达站台 B 总共六组曲线。
  列车在运行过程中可能会出现各种突发情况导致列车需要提前到达站台或延时到达站台。列车的运行速度轨迹需要根据新的到站时间而发生变化。

  问题 3。
  列车从起点出发,原计划于 320s 后到达终点,列车运行至 2000m 位置时,由于前方突发事故,需要延迟 60s 到达终点。请你设计优化方案在保持列车节能运行下,能够快速地(越快越好)得到调整后的优化速度轨迹。作出列车运行过程的速度-距离曲线、牵引制动力-距离曲线、时间-距离曲线与能量消耗-距离曲线。

整体求解过程概述(摘要)

  针对问题一,以城市轨道交通电气化进程中能耗增长为背景,以欧拉数值法为基础,建立了模拟列车运行过程的动力学模型。通过考虑列车与轨道的摩擦、空气阻力、势能变化以及位置限速等因素,获取列车的速度-距离曲线、牵引力制动力-距离曲线、时间-距离曲线以及能量消耗-距离曲线。在模型中,我们考虑运行在水平轨道上的列车,通过给定站台 A 到站台 B 的距离、速度上限、列车质量、旋转部件惯性质量因数、列车电机最大牵引力和机械制动部件最大制动力,设定初始条件、定义微分方程,利用欧拉数值法进行迭代更新,得到了列车的运行状态。根据程序模拟运行结果,可观察到列车在不同路段内的速度变化、牵引制动力的变化、运行时间以及能量消耗。此外,还模拟运行在不同时间限制下列车到达站台 B 的情况,得到了六组曲线数据。
  针对问题二,在对列车运行过程建立的动力学模型的基础上,可以使用粒子群优化算法来求解列车在给定路段上的最优速度轨迹。为了保证安全性和节能减排目标,在目标函数中我们将能耗消耗作为约束条件,并且根据路段坡度信息对最大速度进行限制。在粒子群算法中,通过计算该速度轨迹的能耗消耗来确定各个速度的适应度。为了更加准确地估计列车的能耗,我们需要考虑列车运行过程中的变速运动。通过计算列车在不同速度下的牵引功率和制动功率,在满足最大牵引力和最大制动力的情况下,确定列车在每个时间段内的加速度和制动度。然后,根据牵引功率和制动功率计算每个时间段的能耗,最终求得整段路程的总能耗。
  针对问题三,介绍了两种优化方法解决问题三:建立速度曲线进行算法优化、采用分阶段求解路程和遗传算法。同时需要根据实时情况进行动态调整和优化,以确保列车安全、节能、快速地到达终点站。

问题分析:

  问题一的分析
  对问题 1 研究的意义的分析:问题 1 属于列车运行过程的数学建模问题。通过建立数学模型,可以获得列车在不同条件下的运行速度、牵引制动力、时间和能量消耗等曲线。这有助于了解列车在不同情况下的性能表现,为优化列车运行提供依据。
  对于解决此类问题一般数学方法的分析:针对列车运行过程中的速度、牵引制动力、时间和能量消耗等变化,我们可以使用数值方法进行建模和求解。其中,欧拉数值法是一种常用的数值方法,适用于对微分方程进行数值近似求解。
  对题目中所给数据特点的分析:附件中给出了列车在水平轨道上的运行数据,包括列车间距、速度上限、列车质量、惯性旋转质量因数、最大牵引力、最大制动力以及阻力方程。这些数据反映了列车运行过程中的关键参数和限制条件,是建立数学模型的基础。
  对问题 1 的题目要求进行分析:问题 1 要求通过建模方法编写程序,获得列车最短运行时间下的速度-距离曲线、牵引制动力-距离曲线、时间-距离曲线和能量消耗-距离曲线,以及程序的运行时间。这些曲线能够描述列车在不同位置的运行状态和能耗情况,有助于评估列车的性能和效率。此外,还需获取列车以最短时间到达站台 B、在最短运行时间上分别增加 10s、20s、50s、150s、300s 到达站台 B 总共六组曲线。
  由于以上原因,我们首先建立一个基于欧拉数值法的数学模型 I,模拟列车在理想条件下的运行过程。然后,建立一个模型 II,通过调整运行时间来观察对应的速度-距离曲线、牵引制动力-距离曲线、时间-距离曲线和能量消耗-距离曲线的变化。最后,将模型 I 和模型 II 的结果进行比较,分析不同条件下列车的运行情况和能耗差异。
   问题二的分析
  对问题 2 研究的意义的分析:问题 2 属于列车运行过程的数学建模问题。通过建立数学模型,以路况信息及复杂动态过程为问题一的约束条件,来获得列车可行的运行轨迹、牵引制动力、时间和能量消耗等曲线。这有助于了解列车在不同情况下的性能表现,为优化列车运行提供依据。对于解决此类问题一般数学方法的分析:针对列车运行过程中的速度、牵引制动力、时间和能量消耗等变化,我们可以使用粒子群优化算法来设计一条能耗最小的速度轨迹,并根据路况信息和列车动态特性进行相应的限制和调整,以达到行驶安全和经济的目的。
  对题目中所给数据特点的分析:附件中给出了列车从XEQ 站到SMKXY站的路途中的坡度变化信息以及限速变化信息和电机的动态特性。其中,列车的质量和运行距离是确定的,而坡度信息决定速度上限、电机的恒转矩区和弱磁区则反映了列车加速度和减速度的范围;阻力则决定了列车运行过程中所受到的衰减力大小。
  对问题 2 的题目要求进行分析:问题 2 要求通过建模方法编写程序,以获得列车在给定运行时间 T 下能耗最低的可行速度轨迹,并生成牵引制动力-距离曲线、时间-距离曲线和能量消耗-距离曲线,以及程序的运行时间。这些曲线可以用于描述列车在不同位置的运行状态和能耗情况,进而评估列车的性能和效率。此外,还需要获取列车以最短时间到达站台 B 的曲线,以及在最短运行时间上分别增加 10s、20s、50s、150s、300s 到达站台 B 总共六组曲线,以探索速度轨迹变化对列车能耗的影响。
  为达成以上目标,我们首先需要在设计速度轨迹时,考虑列车的加速度和减速度限制,以保证列车的安全性和运行效率。同时,还需考虑列车行驶路段的坡度、阻力等因素,以优化能耗表现。然后,通过数值计算方法,可以对列车在不同速度下的能耗进行计算,并选择最小能耗的轨迹方案。最后,在得到初步的结果后,需要对速度轨迹进行进一步检验和优化,以满足列车的安全性和运行效率等要求。此外,还需根据题目要求获取列车在不同速度轨迹下到达站台 B 的曲线,以探索速度轨迹变化对列车能耗的影响。

模型假设:

  1. 假设问题一中,站点之间的坡度为 0,列车做的是直线运动;
  2. 假设牵引力和制动力产生的时间忽略不计,也即列车可在瞬间达到最大牵引力和最大制动力;
  3. 忽略空气阻力和摩擦力;
  4. 列车匀速运动时,F阻力 = F牵引力
  5. 假设列车在某个固定长度的间隔内,所受的阻力恒定,阻力值为该间隔内初始速度的对应值。

论文缩略图:

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

程序代码:

列车加速阶段的求解模型:

import math
import pandas as pd
import time
start_time = time . time () # 记 录 代 码 开 始 时 间
# 列车质量
mass = 176300 # kg
# 列 车 加 速 度 阶 段 的 牵 引 力
traction_force = 33369 # N
# 列 车 速 度 上 限
velocity_limit = 27.8 # m / s
# 列 车 阻 力 公 式 参 数
k1 = 2.0895
k2 = 0.0098
k3 = 0.006
# 列 车 加 速 度 阶 段 的 数 量 ( 小段数 )
num_segments = 1000
# 列 车 站 点 间 的 总 距 离
total_distance = 5144.7 # m
# 列 车 在 每 个 小 段 内 的 长 度
segment_length = total_distance / num_segments # m
# 初始 化 变量
distance_traveled = 0
velocity = 0
elapsed_time = 0 # 修 改 变 量 名 为 elapsed_time
# 存 储 每 一 小 段 的 距 离 、 速度 、 时间
data = []
# 开 始 模 拟 列 车 运 动
for i in range ( num_segments ):
# 当 前 小 段 的 起 始 速 度
initial_velocity = velocity
# 计 算 当 前 小 段 内 的 阻 力
resistance = ( k1 + k2 * velocity + k3 * velocity ** 2) * 1000
# 计 算 当 前 小 段 内 的 加 速 度
acceleration = ( traction_force - resistance ) / mass
# 计 算 当 前 小 段 内 的 末 速 度
final_velocity = math . sqrt ( initial_velocity ** 2 + 2 * acceleration * segment_length )
t = ( final_velocity - initial_velocity ) / acceleration
# 如 果 末 速 度 超 过 速 度 上 限 , 则 以 速 度 上 限 为 准
if final_velocity > velocity_limit :
final_velocity = velocity_limit
# 更 新 列 车 的 距 离 和 速 度
distance_traveled += segment_length
velocity = final_velocity
# 累 加 时 间 并 将 其 添 加 到 列 表 中
elapsed_time += t
data . append ([ distance_traveled , velocity , elapsed_time ])
# 如 果 列 车 达 到 速 度 上 限 , 结 束 运 动 模 拟
if velocity >= velocity_limit :
break
# 将 数 据 转 换 为 DataFrame 格式
df = pd . DataFrame ( data , columns =[ 'Distance ', 'Velocity ', 'Time '])
# 获 取 时 间 的 累 加 值
df [' Time_cumsum '] = df ['Time ']. cumsum ()
# 将数 据 写入 Excel 表格中
df . to_excel ('p1 - aacc +10. xlsx ', sheet_name ='Sheet1 ', index = False )
print (" 列车 在 运行 %.2f 米 的 距 离 后 达 到 速 度 上 限 %.2 f m/s" % ( distance_traveled , velocity_limit ))
print (" 达 到 速 度 上 限 所 需 的 时 间 为 %.2f 秒" % elapsed_time )
end_time = time . time () # 记 录 代 码 结 束 时 间
execution_time = end_time - start_time # 计 算 代 码 运 行 时 间
print (" 代 码 运 行 时 间 为 %.2f 秒" % execution_time )

列车减速阶段的求解模型:

import math
import pandas as pd
# 列车质量
mass = 176300 # kg
# 列 车 初 始 速 度
initial_velocity = 27.8 # m / s
# 列 车 终 点 速 度
final_velocity = 0 # m / s
# 列车 制 动力
braking_force = 27629 # N
# 列 车 站 点 间 的 距 离
distance = 5144.7 # m
num_segments = 1000
# 每 个 小 段 的 长 度
segment_length = distance / 1000 # m
# 列 车 当 前 速 度
velocity = initial_velocity # m / s
# 列 车 运 行 距 离
total_distance = 0 # m
# 列 车 运 行 时 间
total_time = 0 # s
# 创建空的 DataFrame , 用 于 保 存 数 据
df = pd . DataFrame ( columns =[" 距离 (m)", " 速度 (m/s)", " 时间 (s)"])
# 逐 个 小 段 计 算 列 车 运 行 距 离 和 时 间 , 直 到 速 度 降 为 0
for i in range ( num_segments ):
# 当 前 小 段 开 始 速 度
segment_initial_velocity = velocity
# 计 算 当 前 小 段 的 阻 力
resistance = (2.0895 + 0.0098 * velocity + 0.006 * velocity ** 2) * 1000
# N
# 计 算 当 前 小 段 的 减 速 度
acceleration = ( braking_force + resistance ) / mass # m / s ^2
# # 计 算 当 前 小 段 内 的 末 速 度
# final_velocity = math . sqrt ( segment_initial_velocity ** 2 - 2 * acceleration * segment_length )
# 计 算 当 前 小 段 内 的 末 速 度
temp = segment_initial_velocity ** 2 - 2 * acceleration * segment_length
if temp < 0:
final_velocity = 0
else :
final_velocity = math . sqrt ( temp )
# 计 算 当 前 小 段 的 运 行 时 间
segment_time = ( velocity - final_velocity ) / acceleration # s
# 如 果 末 速 度 超 过 速 度 上 限 , 则 以 速 度 上 限 为 准
if final_velocity < 0:
final_velocity = 0
# # 计 算 当 前 小 段 的 运 行 距 离
# segment_distance = velocity * segment_time - 0.5 * acceleration * segment_time ** 2
# m
# 更 新 列 车 当 前 速 度
velocity -= acceleration * segment_time
# 更 新 列 车 总 运 行 距 离
total_distance += segment_length
# 更 新 列 车 总 运 行 时 间
total_time += segment_time
# 将 当 前 小 段 的 数 据 保 存 到 DataFrame 中
df . loc [ i ] = [ segment_length , velocity , segment_time ]
# 输 出 当 前 小 段 的 距 离 、 速 度 和时 间
print ("第 {} 小段 : 距离 {:.2 f} 米 , 速度 {:.2 f} 米/秒 , 时间 {:.2 f} 秒". format ( i +1 , segment_length , velocity , segment_time ))
# 如 果 速 度 已 经 降 为 0, 则 跳 出循 环
if final_velocity <= 0:
break
# 计 算 每 个 小 段 的 累 计 距 离 , 速 度和 时 间
df [" 总距离 (m)"] = df [" 距离 (m)"]. cumsum ()
df [" 总速度 (m/s)"] = df [" 速度 (m/s)"]. cumsum ()
df [" 总时间 (s)"] = df [" 时间 (s)"]. cumsum ()
# 将 DataFrame 保存到 Excel 文件中
filename = "p1 -de. xlsx "
with pd . ExcelWriter ( filename ) as writer :
df . to_excel ( writer , index = False )
# 输出结果
print (" 列车 在 运行 %.2 f 米 的 距 离 时 速 度 降 为 0。" % total_distance )
print (" 速度降为 0 时 所 需 的 时 间 为 %.2 f 秒 。" % total_time 

列车速度运行轨迹的求解模型:

import math
distance = 5144.7 # 距离 , 单位为米
speed_limit = 100 # 速度上限 , 单位为 km / h
mass = 176.3 # 质量 , 单位为吨
inertia_factor = 1.08 # 旋 转 惯 量 因 子
max_traction_force = 310 # 最大 牵 引力 , 单位为 kN
max_brake_force = 760 # 最大 制 动力 , 单位为 kN
# 计算 Davis 阻力
def davis_friction ( v ):
v_ms = v / 3.6 # 将速度从 km / h 转换为 m / s
return 2.0895 + 0.0098* v_ms + 0.006* v_ms **2
# 计 算 列 车 受 到 的 总 阻 力
def total_friction ( v ):
return davis_friction ( v ) * mass * 9.8
# 计 算 列 车 加 速 度
def acceleration ( v ):
net_traction_force = max_traction_force - total_friction ( v )
return net_traction_force / mass
# 计 算 列 车 制 动 加 速 度
def brake_acceleration ( v ):
return max_brake_force / mass
# 计 算 列 车 能 耗
def energy_consumption (v , a ):
return total_friction ( v ) * v / 1000 + mass * ( inertia_factor /2) * ( a /(9.8*1000))**2 * distance
def Force ( final_velocity ):
traction_force = (310000 * 10) / final_velocity # 计 算 弱 磁 区 的 力
back_force = (760000 * 17) / final_velocity # 计 算 弱 磁 区 的 力
return traction_force , back_force
# 在 速 度 上 限 内 遍 历 所 有 速 度 , 找 到 最 小 的 能 耗 值 和 对 应 速 度
min_energy = math . inf
for v in range (1 , speed_limit + 1):
a = acceleration ( v )
energy = energy_consumption (v , a )
if energy < min_energy :
min_energy = energy
optimal_v = v
print (" The optimal speed is % dkm /h, and the minimum energy consumption is %.2 fkWh ." % ( optimal_v , min_energy ))
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西工大 ASLP 实验室在 WeNet 中开源基于 CPPN 的神经网络热词增强语音识别方案

语境偏置&#xff08;Contextual biasing&#xff09;旨在将语境知识集成到语音识别&#xff08;ASR&#xff09;系统中&#xff0c;以提高在相关领域词汇&#xff08;俗称“热词”&#xff09;上的识别准确率。在许多ASR场景中&#xff0c;待识别语音中可能会包含训练数据中数…

windows10系统下Python3.11中安装Numpy库教程

Python3.11中安装Numpy库目录 项目场景&#xff1a;问题描述解决方案&#xff1a;①下载Numpy文件②把NumPy文件放到Python安装的Scripts文件夹里。③安装numpy④安装验证 项目场景&#xff1a; numpy是开源的数值计算扩展&#xff0c;用于数据分析、机器学习、科学计算的重要…

pgzrun 拼图游戏制作过程详解(3)

3. 绘制完整的拼图 建立Gird列表存储小拼图的基本信息 Gird[] for i in range(6):for j in range(4):SquareActor("girl_06")Square.leftSquare_size*jSquare.topSquare_size*iGird.append(Square) 修改draw()绘制函数 建立循环绘制Gird列表中的所有小拼图 def d…

开源大模型ChatGLM2-6B 1. 租一台GPU服务器测试下

0. 环境 租用了1台GPU服务器&#xff0c;系统 ubuntu20&#xff0c;GeForce RTX 3090 24G。过程略。本人测试了ai-galaxy的&#xff0c;今天发现网友也有推荐autodl的。 &#xff08;GPU服务器已经关闭&#xff0c;因此这些信息已经失效&#xff09; SSH地址&#xff1a;* 端…

虚拟机作为master远程控制台式机中的机器人在仿真环境中进行slam地图构建与自主导航

文章目录 前言一、思路流程二、具体步骤1.虚拟机网络配置2.台式机网络配置3.网络测试 三、远程操控SLAM建立地图三、远程操控SLAM导航 前言 虚拟机作为master远程控制台式机中的机器人在仿真环境中进行slam地图构建与自主导航 最近有时间一直在搞Ubuntu虚拟机与台式机的通讯&…

Java复习-多线程编程

多线程编程 解决并发访问的问题。 一. 继承 Thread 类实现多线程 1. 继承实现 继承thread类 class MyThread extends Thread{}覆写run主方法 多线程要执行的功能都应该在 run() 方法中定义。 class MyThread extends Thread { // 线程的主体类private String title;public…

澄海区图书馆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

澄海区图书馆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

2022年全国研究生数学建模竞赛华为杯D题PISA架构芯片资源排布问题求解全过程文档及程序

2022年全国研究生数学建模竞赛华为杯 D题 PISA架构芯片资源排布问题 原题再现&#xff1a; 一、背景介绍 芯片是电子行业的基础&#xff0c;在当前日益复杂的国际形势下&#xff0c;芯片成了各个大国必争的高科技技术。本课题关注网络通信领域的交换芯片&#xff0c;传统的交…

华为云云耀云服务器L实例评测|使用Linux系统与Docker部署.net/c#项目

目录 前言 如何在CentOS运行项目 登录CentOS 使用Rider打包 使用Visual Studio打包 项目运行 后台运行 开放端口 如何在Docker中运行项目 项目运行 前言 本章详细介绍&#xff0c;.net Core项目从打包到部署上华为云云耀云服务器L实例的过程与一些细节问题。在这里…

解决stable diffusion webui1.6 wd1.4 tagger加载失败的问题

由于webui源码的变化&#xff0c;需要修改两个地方的import 1.tagger/ui.py # 第十行 # from webui import wrap_gradio_gpu_call # 原代码 from modules.call_queue import wrap_gradio_gpu_call1.preload.py # 第4行开始 # from modules.shared import models_path # 原…

每日一博 - 闲聊经典微服务架构

文章目录 概述Arch小结 概述 典型的微服务架构是一种软件架构模式&#xff0c;其中一个应用程序被拆分成多个小型、相对独立的服务单元&#xff0c;每个服务单元都专注于执行特定的业务功能。这些服务单元可以独立开发、部署和扩展&#xff0c;通常通过网络通信协议进行互相通…

docker 部署 node.js(express) 服务

1、在 express 项目根目录下新增 Dockerfile 文件&#xff0c;内容如下&#xff1a; 创建服务容器的方法&#xff0c;可以根据自己的情况选择&#xff1a; 1、以下示例为宿主机没有安装 node 环境的写法&#xff1b; 2、先在本地构建包含 node 和 express 的基础镜像&#xff0…