Monte Carlo flight and landing-dispersion analysis

Purpose

The Monte Carlo analysis estimates the spread in flight metrics and the horizontal landing cloud produced by uncertain weather, launcher, vehicle, propulsion, and recovery inputs. It is an ensemble analysis, not a replacement for validating the nominal rocket model. Every run clones the selected simulation, samples deviations around its nominal values, records scalar outputs for every flight-data branch, and records the east/north position of eligible bodies at their ground-hit events. The source simulation and document are not changed.

Research basis

The initial parameter set is based on the recurring uncertainty families in launch-vehicle and parachute-dispersion guidance:

Parameter families normally considered

Family

Typical inputs

OpenRocket implementation status

Atmosphere

Wind speed/direction profiles and turbulence; density, temperature, and pressure; forecast or historical-profile variability

Wind speed, direction, and relative density are implemented. Wind turbulence still comes from the selected OpenRocket wind model.

Launcher and initial state

Guide elevation/azimuth alignment, position/attitude, release conditions, rail effects, and launch timing

Guide tilt and azimuth error are implemented.

Mass properties

Total/stage mass, center of gravity, moments of inertia, payload and assembly tolerances

Total mass/inertia scaling plus an axial CG offset are implemented. Independent radial CG offsets are future work.

Aerodynamics and construction

Axial drag, normal force, center of pressure, aerodynamic moments and damping, fin alignment/cant, and model-form error

Axial-force and grouped normal-force/moment scaling are implemented. Explicit fin/build-error models are future work.

Propulsion and staging

Thrust/total impulse/burn time, motor-to-motor variation, thrust misalignment, ignition/ejection timing, and staging timing

Scalar thrust and ignition-time variation are implemented. Thrust-vector misalignment and curve-shape variation are future work.

Recovery

Deployment detection/timing, inflation/fill, drag area, reefing, device correlations, and discrete failure modes

Deployment timing and a post-deployment drag multiplier are implemented. Per-device inflation dynamics and failure modes are future work.

Guidance and control

Sensor, navigation, actuator, and control-law errors for guided vehicles

Not currently modeled by OpenRocket’s unguided-flight analysis.

FAA AC 450.117-1 identifies mass, aerodynamic, propulsive, guidance, and atmospheric input uncertainties and discusses normal, uniform, log-normal, and empirical distributions. It notes that 500–1,000 trajectories are typically adequate for its normal-trajectory use case, while also requiring the analyst to document distributions and correlations. This range is a starting point, not a general convergence guarantee. NASA GSFC-STD-8009 independently calls out thrust offset and misalignment, aerodynamic error, uncompensated wind, launcher misalignment, weight/impulse error, guidance/control error, ignition delay, mass variability, flight history, a statistically significant number of runs, and one/two/three-sigma impact ellipses for every impacting body.

Recovery-system uncertainty deserves separate treatment. NASA’s CPAS work fits drag area, inflation/fill, over-inflation, and timing parameters to normal, log-normal, or uniform distributions based on test evidence rather than assuming one generic distribution. Landing studies also combine vehicle and atmospheric uncertainties with terrain or hazard maps. The first OpenRocket implementation stops at pad-relative landing coordinates; geospatial and terrain-risk overlays are a later layer.

Calculation design

MonteCarloSettings stores a run count, signed 32-bit master seed, and the distribution/spread for each active parameter. MonteCarloSampler derives one independent random stream per parameter, plus a stream for the per-run simulation seeds, from the master seed over the full parameter enum. Changing one parameter therefore leaves every other parameter’s samples and every run’s simulation seed unchanged. Repeating the same model, settings, and master seed repeats the sampled inputs. The 32-bit input provides over four billion reproducible seed choices while keeping the configuration field compact and consistent with OpenRocket’s existing simulation-seed UI.

Normal spread means one standard deviation. Uniform spread means a symmetric half-range. Log-normal spread is one standard deviation of the natural logarithm of the multiplier; it keeps a multiplier strictly positive and is offered only for relative parameters, where a symmetric distribution can otherwise reach nonphysical values in the tails. Its median is the nominal value, so its mean sits slightly above nominal. Parameters are currently sampled independently. Relative samples are converted to multipliers and clipped to a minimum of 0.01 so that mass, density, drag, or thrust cannot become zero or negative. Wind speed is clipped at zero. A wind-speed sample shifts the mean speed at every selected wind level without changing its configured standard deviation; turbulence intensity therefore changes as the ratio of that fixed standard deviation to the varied mean. Launch-guide angle follows OpenRocket’s existing physical limit, and an event shifted earlier than its triggering event is placed 1 ms after the trigger. These clips make extreme tails truncated and must be considered when using wide normal spreads.

MonteCarloSimulationRunner performs one nominal run, then the requested number of dispersed runs on a thread pool. Every sample is drawn before any trajectory starts, making sampled inputs independent of thread scheduling. Each trajectory runs on an independent copy of the rocket so concurrent simulations do not share mutable configuration or aerodynamic caches. Result order remains run-number order. Floating-point trajectories may differ slightly with concurrency even when their sampled inputs and simulation seeds match. Each run adds a system simulation listener. Post-calculation hooks alter atmosphere, rigid-body properties, aerodynamic forces, and thrust without editing rocket components. The event hook reschedules ignition and recovery deployment. Launch-option and wind-profile deviations are applied to each clone before the flight starts. Simulation extensions run only when they explicitly declare themselves safe for repeated, concurrent Monte Carlo use. The default is unsafe; extensions that can write files, print output, run arbitrary code, show UI, or have other external side effects are rejected before the nominal trajectory starts.

Each FlightDataBranch that reaches the ground becomes a landing body when it either descends under a deployed recovery device or represents an independently simulated stage-separation branch. This keeps separated boosters selectable even when they tumble or impact without deploying recovery. Bodies are correlated between trajectories by their stable source-component ID, not by the order in which branches happen to be created in a particular run. A ballistic primary body remains excluded from the landing-dispersion view, but its scalar flight metrics remain available. Position X is reported as east and Y as north in metres. A branch abort excludes only that body from the run’s dispersion statistics; successful sibling bodies remain usable. Trajectory-wide exceptions and missing ground hits are retained as failures and excluded from the affected statistics.

Output statistics and UI

The simulations panel enables Monte Carlo analysis for exactly one non-imported simulation. The setup dialog exposes all implemented inputs, the distribution, and a display-unit spread. It starts with practical, normally distributed starter spreads so a new analysis produces a useful cloud immediately. These values are explicitly labeled as starting points rather than validated tolerances, can be restored with Reset defaults, and should be replaced by measured uncertainty data when available. All fixed remains available for zeroing every explicit spread. A SwingWorker runs the trajectories off the event-dispatch thread and supports cancellation.

The run count, seed, distributions, and spreads are saved on each simulation when the setup dialog closes after a valid change, or when an analysis starts. They are restored whenever the setup dialog is reopened and are persisted in the .ork file. A simulation that has never had its dispersion setup changed or run has no saved configuration.

Separately, the most recent completed result is cached in memory for each simulation and enables Plot cached analysis while its settings still match. The action is hidden as soon as those settings differ. A cache entry is discarded when the rocket, active flight configuration, simulation options, or simulation-extension configuration no longer matches the inputs used for the analysis. Weak simulation references allow cached results to expire with closed documents; completed runs are not written to the .ork file.

The results dialog contains two complementary views. Landing dispersion switches among all eligible landing bodies and provides:

  • a pad-relative east/north scatter plot with nominal and sample-mean markers;

  • empirical nearest-rank R50, R90, and R95 radii measured about the sample mean;

  • one-, two-, and three-sigma sample-covariance ellipses;

  • a PNG export of the plot as displayed; and

  • every run’s success/failure, landing, maximum altitude, and flight time.

Flight metrics switches among every flight-data branch and summarizes:

  • apogee altitude;

  • maximum velocity and Mach number;

  • maximum acceleration;

  • time to apogee and total flight time; and

  • landing velocity when the branch reaches the ground.

The metric table reports the nominal value, mean, median, sample standard deviation, empirical P5 and P95, and the valid-run count. Selecting a row shows either a histogram or a box plot in that metric’s normal OpenRocket display unit. Histogram bins are chosen automatically from the sample count using a bounded square-root rule, and tooltips report each bin’s numeric range and run count. The histogram shades the P5–P95 range and identifies nominal/sample-mean values. The horizontal box plot uses its conventional quartile, whisker, median, and outlier marks without binning. Metric plots always auto-fit the complete distribution rather than offering interactive zoom. Keeping one metric per plot avoids combining incompatible units or hiding engineering values behind normalization. Plot export follows the active results tab.

CSV export contains the master seed, settings, simulation seed, sampled deviations in explicit SI units, stable branch ID, per-run branch index, landing coordinates when available, and all scalar metrics for every run/branch pair.

The scatter plot uses equal east/north scale, a theme-aware colorblind-friendly palette, drag-to-pan, uniform mouse-wheel zoom, and explicit zoom-in, fit, and zoom-out controls. Covariance ellipses share one color and use solid, dashed, and dash-dotted strokes for one, two, and three sigma.

The plot is titled after the simulation and subtitled with the landing body, the number of dispersed runs that landed, and the master seed, so an exported image identifies the analysis that produced it without the surrounding dialog. The export is laid out at the on-screen size and then drawn through a scaling transform, which keeps the fitted equal-scale axes and the on-screen proportions while supersampling to roughly 2,400 pixels wide for report and print use.

For an ideal bivariate-normal cloud, covariance ellipses at one, two, and three Mahalanobis sigma contain approximately 39.3%, 86.5%, and 98.9%, respectively. They do not mean 68.3%, 95.4%, and 99.7%, which are one-dimensional intervals. For skewed, multimodal, clipped, or failure-heavy clouds the ellipses are only descriptive; the empirical radii are the reported containment measures.

Known limitations and next steps

The first implementation intentionally does not persist an analysis in an ORK file. It supports independent inputs only; it has no correlation matrix, empirical distributions, historical weather ensembles, per-stage mass/propulsion errors, explicit thrust/fin misalignment, wind-shear variation, independent radial CG offsets, per-device parachute inflation, or discrete failure modes. A single recovery-drag multiplier covers every deployed device, so a drogue and a main vary together. Extensions that do not explicitly opt into side-effect-free concurrent execution cannot be used in the analysis. It also lacks convergence confidence intervals, sensitivity attribution, latitude/longitude conversion, terrain, and range-boundary overlays.

Two parameters are narrower than their names suggest. Ignition timing shifts only air-started and upper-stage motors, because moving the pad ignition translates the whole flight in time without dispersing it. Deployment timing cannot move an event into the past, so for an apogee trigger with no configured delay the negative half of the spread collapses onto apogee; near apogee the vehicle is vertically stationary, so the accuracy cost is small, but the sampled value recorded in the CSV is then not the value the trajectory used.

Before treating an analysis as decision evidence, characterize input data and correlations, inspect all failed trajectories, repeat with other master seeds, and increase the run count until the decision-relevant quantiles stabilize. Adding bootstrap confidence bounds and a convergence view should precede any UI claim that a finite sample proves a required containment probability.

Primary references