You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

行程加速度与减速度计算及Python模拟代码优化需求

问题:优化两点间移动的加减速模拟逻辑

我用以下Python代码模拟两点间的移动,需求如下:

  • 无论行程距离长短,实现起点加速、终点减速、中段保持最大速度
  • 若行程过短无法达到最大速度,则加速至行程中点后开始减速

但现有代码的加减速逻辑存在问题(比如最终会出现过冲),需要从数学层面补充变量优化逻辑。

原代码

import time

meters = 100000
traveling = True
meters_second = 0
max_meters_second = 1000
seconds = 0

while traveling:
    if meters <= 0:
        traveling = False
        meters = 0
        meters_second = 0
        seconds = 0
        print('you have arrived!')
    else:
        if seconds < 20:
            meters_second += 1
        elif meters < 10000:
            meters_second -= 1
        else:
            meters_second = max_meters_second
        meters -= meters_second
        seconds += 1
        print(f'dist to destination(m):{meters} M/s: {meters_second} time passed(s):{seconds}')
        time.sleep(1)

原代码输出

dist to destination(m):99999 M/s: 1 time passed(s):1
dist to destination(m):99997 M/s: 2 time passed(s):2
dist to destination(m):99994 M/s: 3 time passed(s):3
dist to destination(m):99990 M/s: 4 time passed(s):4
dist to destination(m):99985 M/s: 5 time passed(s):5
dist to destination(m):99979 M/s: 6 time passed(s):6
dist to destination(m):99972 M/s: 7 time passed(s):7
dist to destination(m):99964 M/s: 8 time passed(s):8
dist to destination(m):99955 M/s: 9 time passed(s):9
dist to destination(m):99945 M/s: 10 time passed(s):10
dist to destination(m):99934 M/s: 11 time passed(s):11
dist to destination(m):99922 M/s: 12 time passed(s):12
dist to destination(m):99909 M/s: 13 time passed(s):13
dist to destination(m):99895 M/s: 14 time passed(s):14
dist to destination(m):99880 M/s: 15 time passed(s):15
dist to destination(m):99864 M/s: 16 time passed(s):16
dist to destination(m):99847 M/s: 17 time passed(s):17
dist to destination(m):99829 M/s: 18 time passed(s):18
dist to destination(m):99810 M/s: 19 time passed(s):19
dist to destination(m):99790 M/s: 20 time passed(s):20
dist to destination(m):98790 M/s: 1000 time passed(s):21
dist to destination(m):97790 M/s: 1000 time passed(s):22
dist to destination(m):96790 M/s: 1000 time passed(s):23
dist to destination(m):95790 M/s: 1000 time passed(s):24
dist to destination(m):94790 M/s: 1000 time passed(s):25
...80 lines removed to reduce example size...
dist to destination(m):12790 M/s: 1000 time passed(s):107
dist to destination(m):11790 M/s: 1000 time passed(s):108
dist to destination(m):10790 M/s: 1000 time passed(s):109
dist to destination(m):9790 M/s: 1000 time passed(s):110
dist to destination(m):8791 M/s: 999 time passed(s):111
dist to destination(m):7793 M/s: 998 time passed(s):112
dist to destination(m):6796 M/s: 997 time passed(s):113
dist to destination(m):5800 M/s: 996 time passed(s):114
dist to destination(m):4805 M/s: 995 time passed(s):115
dist to destination(m):3811 M/s: 994 time passed(s):116
dist to destination(m):2818 M/s: 993 time passed(s):117
dist to destination(m):1826 M/s: 992 time passed(s):118
dist to destination(m):835 M/s: 991 time passed(s):119
dist to destination(m):-155 M/s: 990 time passed(s):120
you have arrived!
dist to destination(m):0 M/s: 0 time passed(s):1

优化方案与代码

核心问题在于原代码的加减速触发条件是固定值(比如固定20秒加速、剩余10000米减速),没有结合行程总距离和加减速的数学规律计算,导致过冲。

我们需要先计算:

  1. 加速到最大速度所需的时间和距离(匀加速运动:距离 = 0.5 * 加速度 * 时间²,这里加速度是1m/s²,所以加速到max_v的时间是max_v秒,距离是0.5 * max_v * max_v)
  2. 减速到0所需的距离和加速阶段一致(因为加速度大小相同)

根据总距离判断:

  • 如果总距离 ≥ 2倍加速距离:先加速到最大速度,匀速行驶,最后减速到0
  • 如果总距离 < 2倍加速距离:加速到中点后开始减速,确保终点速度为0且无过冲

优化后的代码:

import time

def calculate_accel_distance(max_speed, acceleration=1):
    # 计算加速到最大速度所需的总距离(匀加速)
    time_to_max = max_speed // acceleration
    return 0.5 * time_to_max * max_speed

# 配置参数
total_meters = 100000
max_meters_second = 1000
acceleration = 1  # 1m/s²
meters_remaining = total_meters
current_speed = 0
seconds_passed = 0
traveling = True

# 预计算关键阈值
accel_distance = calculate_accel_distance(max_meters_second, acceleration)
decel_distance = accel_distance  # 减速所需距离和加速相同
min_distance_for_full_speed = accel_distance + decel_distance

while traveling:
    if meters_remaining <= 0:
        traveling = False
        meters_remaining = 0
        current_speed = 0
        print('已到达目的地!')
        break
    
    # 决策当前阶段:加速/匀速/减速
    if current_speed < max_meters_second:
        # 检查是否还能加速:要么还没到加速距离,要么行程太短还没到中点
        if (meters_remaining > min_distance_for_full_speed - accel_distance) or \
           (total_meters < min_distance_for_full_speed and meters_remaining > total_meters / 2):
            current_speed += acceleration
        else:
            # 该减速了
            current_speed -= acceleration
    else:
        # 已经到最大速度,检查是否需要开始减速
        if meters_remaining <= decel_distance:
            current_speed -= acceleration
    
    # 确保速度不小于0
    current_speed = max(current_speed, 0)
    # 计算本次移动的距离,避免过冲
    move_distance = min(current_speed, meters_remaining)
    meters_remaining -= move_distance
    seconds_passed += 1
    
    print(f'剩余距离(m):{meters_remaining} 当前速度(m/s):{current_speed} 已耗时(s):{seconds_passed}')
    time.sleep(1)

优化点说明

  • 用数学公式预计算加减速的距离阈值,不再依赖固定数值
  • 针对短行程场景,判断剩余距离是否超过总行程一半,决定是否继续加速
  • 移动时取当前速度和剩余距离的最小值,彻底避免过冲
  • 确保速度不会降到负数,逻辑更严谨

内容的提问来源于stack exchange,提问作者Bubs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:06:02