在斜抛运动中,我们通常关心射程、最大高度以及特定位置的时间。本文考虑一个特殊的坐标系设定:水平方向为 zzz 轴,竖直方向为 xxx 轴(向上为正)。物体从原点 (x=0,z=0)(x=0,z=0)(x=0,z=0) 以初速度 v0v_0v0、抛射角 θ\thetaθ 抛出。运动方程由下式给出:
z=−v0cosθ⋅t,x=v0sinθ⋅t−12gt2, \begin{aligned} z &= -v_0 \cos\theta \cdot t, \\ x &= v_0 \sin\theta \cdot t - \frac{1}{2} g t^2, \end{aligned} zx=−v0cosθ⋅t,=v0sinθ⋅t−21gt2,
其中 ggg 为重力加速度,ttt 为时间。注意水平方向 zzz 的负号表示物体向 zzz 轴负方向运动。已知物体所能达到的最大竖直高度为 LLL,且有一竖直墙面位于 z=−Wz=-Wz=−W 处(W>0W>0W>0)。抛射过程中,物体先经过最高点,之后撞击墙面。要求解撞击墙面时的时间 ttt(即 z=−Wz=-Wz=−W 时的 ttt),以及在此条件下的轨迹方程 x(z)x(z)x(z)。
最大高度条件
在最高点处,竖直速度为零:v0sinθ−gttop=0v_0 \sin\theta - g t_{\text{top}} = 0v0sinθ−gttop=0,解得 ttop=v0sinθgt_{\text{top}} = \dfrac{v_0 \sin\theta}{g}ttop=gv0sinθ。代入竖直方向的位移公式得到最大高度 LLL:
L=v0sinθ⋅v0sinθg−12g(v0sinθg)2=v02sin2θ2g. L = v_0 \sin\theta \cdot \frac{v_0 \sin\theta}{g} - \frac{1}{2} g \left(\frac{v_0 \sin\theta}{g}\right)^2 = \frac{v_0^2 \sin^2\theta}{2g}. L=v0sinθ⋅gv0sinθ−21g(gv0sinθ)2=2gv02sin2θ.
因此有
v0sinθ=2gL.(1) v_0 \sin\theta = \sqrt{2gL}. \tag{1} v0sinθ=2gL .(1)
墙面位置与射程
物体撞击墙面时,其落地条件为 x=0x=0x=0(回到水平面)。由运动方程中 x=0x=0x=0 解得非零解 t=2v0sinθgt = \dfrac{2v_0 \sin\theta}{g}t=g2v0sinθ,这正是总飞行时间。此时水平位移为 z=−v0cosθ⋅t=−Wz = -v_0 \cos\theta \cdot t = -Wz=−v0cosθ⋅t=−W(墙面位置)。故有
W=v0cosθ⋅t=v0cosθ⋅2v0sinθg=2v02sinθcosθg.(2) W = v_0 \cos\theta \cdot t = v_0 \cos\theta \cdot \frac{2v_0 \sin\theta}{g} = \frac{2v_0^2 \sin\theta \cos\theta}{g}. \tag{2} W=v0cosθ⋅t=v0cosθ⋅g2v0sinθ=g2v02sinθcosθ.(2)
由 (1) 和 (2) 可以解出 v0cosθv_0 \cos\thetav0cosθ 与 v02v_0^2v02,但事实上我们并不需要显式求出 θ\thetaθ,因为最终结果可以用 L,W,gL,W,gL,W,g 表示。
撞击墙面时间
将 t=2v0sinθgt = \dfrac{2v_0 \sin\theta}{g}t=g2v0sinθ 与 (1) 式结合:
t=2g⋅2gL=22Lg. t = \frac{2}{g} \cdot \sqrt{2gL} = 2\sqrt{\frac{2L}{g}}. t=g2⋅2gL =2g2L .
可见撞击墙面的时间只依赖于最大高度 LLL 和重力加速度 ggg,与 WWW 无关。这是因为 WWW 由初速度的水平分量决定,而竖直分量已经由 LLL 固定;总时间由竖直分量唯一确定。
轨迹方程 x(z)x(z)x(z)
为了获得 xxx 作为 zzz 的函数,需要消去参数 ttt。由 z=−v0cosθ⋅tz = -v_0 \cos\theta \cdot tz=−v0cosθ⋅t 得 t=−zv0cosθt = -\dfrac{z}{v_0 \cos\theta}t=−v0cosθz。代入 xxx 表达式:
x=v0sinθ⋅(−zv0cosθ)−12g(z2v02cos2θ)=−ztanθ−gz22v02cos2θ. x = v_0 \sin\theta \cdot \left(-\frac{z}{v_0 \cos\theta}\right) - \frac{1}{2} g \left(\frac{z^2}{v_0^2 \cos^2\theta}\right) = - z \tan\theta - \frac{g z^2}{2 v_0^2 \cos^2\theta}. x=v0sinθ⋅(−v0cosθz)−21g(v02cos2θz2)=−ztanθ−2v02cos2θgz2.
注意到 tanθ=v0sinθv0cosθ\tan\theta = \dfrac{v_0 \sin\theta}{v_0 \cos\theta}tanθ=v0cosθv0sinθ 和 v02cos2θ=(v0cosθ)2v_0^2 \cos^2\theta = (v_0 \cos\theta)^2v02cos2θ=(v0cosθ)2。由 (2) 式 W=2v02sinθcosθgW = \dfrac{2 v_0^2 \sin\theta \cos\theta}{g}W=g2v02sinθcosθ 可得 v0cosθ=gW2v0sinθv_0 \cos\theta = \dfrac{gW}{2 v_0 \sin\theta}v0cosθ=2v0sinθgW。再利用 (1) 式 v0sinθ=2gLv_0 \sin\theta = \sqrt{2gL}v0sinθ=2gL ,有
v0cosθ=gW22gL=W2g2L. v_0 \cos\theta = \frac{gW}{2\sqrt{2gL}} = \frac{W}{2}\sqrt{\frac{g}{2L}}. v0cosθ=22gL gW=2W2Lg .
同时,
tanθ=v0sinθv0cosθ=2gLW2g2L=2gL⋅2W2g2L需仔细计算: \tan\theta = \frac{v_0 \sin\theta}{v_0 \cos\theta} = \frac{\sqrt{2gL}}{\frac{W}{2}\sqrt{\frac{g}{2L}}} = \frac{\sqrt{2gL} \cdot 2}{\frac{W}{2}\sqrt{\frac{g}{2L}}} \quad \text{需仔细计算:} tanθ=v0cosθv0sinθ=2W2Lg 2gL =2W2Lg 2gL ⋅2需仔细计算:
实际上更简洁的做法是用 v02v_0^2v02 消去。由 (1) 和 (2) 可得:
v02cos2θ=(v02sinθcosθ)2v02sin2θ=(gW2)22gL=gW28L. v_0^2 \cos^2\theta = \frac{(v_0^2 \sin\theta \cos\theta)^2}{v_0^2 \sin^2\theta} = \frac{\left(\frac{gW}{2}\right)^2}{2gL} = \frac{gW^2}{8L}. v02cos2θ=v02sin2θ(v02sinθcosθ)2=2gL(2gW)2=8LgW2.
因此
g2v02cos2θ=g2⋅gW28L=4LW2. \frac{g}{2 v_0^2 \cos^2\theta} = \frac{g}{2 \cdot \frac{gW^2}{8L}} = \frac{4L}{W^2}. 2v02cos2θg=2⋅8LgW2g=W24L.
再将 tanθ\tan\thetatanθ 表示出来:tanθ=v0sinθv0cosθ=2gLgW28L=2gLW2g2L=2gL⋅2W⋅2Lg=4LW\tan\theta = \dfrac{v_0 \sin\theta}{v_0 \cos\theta} = \dfrac{\sqrt{2gL}}{\sqrt{\frac{gW^2}{8L}}} = \dfrac{\sqrt{2gL}}{\frac{W}{2}\sqrt{\frac{g}{2L}}} = \dfrac{\sqrt{2gL} \cdot 2}{W} \cdot \sqrt{\frac{2L}{g}} = \dfrac{4L}{W}tanθ=v0cosθv0sinθ=8LgW2 2gL =2W2Lg 2gL =W2gL ⋅2⋅g2L =W4L。
于是轨迹方程化为
x=−z⋅4LW−4LW2z2=−4LW2z(W+z). x = -z \cdot \frac{4L}{W} - \frac{4L}{W^2} z^2 = -\frac{4L}{W^2} z(W + z). x=−z⋅W4L−W24Lz2=−W24Lz(W+z).
整理得
x=−4LW2z(z+W)(−W≤z≤0). \boxed{x = -\frac{4L}{W^2} z(z+W)} \quad ( -W \le z \le 0 ). x=−W24Lz(z+W)(−W≤z≤0).
这是一个开口向下的抛物线,在 z=0z=0z=0 处 x=0x=0x=0,在 z=−Wz=-Wz=−W 处 x=0x=0x=0,在 z=−W/2z=-W/2z=−W/2 处取得最大值 LLL,恰好符合设计要求。
数值验证与代码实现
为验证上述解析结果,我们可以利用数值计算绘制轨迹,并检验撞击时间是否与公式一致。以下给出三个独立的 Python 代码块,分别用于:计算给定 L,W,gL,W,gL,W,g 下的撞击时间;在给定初速度条件下反推抛射角并模拟运动;直接使用轨迹方程绘制图形。每个代码块均可独立运行,不依赖其他代码块。
代码块1:计算撞击时间
python
import math
def impact_time(L, g=9.8):
"""
计算撞击墙面的时间
L: 最大高度 (m)
g: 重力加速度 (m/s^2), 默认 9.8
返回: 撞击时间 t (s)
"""
t = 2 * math.sqrt(2 * L / g)
return t
# 示例
L_example = 5.0 # 最大高度 5米
g = 9.8
t_hit = impact_time(L_example, g)
print(f"当最大高度 L = {L_example} m 时,撞击时间 t = {t_hit:.3f} s")
代码块2:给定 LLL 和 WWW,反求初速度并模拟运动(验证轨迹)
python
import math
import numpy as np
import matplotlib.pyplot as plt
def simulate_trajectory(L, W, g=9.8, num_points=100):
"""
根据最大高度 L 和墙面距离 W,计算初速度分量并模拟运动,返回时间数组和坐标
"""
# 由 L 求竖直分量
v0_sin_theta = math.sqrt(2 * g * L)
# 由 W 和总时间关系求水平分量
T = 2 * v0_sin_theta / g # 总时间
v0_cos_theta = W / T # 因为 W = v0_cos_theta * T
# 时间离散
t = np.linspace(0, T, num_points)
z = -v0_cos_theta * t
x = v0_sin_theta * t - 0.5 * g * t**2
return t, z, x, v0_sin_theta, v0_cos_theta
# 参数设置
L = 5.0 # 最大高度 5 m
W = 10.0 # 墙面距离 10 m
g = 9.8
t, z, x, v_vert, v_horiz = simulate_trajectory(L, W, g)
print(f"计算得到的初速度分量: v_x (竖直) = {v_vert:.2f} m/s, v_z (水平) = {v_horiz:.2f} m/s")
print(f"撞击时刻: t = {t[-1]:.3f} s, 对应 z = {z[-1]:.2f} m (墙面位置)")
# 绘图验证轨迹
plt.figure(figsize=(8,5))
plt.plot(z, x, 'b-', label='模拟轨迹')
plt.plot([-W, -W], [0, L], 'r--', label='墙面位置')
plt.plot([0, 0], [0, L], 'k:', label='抛出线')
plt.xlabel('水平距离 z (m)')
plt.ylabel('竖直高度 x (m)')
plt.title('斜抛运动轨迹 (先达最高点后撞墙)')
plt.legend()
plt.grid(True)
plt.axis('equal')
plt.show()
代码块3:直接使用轨迹方程绘图
python
import numpy as np
import matplotlib.pyplot as plt
def trajectory_equation(z, L, W):
"""根据轨迹方程 x = -4L/W^2 * z*(z+W) 计算 x"""
return -4 * L / (W**2) * z * (z + W)
# 参数设置
L = 5.0 # 最大高度 5 m
W = 10.0 # 墙面距离 10 m
# 生成 z 坐标 (从 -W 到 0)
z_vals = np.linspace(-W, 0, 200)
x_vals = trajectory_equation(z_vals, L, W)
plt.figure(figsize=(8,5))
plt.plot(z_vals, x_vals, 'g-', linewidth=2, label='理论轨迹 $x(z)$')
plt.plot([-W, -W], [0, L], 'r--', label='墙面 ($z=-W$)')
plt.plot([0, 0], [0, L], 'k:', label='抛出点 ($z=0$)')
plt.plot([-W/2], [L], 'ro', markersize=8, label='最高点')
plt.xlabel('水平距离 $z$ (m)')
plt.ylabel('竖直高度 $x$ (m)')
plt.title('斜抛运动轨迹方程 $x = -\\frac{4L}{W^2}z(z+W)$')
plt.legend()
plt.grid(True)
plt.axis('equal')
plt.show()
结论
本文从斜抛运动的基本方程出发,利用最大高度 LLL 和墙面位置 z=−Wz=-Wz=−W 两个条件,推导出撞击墙面的时间 t=22L/gt = 2\sqrt{2L/g}t=22L/g ,以及简洁的轨迹方程 x=−4LW2z(z+W)x = -\frac{4L}{W^2}z(z+W)x=−W24Lz(z+W)。该结果不显含初速度 v0v_0v0 和抛射角 θ\thetaθ,仅由 LLL、WWW 和 ggg 决定。数值模拟验证了解析表达式的正确性,且三个独立的代码段可以分别用于时间计算、运动模拟和轨迹绘制,便于实际应用和教学演示。