返回首页

外部弹道建模:解析与 Python

本文分析了求解外部弹道问题的解析和数值方法。考虑了无阻力、线性阻力和二次阻力三种情况。提供了使用 SciPy 进行轨迹计算的完整 Python 模拟器代码。

外部弹道:从 Euler 到 Python 模拟器
Advertisement 728x90

外弹道学的解析与数值建模:三大关键情形

外弹道学研究的是物体在重力作用下,以一定初速度和倾斜角度发射后的平面运动。本文探讨三种典型情况:无空气阻力、符合斯托克斯定律的线性阻力,以及遵循牛顿定律的二次阻力。通过解析解与数值方法相结合,实现更贴近现实的模拟。

无阻力情形:理想抛物线轨迹

在无空气阻力的情况下,弹道轨迹为标准抛物线。当初速度 $v_0 = 20\,\text{m/s}$,发射角 $\alpha = 30^\circ$ 时,位置随时间变化公式如下:

$$

Google AdInline article slot

x(t) = v_0 \cos(\alpha) \cdot t

$$

$$

Google AdInline article slot

y(t) = v_0 \sin(\alpha) \cdot t - \frac{g t^2}{2}

$$

线性阻力:斯托克斯定律

当存在线性空气阻力时,阻力与速度成正比:$F = -k v$。对应的微分方程组为:

Google AdInline article slot

$$

m \frac{dv_x}{dt} = -k v_x

$$

$$

m \frac{dv_y}{dt} = -mg - k v_y

$$

解得速度呈指数衰减形式:

$$

v_x(t) = v_0 \cos(\alpha) \cdot e^{-kt/m}

$$

$$

v_y(t) = \left(v_0 \sin(\alpha) + \frac{mg}{k}\right) e^{-kt/m} - \frac{mg}{k}

$$

对速度积分可得 $y(x)$ 轨迹函数。以 $v_0 = 70\,\text{m/s}$,$\alpha = 55^\circ$,$k = 0.04\,\text{kg/s}$,$m = 0.5\,\text{kg}$ 为例,轨迹明显不对称,射程显著低于理想情况。

二次阻力:牛顿定律

高速飞行时,空气阻力主要表现为二次项:$F = -k v^2$。此时常微分方程组为:

$$

\frac{dv_x}{dt} = -k v v_x

$$

$$

\frac{dv_y}{dt} = -g - k v v_y

$$

其中 $v = \sqrt{v_x^2 + v_y^2}$。18世纪欧拉曾对此系统进行过解析求解。如今普遍采用四阶五阶龙格-库塔法(RK45)进行数值积分。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

class BallisticsSimulator:
    def __init__(self):
        self.g = 9.81
        self.rho = 1.225

    def calculate_k(self, diameter, mass, Cd=0.3):
        A = np.pi * (diameter / 2) ** 2
        k = (Cd * self.rho * A) / (2 * mass)
        return k

    def equations_of_motion(self, t, state, k):
        x, vx, y, vy = state
        v = np.sqrt(vx**2 + vy**2)
        ax = -k * v * vx
        ay = -self.g - k * v * vy
        return [vx, ax, vy, ay]

    def simulate(self, v0, angle_deg, x0=0, y0=0,
              diameter=0.1, mass=10, Cd=0.3,
              t_max=100, dt=0.01):
        k = self.calculate_k(diameter, mass, Cd)
        angle_rad = np.radians(angle_deg)
        vx0 = v0 * np.cos(angle_rad)
        vy0 = v0 * np.sin(angle_rad)
        initial_state = [x0, vx0, y0, vy0]
        t_span = (0, t_max)
        t_eval = np.arange(0, t_max, dt)
        solution = solve_ivp(
            self.equations_of_motion,
            t_span,
            initial_state,
            args=(k,),
            t_eval=t_eval,
            method='RK45'
        )
        t = solution.t
        x = solution.y[0]
        y = solution.y[2]
        fall_index = np.where(y < 0)[0]
        if len(fall_index) > 0:
            fall_index = fall_index[0]
            t = t[:fall_index + 1]
            x = x[:fall_index + 1]
            y = y[:fall_index + 1]
        return t, x, y, k

    def plot_trajectory(self, t, x, y, k, v0, angle):
        plt.figure(figsize=(12, 8))
        plt.plot(x, y, 'b-', linewidth=2, label='轨迹')
        plt.scatter(x[0], y[0], color='red', s=100, zorder=5, label='发射点')
        plt.scatter(x[-1], y[-1], color='green', s=100, zorder=5, label='落地点')
        plt.xlabel('距离, m', fontsize=12)
        plt.ylabel('高度, m', fontsize=12)
        plt.title(f'射击轨迹\nV₀ = {v0} m/s, 角度 = {angle}°, k = {k:.6f}',
                  fontsize=14)
        plt.grid(True, alpha=0.3)
        plt.legend()
        plt.axis('equal')
        plt.show()

    def print_results(self, t, x, y):
        print("=== 模拟结果 ===")
        print(f"射程: {x[-1]:.2f} m")
        print(f"最大高度: {max(y):.2f} m")
        print(f"飞行时间: {t[-1]:.2f} s")

# 示例:v0=250 m/s, angle=60°, d=0.2 m, m=20 kg

对于 $v_0 = 250\,\text{m/s}$,$\alpha = 60^\circ$,直径 20 cm,质量 20 kg,阻力系数 $C_d = 0.3$ 的情形,阻力系数 $k$ 按公式 $k = \frac{C_d \rho A}{2m}$ 计算,其中 $A$ 为横截面积。使用 solve_ivp 配合 RK45 方法,能精确追踪至落地时刻($y = 0$)。

模拟参数与结果分析

关键输入参数包括:

  • 初速度 $v_0$:20–250 m/s
  • 发射角 $\alpha$:30–60°
  • 质量 $m$:0.5–20 kg
  • 直径:10–20 cm
  • $C_d$:0.3(典型值)
  • $k$:自动计算

二次阻力下的模拟结果:

  • 飞行射程:约 10–20 公里(依参数而定)
  • 最大高度:5–15 公里
  • 飞行时间:50–100 秒
  • 落地速度:接近终端速度

对比三种情形可见,考虑空气阻力后射程减少约 30%–50%。

核心结论

  • 无阻力 → 抛物线轨迹;最远射程出现在 $\alpha = 45^\circ$。
  • 斯托克斯定律适用于低速(<30 m/s),速度呈指数衰减。
  • 牛顿阻力定律是炮兵领域的标准模型,需依赖数值求解常微分方程。
  • 使用 Python 与 scipy.integrate 可灵活适配真实场景中的阻力系数 $C_d$ 和空气密度 $\rho$。

— Editorial Team

Advertisement 728x90

继续阅读