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

如何计算抛体初速度并用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()

额外说明

  1. 优化后的坐标轴会根据物体A的最大高度自动调整,避免画面空荡
  2. 增加了图例与坐标轴标签,让动画更清晰
  3. 调整了markersize,让物体标记更醒目

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 14:37:27