杰尼龟啊
2021-11-03 14:04
采纳率: 66.7%
浏览 52
已结题

关于Python大量生成速度曲线

问题背景:
绘制横坐标S(距离)、纵坐标V(速度)的曲线图,需要用到的是高中物理中的匀变速直线运动,总共会用得到的参数就是t(时间)、s(距离)、a(加速度)、v(速度)。总的来说就是假定在理想状况下,我只需要输入有几段限速路段,限速路段的距离(限速路段头尾相连),和其对应的限速值,加速度可以假定为0.5-1.1m/s²之类的,就可以生成总路程与其对应速度的曲线。
代码中有部分地方如果要理解的话会用到如下图的公式,但是其实我觉得可以不用看这个公式,这个我可以自己完成,还是附上方便专家们理解,有劳了。
img
问题举例:
输入路段全长:2000m
第一段限速路段是:0-500m ,限速值是20km/h-30km/h
第二段限速路段是:500-1500m ,限速值是30km/h-40km/h
第三段限速路段是:1500-2000m ,限速值是25km/h-35km/h
然后他就生成如图
img
问题要点、难点:
1、为什么是大量绘制呢?因为加速度、限速值是一个区间,如上我假定的加速度是0.5-1.1m/s²,我取的步长是0.1,这样折线图中的第一段便有6种可能了,然后车辆达到指定限速值进行匀速行驶,这里的限速值假定是取20-26km/h,步长取1,这样便又是6种可能了。6*6,在第一段限速路段便有36种可能,以此类推,每一段都有几种可能,便是这个意思。
如图我绘制的三段限速路段的图,但是我想要的是限速路段的数量是可变的,不然有四段限速路段的时候就又要改代码。
img
2、以下我的代码比较简单,没有考虑那么多情况,因为实力有限,见谅。我的三段是直接考虑两端加速两段减速到终点的,但实际肯定不是这样,得考虑一下,诺后面一段的限速值比前一段大或者小,那么加速度便要考虑其正负,这个判定条件我不知道该怎么写。此外,代码中间寻找加速度与速度时间之间关系,我这段可能看起来会很绕,大概就是我用速度路程加速度求出时间,我觉得不重要,我用的描点法绘制的,重要的是如何生成这些数据。
img
代码中我是把数据储存到数据库中绘制了,绘制步骤的代码如下:
img
3、有一个难点一直困惑着我,因为我一直想着是一开始就输入是几段限速,这样段数便是一个变量,然后依据我上面代码的思路,这样我的for循环嵌套也是变量,百度了好久没不知道如何去掉for循环,或者控制for循环嵌套的层数。
本人交代:
因为这是我第一段自己接触的代码,是刚学习没多久,有很多思路可能奇奇怪怪,但是我是真的诚心学习,问题如果有描述不清楚的地方,请指正,谢谢。
不管是什么回答我都会认真思考回复的,感谢。

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • soar3033 2021-11-03 14:37
    已采纳
    
     
    import matplotlib.pyplot as plt
    spd=[[20,23],[60,64],[29,31]] #3段的限速上限值和下限值,要n段就继续加
    lenth=[[0,400],[400,1000],[1000,1500]] #3段速度的区间
    acc=[0.1,0.3]#加速度区间
    plt.Figure()#创建绘画
    plt.subplot(111)#创建图画区域
    def cal(t,n):#计算和绘图方法
        for i in range(int(10*(acc[1]-acc[0])+1)):#遍历加速度(单个段)
            acct=acc[0]+i*0.1#计算每一个加速度
            for j in range(spd[n][1]-spd[n][0]+1):#遍历限速(单个段)
                spdt=spd[n][0]+j#计算每一个速度
                ttt=[acct,spdt]#产生本段的一个 加速度、速度 列表
                tt=t.copy()#复制上一级传递进来的结果列表(前段的加速度、速度结果)
                tt.append(ttt)#将本次生成的 本段加速度、速度列表添加进复制的列表
                if n<len(spd)-1:#如果没有遍历完所有的段速
                    cal(tt,n+1)#递归遍历
                else:#否则
                    speed=0#赋值初始速度为0
                    loc=0#赋值初始位置为0
                    speeds=[]#创建速度列表
                    locs=[]#创建位置列表
                    while loc<2000:#位置循环
                        loc+=(speed*0.1)#新位置计算
                        locs.append(loc)#添加新位置
                        speeds.append(speed)#向列表内添加新速度
                        for i in range(len(spd)):#遍历速度段
                            if loc>=lenth[i][0] and loc<lenth[i][1]:#判断是否在段内
                                if speed<tt[i][1]:#如果速度低于设定
                                    speed+=(tt[i][0]*0.1)#加速
                                if speed>tt[i][1]:#如果速度高于设定
                                    speed-=(tt[i][0]*0.1)#减速
                    plt.plot(locs,speeds)#生成速度和位置列表后进行绘图
    cal([],0)#调用方法,传入空列表进行初始化,初始段为0
    plt.show()#显示图像
     
    

    img

    评论
    解决 无用
    打赏 举报
查看更多回答(1条)

相关推荐 更多相似问题