Supplementary Code: Identifiable Uniqueness of Impulsively Forced, Inert, and Stabilized Body Trajectories
Description
Overview
This repository contains the code needed to reproduce the numerical illustration (Figures 1–2) and the finite-sample Monte Carlo tables in the paper. The paper asks when trajectory data can uniquely recover the dynamical class of a moving body among three reference regimes — impulsively forced motion (C), inert propagation (I), and active stabilization such as a controlled spacecraft (S) — and when the data instead leave a set of compatible classes. It formulates this as a classical identification problem: the regimes are told apart by the way their trajectories respond to disturbances, and identification succeeds only when the regimes leave distinct observable signatures and the data are precise enough to resolve the difference. The code follows the paper's diagnostic framework of four observables — O1 (forecast-residual regularity), O2 (disturbance attenuation), O3 (excess-kurtosis reduction), and O4 (impulse response) — referred to as O1–O4 throughout; the Mathematical Background section below gives each diagnostic's role in the two-stage identification.
All numerical experiments use synthetic data generated from fixed random seeds; no observational or experimental data are used or generated. The scripts here draw the two schematic/illustrative figures and run the Monte Carlo that documents the finite-sample behavior of the diagnostics.
Key Results
- Three reference classes. Impulsively forced (C), inert propagation (I), and active stabilization (S), defined within specified reference models and relative to the sampling cadence.
- Two-stage identification. Stage 1 excludes impulsive forcing (C) through the O3 excess-kurtosis gap; Stage 2 separates active stabilization (S) from inert propagation (I) using disturbance attenuation (O2), error-shape reduction (O3), and the O4b variance response.
- Identifiable uniqueness vs. a compatible set. When the classes leave distinct signatures and a resolvability margin is met, a nearest-signature classifier consistently recovers the true class; when the margin fails, the estimate is set-identified to the inert–stabilized pair, and the criterion directs follow-up to the unresolved contrast.
- Operational criterion. The identification result is expressed as a distance rule — classify to the nearest admitted signature within a tolerance — that can be automated.
- Finite-sample behavior (Monte Carlo, arc lengths \(T = 60, 120, 250\)). The restricted residual-variance test holds approximately its nominal 5% size under the inert null, including a detect-then-test pipeline that re-runs a CUSUM change detector inside every bootstrap resample; power the within-object variance test has high power against stabilization (about 0.90 at the higher gain), roughly stable across arc length, while the cross-sectional level test's power rises with arc length, approaching one at \(T=250\) under the higher signal-to-noise setting; the clean-trajectory screen's leakage under impulsive forcing with additive outliers is quantified; and the O3 kurtosis restoration is confirmed negative under oracle standardization.
Repository Structure
| File | Role |
|---|---|
make_all.py |
Runs the three generators, then verifies SHA256SUMS. |
fig_authority.py |
Figure 1: actuator geometry and illustrative correction commands → fig_authority.pdf. |
fig_regimes.py |
Figure 2 and macros_fig.tex: inert/stabilized reference-model panels. |
mc_diagnostics.py |
Finite-sample Monte Carlo → macros_mc.tex. |
fig_authority.pdf, fig_regimes.pdf |
Generated figures. |
macros_fig.tex, macros_mc.tex |
Generated numerical macros consumed by the manuscript. |
SHA256SUMS |
Integrity manifest over the files above. |
LICENSE |
MIT license. |
Figures
fig_authority.pdf — Figure 1: actuator geometry
Three planar unidirectional jets spaced at 120° produce zero net baseline force when fired equally; differential modulation around that baseline supplies correction authority, whose symmetric headroom depends on both the lower and upper actuator bounds (and is not maximized by firing at the upper bound).
Every arrow is computed from the three jet directions and nonnegative commands; the residual scales are schematic. Geometry alone supplies neither a stochastic covariance law, a centered control policy, nor an O1 (forecast-residual regularity) or O4 (impulse-response) diagnostic result — Figure 1 motivates the actuation model but does not stand in for the statistical arguments.
fig_regimes.pdf — Figure 2: illustrative inert and stabilized reference models
All parameters are illustrative; no observed object is fitted.
Analysis Scripts
Requirements: Python 3.10 or later with NumPy and Matplotlib. The reference build used Python 3.10.6, NumPy 2.2.6 and Matplotlib 3.10.x, and both generated macro files matched the deposited values byte for byte. Fixed random seeds and suppressed volatile PDF metadata support repeatability in a fixed environment; identical output across untested library versions is not promised.
fig_authority.py — Figure 1
Draws the actuator geometry and computed correction arrows. Key functions: sym_set / inradius (symmetric-headroom geometry of the nonnegative command set), jets_lower (directional commands built by lowering jets), draw_jets / panel (rendering). A built-in guard asserts no label overlaps plotted data.
fig_regimes.py — Figure 2 (and macros_fig.tex)
Draws the inert/stabilized reference-model panels and emits the figure/caption macros. Key functions: pulse_draw (fixed-seed disturbance draws), ged_pdf / ged_kurt / ged_lam (generalized-error densities matched by kurtosis to the variance-share identity), mix_big (component scaling for unit total variance).
mc_diagnostics.py — Monte Carlo (and macros_mc.tex)
Simulates the three reference structures at arc lengths \(T = 60, 120, 250\) and writes one \newcommand per reported number. Key functions:
vh_test— restricted residual-bootstrap test on the accumulated conditional-variance response, with the null \(v_h = 0\) imposed in the resampling (size under the inert limit I).cusum_t0— CUSUM mean-shift detector that locates the disturbance onset.vh_detect_full— the full detect-then-test pipeline that re-runs the detector inside every resample, so the selection effect enters both the observed statistic and the null distribution.adf_t/adf_robust— Dickey-Fuller clean-trajectory screen and its outlier-robust variant (leakage under impulsive forcing C, the Franses–Haldrup spurious-rejection effect).levelshift_flag,xsec_flag— level-shift and cross-sectional detection flags.
make_all.py
Runs the three generators from the package root, then strictly verifies SHA256SUMS.
Mathematical Background
Reference classes
The three admitted regimes are impulsively forced motion (C), inert propagation without correction (I), and active corrective stabilization (S). Classification is relative to the specified reference models and the sampling cadence: the inert label is a cadence-relative operational class, since a sufficiently slow modulation is indistinguishable from inert propagation at a fixed sampling rate.
The two-stage identification and the four diagnostics
| Diagnostic | What it measures | Role |
|---|---|---|
| O1 forecast-residual regularity | regularity (stationarity) of the one-step prediction errors | shared regularity precondition for I and S; does not by itself exclude C |
| O2 disturbance attenuation | event-versus-quiet variance against an uncorrected twin | separates S from I; its variance contrast is shared by I and C, so it does not by itself exclude C |
| O3 excess-kurtosis reduction | change in the peakedness (fourth cumulant) of the errors | Stage 1: excludes C through the excess-kurtosis gap; also separates S from I |
| O4 impulse response | level (O4a) and variance (O4b) response to an isolated disturbance | Stage 2: separates S from I through O4b when the variance and shape comparisons are uninformative; O4a is a shared local ramp used as a guard |
Stage 1 excludes impulsive forcing (C) via the O3 excess-kurtosis gap; Stage 2 then distinguishes active stabilization (S) from inert propagation (I).
Resolvability margin and identifiable uniqueness
Two conditions must both hold for a unique recovery: the classes must leave distinct observable signatures (separability), and the data must be precise enough to resolve that difference (a resolvability margin — the separation between the true signature and the nearest competing one must exceed the achievable estimation tolerance, and the detection margin must exceed the observation noise). When both hold, the nearest-signature classifier is consistent for the true class. When the margin fails, the result is set-identification: the estimate belongs to the inert–stabilized compatible pair, and the criterion flags the unresolved contrast for targeted follow-up rather than forcing a unique label.
Reproducibility
Run in an extracted copy, because generation overwrites the figures and macros:
- Install Python 3.10+ with the required packages:
pip install numpy matplotlib
- Run the master script:
python make_all.py
The Monte Carlo can take a few minutes. Any missing or changed manifest entry fails the run. - To check integrity without regenerating:
python -c "from pathlib import Path; from make_all import verify_manifest; verify_manifest(Path('.'), Path('SHA256SUMS'))"
The generated macro files (macros_fig.tex, macros_mc.tex) and figures reproduce byte-identically in a fixed environment.
Citation
The paper and this software archive are separate works; please cite both.
Paper:
Andrée, B. P. J. (2026). Identifiable Uniqueness of Impulsively Forced, Inert, and Stabilized Body Trajectories. Working paper.
Software (this package):
Andrée, B. P. J. (2026). Identifiable Uniqueness of Impulsively Forced, Inert, and Stabilized Body Trajectories — replication code. Zenodo. https://doi.org/10.5281/zenodo.22876267
License
This project is licensed under the Creative Commons Attribution 4.0 International License. See the LICENSE file for details.
Files
fig_authority.pdf
Files
(151.7 kB)
| Name | Size | |
|---|---|---|
|
md5:967184dd6f7b760f47bc141bf4f8f041
|
27.4 kB | Preview Download |
|
md5:84d3a2626d10af020e4f8052b98345c1
|
11.8 kB | Download |
|
md5:39d610360792e8a057e0e3ecffd94f30
|
33.3 kB | Preview Download |
|
md5:138fe9941191c416fd70e2e0eb20d8d7
|
20.7 kB | Download |
|
md5:b96fb6f355d65c1d9bba1fad1db45c4e
|
1.1 kB | Download |
|
md5:a0ab75ac4432491c963e7658fbcad9a5
|
280 Bytes | Download |
|
md5:977e832420981a31ca9f7732a5490403
|
3.1 kB | Download |
|
md5:200217e28fdd4b39a5aa174c7e80fc75
|
2.6 kB | Download |
|
md5:2873bfa09cd895e1219d49a193edf33a
|
23.3 kB | Download |
|
md5:8dabd07f027446a5cd2cea5052bd88e5
|
15.6 kB | Download |
|
md5:1b35376e6349788635b2cf0d480e7760
|
11.7 kB | Preview Download |
|
md5:e5e5bf6fc0cda74a8f44f704491d6b7d
|
881 Bytes | Download |
Additional details
Dates
- Created
-
2026-09-21
Software
- Programming language
- Python