Skip to content
claude edited this page Jul 9, 2026 · 2 revisions

Theoretical Model

RigidFlightLab is an academic simulation for published-benchmark reproduction and numerical-methods education only. It is not validated for real-world fire-control use and is not a targeting or operational artillery tool.

Source paper

Khalil, M., Abdalla, H., and Kamal, O., "Dispersion Analysis for Spinning Artillery Projectile", 13th International Conference on Aerospace Sciences & Aviation Technology (ASAT-13), Paper ASAT-13-FM-03, Military Technical College, Cairo, Egypt, May 2009.

The default case (155 mm M107 projectile: 43 kg, 698 mm, CG 0.459 m from the nose, Ixx = 0.144 kg.m^2, Iyy = Izz = 1.216 kg.m^2, muzzle velocity 684.3 m/s, muzzle spin rate 175.48 rps, 44 deg elevation) and the aerodynamic coefficient table are Table 1 of that paper, computed by the authors with the SPINNER-98 aeroprediction code - not independently-invented placeholder values.

Reference frames

  • Inertial frame: z-up (x = downrange, y = cross-range, z = altitude), fixed to the launch point.
  • Non-rolling (aeroballistic) frame: x-axis aligned with the projectile's symmetry axis, but the frame itself does not roll with the body. This is the standard formulation used throughout exterior ballistics texts (e.g. McCoy, Modern Exterior Ballistics) for axisymmetric spinning projectiles, because it is mathematically equivalent to a fully body-fixed frame (for Iyy == Izz, as here) while avoiding numerically stiff, spin-frequency coning artifacts in the transverse velocity components that a fully body-fixed frame would otherwise force onto the integrator. Roll angle (pure spin about the symmetry axis) is tracked as a decoupled scalar, since aerodynamics are axisymmetric and do not depend on roll orientation. The paper's own equations (1)-(4) are given in general body-fixed axes (with cross moments of inertia); this project specializes them to the non-rolling, Iyy = Izz case for tractable integration.

State vector

12 states: inertial position (3), non-rolling-frame velocity (3), roll angle + frame pitch/yaw (3), spin rate + frame transverse angular rates (3).

The translational and rotational equations were verified against the standard transport theorem (dV/dt|frame = F/m - Omega x V) and Euler's equations (dH/dt|frame + Omega x H = M) for a symmetric top, and the resulting flight independently checked against the paper's published figures (see Validation below) - this project's first implementation had two sign errors here (Coriolis terms, and the overturning-moment direction) that produced an unstable, tumbling trajectory before being caught by that comparison.

Aerodynamics

Forces and moments are computed from the total angle of attack between the relative-wind vector and the symmetry axis, using the paper's Mach-indexed coefficient table (linearly interpolated in Mach; the Magnus moment coefficient is additionally tabulated - and bilinearly interpolated - against total angle of attack, per Table 1's Cnpalpha columns at 0/2/5/10 deg):

  • Axial force (drag): CA (zero-yaw) + CA_alpha2 * sin^2(alpha).
  • Normal force: |CN_alpha| * sin(alpha), directed geometrically from the relative-wind vector toward the symmetry axis.
  • Magnus force: |C_Ypalpha| * (p*d/2V) * sin(alpha), perpendicular to both the symmetry axis and the relative wind.
  • Overturning (static) moment: Cm_alpha * sin(alpha), directed to increase alpha (Cm_alpha is positive in the paper - the shell is aerodynamically destabilizing/overturning and relies on gyroscopic, not aerodynamic, static stability).
  • Magnus moment: Cnpalpha(Mach, alpha) * (p*d/2V) (no extra alpha factor - the paper's table already tabulates the coefficient's alpha-dependence directly).
  • Pitch damping moment: Cmq * (q or r), opposing transverse rates.
  • Spin damping moment: Clp * (p*d/2V), reduces spin rate over time.

CN_alpha and C_Ypalpha are negative in the paper's own body-axis sign convention; this project uses their magnitude, since the physical force direction is reconstructed geometrically (see src/simulator/aero.py docstring) rather than from a raw body-axis component. Cm_alpha, Cmq, Clp, and Cnpalpha keep their published sign.

Atmosphere

US Standard Atmosphere 1976 (troposphere + isothermal lower stratosphere, 0-20 km), with an optional constant/linearly-sheared wind field.

Numerical integration

Two integrator options are provided:

  • RK4: classical fixed-step 4th-order Runge-Kutta.
  • solve_ivp: adaptive-step methods from scipy.integrate (RK45, DOP853, Radau, ...).

Both terminate via a ground-impact event at the configured ground altitude. The default step size (0.02 s / max_step) resolves the projectile's fast epicyclic (nutation) mode; a much coarser step will alias that mode and can produce spurious, unstable-looking results.

Dispersion sensitivity analysis

A Monte Carlo sweep draws the eight uncertainty parameters of the paper's Table 2 - firing pitch angle, projectile mass, axial and lateral moments of inertia, muzzle velocity, muzzle spin rate, and wind speed/direction at zero altitude - as independent Gaussians, and reports the spread of impact points (mean, standard deviation, CEP-50).

The paper's own Section 4.4 instead sweeps each parameter individually (holding the rest at nominal) and plots the resulting range/drift/radial error directly (Figures 11-18), treating each listed range as a deterministic bound to step across rather than a Gaussian width. This project uses a joint Monte Carlo sweep instead (the same general method as one of the paper's own cited references, Saghafi & Khalilidelshad 2003), with the paper's stated range treated as an approximate one-standard-deviation width. This captures the same eight uncertainty sources at the paper's stated magnitudes, but does not reproduce Figures 11-18's specific individual-parameter curves one-for-one. It does not compute or suggest any aim/fire-control correction.

Validation against the published results

With the default case and Table 1 aero data, this simulator reproduces the paper's Section 4.3 / Figures 3-10 closely. Provenance of each number matters here, so it's split into two groups:

Stated directly as text in the paper (Section 4.3):

Quantity Paper (exact quote) This simulator
Time of flight "66.67 sec" ~66.4 s
Summit time "nearly 31 s" ~30.5 s
Initial axial deceleration "4.45g" ~-4.47 g
Muzzle velocity "684.3 m/s" (also Section 4.1) 684.3 m/s (input, not an output)
Firing elevation angle "44" degrees (Section 4.1) 44 deg (input, not an output)

Read visually off the paper's own figures (3-10) - the paper does not give these as exact printed numbers, so treat the "paper" column as an approximate chart reading, not a quoted value:

Quantity Paper (~, from chart) This simulator
Summit altitude (Fig. 4) ~5750 m ~5630 m
Pitch angle at impact (Fig. 8) ~-55 deg ~-58 deg
Max total angle of attack (Fig. 10) ~1.3 deg ~1.7 deg
Minimum velocity near summit (Fig. 5) ~250-300 m/s ~253 m/s
Impact velocity (Fig. 5) ~330 m/s ~329 m/s
Range (Fig. 3, 3D trajectory) ~16-17 km reproduced to within ~10-15%

This project's aerodynamic model (small differences in how CA_alpha2, Cnpalpha, and the normal-force direction are combined - see above) is a defensible but not certified-identical reconstruction of the paper's own body-fixed-axes equations (1)-(2), which is consistent with the close-but-not-exact agreement in both tables.

Limitations

  • The aerodynamic coefficients are the paper's own published Table 1 for a 155 mm M107 shell - not independently validated by this project against any other source or real firing data.
  • The model does not include Coriolis/Eotvos effects from Earth's rotation, projectile flexibility, or base-drag variation with base bleed/rocket assist (the paper's own equations (3)-(4) include Earth-rotation terms that this project omits for simplicity).
  • Range/impact values are close to, but not exact reproductions of, the paper's own charts (see Validation table above).
  • This tool is for numerical methods education and published- benchmark reproduction only and must not be used for real-world fire-control, targeting, or weapon-deployment purposes.

Clone this wiki locally