Skip to content

Latest commit

 

History

History
91 lines (76 loc) · 5.34 KB

benchmark.md

File metadata and controls

91 lines (76 loc) · 5.34 KB

Benchmark protocol

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.

Scenarios

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.

Metric definitions

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.

Reproducing and interpreting results

python -m pip install -e ".[dev]"
python scripts/reproduce.py
python scripts/validate_numerics.py
python -m pytest

artifacts/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.