行程加速度与减速度计算及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米减速),没有结合行程总距离和加减速的数学规律计算,导致过冲。
我们需要先计算:
- 加速到最大速度所需的时间和距离(匀加速运动:
距离 = 0.5 * 加速度 * 时间²,这里加速度是1m/s²,所以加速到max_v的时间是max_v秒,距离是0.5 * max_v * max_v) - 减速到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
相关产品推荐
相关产品推荐

