ATP 防护曲线(GEBR 和ATP触发曲线)

python 编程ATP曲线的实现。给定最大速度200km/h, 求速度 距离的曲线。应用牛顿第二定律,以及ATP 对应的GEBR曲线的点,分别求出list_all[[0],[1],[2],[3]] 。根据点画图曲线。
对应公式:
程序设计流程以及公式
ATP曲线
程序代码如下: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()    
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值