python 编程ATP曲线的实现。给定最大速度200km/h, 求速度 距离的曲线。应用牛顿第二定律,以及ATP 对应的GEBR曲线的点,分别求出list_all[[0],[1],[2],[3]] 。根据点画图曲线。
对应公式:
程序代码如下:python3.6编写 可直接运行,保存的点为excel表格
# -*- coding: utf-8 -*-
'''
注意单位的换算最终速度km/H 距离S /m
'''
import matplotlib.pyplot as plt
import xlwt
r = 0.08 #回转质量系数
v_max = 200 # 最大速度
max_acceleration = 0.6 # 最大加速度
braking_acceleration = 1.03 # 制动加速度
ATP_respond = 0.8 # ATP反应时间
Traction_cut = 0.8 # 切除牵引时间
Emergency = 2 # 紧急启动时间
Emergency_extra = 1.5 # 紧急启动额外时间
v_resric = 150 #限制速度
f = 600
M = 408.5
a_d = 0.05
list_c = [[], []]
list_s = []
list_all = [[], [], [], []]
def distance(v_two, v_one, acceleration):
'''
利用牛顿定律计算:速度距离公式
'''
v_2 = v_two / 3.6
v_1 = v_one / 3.6
Var_s = abs(v_2**2 - v_1**2) / (2 * acceleration)
return Var_s
def range_v(start, end):
'''
速度切分函数,起止速度按精度0.5切分,可更改
'''
range_list = []
range_list.append(start)
temp = start
for i in range(int(10*(end - start + 1))):
temp = temp + 0.5 #0.5切割精度
if temp < end:
range_list.append(temp)
return range_list
def distance_calculate(libiao, acceleration1):
'''
计算增加距离,输入为列表,计算相邻的V1V2 所走距离,后添加进s
'''
for i in range(len(libiao[0])-1):
v = libiao[0]
var_s = distance(v[i+1], v[i], acceleration1)
libiao[1].append(var_s)
def ATP_VS(v_gebr, s_gebr):
'''
计算ATP紧急制动触发曲线
'''
v_atp = v_gebr + a_d * 3.5 - (a_d + max_acceleration) * (ATP_respond + Traction_cut)
s_atp = s_gebr - (v_gebr*3.5 + 0.5*a_d*(Emergency + Emergency_extra)**2) - ((v_gebr+a_d*3.5)*(ATP_respond + Traction_cut)-0.5*max_acceleration*(ATP_respond + Traction_cut)**2)
return v_atp*3.6, s_atp
def calculate_list_abc():
'''
此函数为根据最大速度求出速度,距离列表,并将列表整理为结构化数据可直接画图。
以上计算的list存放的速度单位为km/h,存放的距离为 m ,距离为单个V1-V2对应的距离。需要累加
累加距离S,最终list_all里为结构化数据。
'''
list_c[0] = range_v(0, v_max)
distance_calculate(list_c, braking_acceleration)
del list_c[0][0]
#列表整合
list_all[0] = list_c[0][::-1]
list_s = list_c[1][::-1]
s = 0
for i in range(len(list_s)):
s = s + list_s[i]
list_all[1].append(s)
def data_write(datas):
'''
数据保存
'''
f = xlwt.Workbook()
sheet1 = f.add_sheet(u'ex.xls',cell_overwrite_ok=True) #创建sheet
#将数据写入第 i 行,第 j 列
i = 0
j = 0
for data in datas[0]:
sheet1.write(i,j,data)
i=i+1
i=0
j=1
for data1 in datas[1]:
sheet1.write(i,j,data1)
i=i+1
i=0
j=2
for data1 in datas[2]:
sheet1.write(i,j,data1)
i=i+1
i=0
j=3
for data1 in datas[3]:
sheet1.write(i,j,data1)
i=i+1
f.save('ex.xls') #保存文件
calculate_list_abc()
for i in range(len(list_all[0])):
v_atp, s_atp = ATP_VS(list_all[0][i]/3.6, list_all[1][i])
list_all[2].append(v_atp)
list_all[3].append(s_atp)
for i in range(len(list_c[1])):
list_all[1][i] += 300 #将图片X轴右边移动,相当于给距离+300值
list_all[3][i] += 300
data_write(list_all)
#画图
plt.title("ATP curve")
plt.xlim(xmax=2500,xmin=-250)
plt.ylim(ymax=220,ymin=0)
plt.xlabel("distance(m)")
plt.ylabel("speed(km/h)")
plt.plot(list_all[1],list_all[0],'r',label='GEBR')
plt.plot(list_all[3],list_all[2],'g',label='ATP')
plt.legend() # 显示图例
plt.show()