The executable protocol lives in scripts/reproduce.py; do not edit measured tables by hand.
Each controller uses its documented fixed nominal tuning and receives the same observations.
Runs start from zero inductor current, zero AC capacitor voltage, and (when present) zero
rectifier capacitor voltage. The reference ramps smoothly for 20 ms.
| Scenario | Change |
|---|---|
| nominal | 400 V DC; 50 Ω load |
| load-step | R: 50 → 25 Ω at 100 ms |
| dc-sag | DC: 400 → 360 V at 100 ms |
| noise | Independent Gaussian voltage noise σ=0.5 V and two current noises σ=0.02 A |
| mismatch | Actual L=2.6 mH, C=16 µF from startup; controllers retain nominal L/C |
| delay | One 50 µs sample of modulation-command delay from startup |
| nonlinear | AC resistance plus diode bridge and dynamic RC load |
| combined | Load/DC steps plus noise, L/C mismatch and one-sample delay |
All default runs last 240 ms with 5 µs state recording and seed 7. CLI changes to the nominal R, L, C or DC bus redefine the nominal study point; the named scenarios then apply their multiplicative factors to it. Scenario descriptions above refer to defaults.
Steady RMSE is sqrt(mean((r − v)²)) over the final five complete cycles,
[140,240) ms for defaults. Full-run RMSE covers [0,240) ms, including startup.
The output RMS is measured directly in the same final-cycle window; fundamental RMS
comes from the spectrum. Peak current includes startup and disturbances.
THD is 100 sqrt(V₂² + … + V₄₀²) / V₁, where Vh is the RMS amplitude of harmonic
h. Analysis uses a rectangular, coherent, integer-cycle window, no resampling, and no
duplicated endpoint. The frequency ratio is validated; frequencies must align with FFT
bins, and the requested harmonic bandwidth must lie below Nyquist. A missing fundamental
returns null, not a misleading zero distortion. This is a clearly defined research
THD metric, not a claim of IEC/IEEE compliance.
Broadband residual RMS is the total AC RMS power after subtracting the fundamental. It includes carrier ripple and interharmonics present in the recorded state signal; THD through harmonic 40 does not. This allows averaged and switched results to be interpreted without pretending the averaged model contains switching ripple. The NumPy FFT convention is used, with one-sided RMS scaling and separate DC/Nyquist treatment.
Settling time is based on a trailing one-cycle RMS of instantaneous tracking error.
The band is 2% of requested RMS voltage (4.6 V by default). The qualifying window must
begin after the origin and remain inside the band until the end of the run, with at least
one more full cycle available to confirm it. The reported time is measured from the
event (100 ms in load/DC/combined cases) or the end of the soft start (20 ms otherwise).
Consequently, the minimum reported value is one fundamental cycle. null / “not settled”
means the criterion was not established within the finite observation horizon. It is
not a proof that the controller can never settle.
Actuation and compute diagnostics include the fraction of commanded samples at the
modulation limit, peak inductor current, median/p99 controller compute time, adaptive gain
range (for SMC variants), QP iteration range (for MPC), and solver fallback count. Timings
are host dependent; Python timings do not establish a real-time deadline guarantee.
clipped_requests counts requests changed by the shared limiter; MPC may satisfy its
bounds inside the QP without needing such clipping. Use saturation_fraction to compare
the fraction of commands at the actuator limit across all four controllers.
python -m pip install -e ".[dev]"
python scripts/reproduce.py
python scripts/validate_numerics.py
python -m pytestartifacts/reference/ contains machine-readable metrics, configurations, a source-code
SHA-256 and dependency versions. Full waveforms are generated by the CLI into results/
and excluded from Git by default. requirements-repro.txt pins the Python 3.13 direct numerical
dependencies used for the checked-in snapshot; each run.json records their versions.
Different BLAS libraries, CPUs or solver versions can create small numerical differences;
CPU timings will differ substantially.
The mild DC-sag case may look almost identical to nominal operation: the measured bus is used immediately to normalize requested bridge voltage to duty, and this sag retains enough voltage headroom. Deeper saturation and a delayed/noisy bus measurement would be different experiments. Zero or near-zero nominal averaged-model THD is expected for linear sinusoidal operation; it does not represent a measured hardware distortion floor.
The gains were selected with inspection of this scenario suite. These results characterize the included experiments, not held-out generalization or an unbiased tuning competition. The report does not enforce a preselected ordering of controllers. Inspect nominal tracking, disturbance response, noise, delay and nonlinear-load results together. Nominal low THD alone is insufficient evidence of robustness. The single default noise seed is a reproducibility fixture, not a statistical confidence interval; use multiple seeds for any probabilistic performance claim.