如何计算抛体初速度并用Matplotlib实现动画且清除轨迹残留?
物体抛落运动的物理求解与动画修复
物理问题求解
已知物体B从高度( h=20m )自由下落,落地时间为 ( t_B = \sqrt{\frac{2h}{g}} )。要求物体A落地时间比B晚( dt=2s ),即 ( t_A = t_B + dt )。
根据竖直上抛运动的位移公式 ( h + v t_A - \frac{1}{2} g t_A^2 = 0 ),解得初速度:
[ v = \frac{1}{2} g t_A - \frac{h}{t_A} ]
代入数值计算后,即可得到符合要求的初速度( v )。
动画问题修复
你遇到的轨迹残留问题,是因为每次调用set_data时传入了从开始到当前帧的所有位置数据(hA[:frame]),导致Matplotlib会画出所有历史点。要只显示当前时刻的物体位置,只需传入单帧的位置值即可:
- 将
A.set_data([2], hA[:frame])改为A.set_data([2], hA[frame]) - 将
B.set_data([6], hB[:frame])改为B.set_data([6], hB[frame])
另外可以优化坐标轴范围,让动画显示更紧凑:先计算物体A能到达的最大高度,再设置y轴范围,避免画面空荡。
完整修正代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # 输入参数 h, g, dt = 20, 9.81, 2 # 计算落地时间与初速度 t_B = np.sqrt(2 * h / g) t_A = t_B + dt v = 0.5 * g * t_A - h / t_A # 生成时间序列与位置数据 t = np.linspace(0, t_A, 100) hA = h + v * t - 0.5 * g * t**2 hB = h - 0.5 * g * t**2 # 计算A的最大高度,优化坐标轴范围 max_hA = h + v**2 / (2 * g) y_max = max_hA + 5 # 留一点余量 # 创建画布与坐标轴 fig, ax = plt.subplots() ax.set_xlim(0, 10) ax.set_ylim(0, y_max) ax.set_title("竖直上抛与自由下落运动") ax.grid(True) ax.set_xlabel("水平位置") ax.set_ylabel("高度 (m)") # 定义物体A、B的初始标记 A, = ax.plot([], [], "o", markersize=6, color="red", label="物体A(竖直上抛)") B, = ax.plot([], [], "o", markersize=6, color="blue", label="物体B(自由下落)") ax.legend() # 动画更新函数 def animate(frame): # 只设置当前帧的单个位置,避免历史轨迹残留 A.set_data([2], hA[frame]) B.set_data([6], hB[frame]) return A, B # 创建动画 ani = FuncAnimation(fig, animate, frames=len(t), interval=25, repeat=False) plt.show()
额外说明
- 优化后的坐标轴会根据物体A的最大高度自动调整,避免画面空荡
- 增加了图例与坐标轴标签,让动画更清晰
- 调整了markersize,让物体标记更醒目
内容的提问来源于stack exchange,提问作者bored af
相关产品推荐
相关产品推荐

