Releases: PlantControl/controlsys
Release list
v1.12.0 — Thiran follow-ups: short delays, faster bank, MIMO path delays
ThiranDelay: an explicit order N now accepts any stable delay D > N-1 samples (was D >= N-0.5). Integer D returns the exact delay for any order; for example,ThiranDelay(0.1, 3, 0.1)now returns a one-sample delay instead of an error.- Tustin/matched with Thiran now convert MIMO path delays that cannot be split per input and output. Each fractional row or column gets its own model copy with Thiran filters, and whole-sample remainders stay as discrete path delays. A channel's filter is the product of its input, leftover and output filters, which differs at higher frequencies from MATLAB's single filter on the total transfer-function delay.
- Performance: the Thiran bank is composed directly. Tustin+Thiran C2D is about 30% faster than v1.11.0 and allocates 160→100 times per call; paths without delays are unchanged.
Includes PR #181.
v1.11.0 — MATLAB-parity C2D/D2C/D2D conversion
- Conversion methods: ZOH, triangle FOH, Tustin with prewarp, matched, impulse and least-squares C2D, with reverse conversion (D2C) and resampling (D2D).
- Delays: Thiran
ThiranOrderis a maximum ordermin(ceil(D), ThiranOrder)with the integer remainder kept exact. Thiran filters also apply to internal feedback delays. Fractional internal delays are supported under ZOH/FOH.DelayModelingis eitherdelayorstate. DiscretizeWithResult/D2CWithResult/D2DWithResultreturnConversionResult: initial-state map,Approximateflag and warnings, including delay rounding or Thiran approximation.- Behaviour changes: ZOH no longer accepts Thiran. Thiran keeps the whole-sample remainder as a delay.
D22internal feedthrough with positive delays is accepted (matches MATLAB). - Evidence matrix in
docs/conversion-compatibility.md. Tustin+Thiran is slower than v1.10.0 because it now follows the MATLAB delay split. It went from 2.52µs to 4.09µs; v1.12.0 brings it back to 2.84µs.
Includes PR #180.
v1.10.0 — HinfSyn controller meets its reported γ
- HinfSyn: the central controller is now built at γ·(1+1e-4) above the bisection edge instead of at the edge, where X/Y blow up and the ill-conditioned K overshot its own GammaOpt (~9e-6 relative, all arches). GammaOpt is now the γ the returned K meets, within 1e-4 of the smallest achievable.
Includes PR #179.
v1.9.0 — Module moves to plantcontrol.org/v1/controlsys
- Module path changed from
github.com/jamestjsp/controlsystoplantcontrol.org/v1/controlsys. Update import paths; the old path stays at v1.8.0. - Linear algebra switched from
gonum.org/v1/gonumv0.15.0 to theplantcontrol.org/v1/gonumv0.20.0 fork. Matrix types in the API now come fromplantcontrol.org/v1/gonum/mat. - Go source changes are import paths only. Numerical results can still differ slightly because the gonum version changed.
v1.8.0 — One-gain PID tuning takes the plant's phase margin
- TunePID/TunePIDFRD: P and I controllers with no phase margin given (0) now tune the gain for the crossover and take the margin the plant gives there, instead of the 60° default that was unattainable for almost every plant. An explicit PhaseMargin behaves as before.
- With a model-based stability certificate, a one-gain design is accepted at every stable crossover and reports its lowest margin; sampled FRD and exact-delay designs keep the requested-margin floor.
v1.7.0 — HinfSyn D11 ≠ 0 synthesis; HinfSyn/HinfNorm accuracy
- HinfSyn: correct H∞ synthesis for D11 ≠ 0 (Glover–Doyle general formulas); the controller may now have feedthrough (K.D ≠ 0).
- HinfSyn: γ no longer drops below the optimum on jω-axis Hamiltonian eigenvalues; stiff and lightly damped plants handled; zero-optimum bisection has an absolute floor.
- HinfNorm: no longer overestimates on high-order systems (pointwise σ̄ with confirmed crossings).
- D11 = 0 results are bitwise identical to v1.6.1.
Includes PR #174.
v1.6.1 — HinfSyn/H2Syn direct-feedthrough support
- HinfSyn: central controller was missing the γ⁻²·D21·B1ᵀ·X observer term; for plants with B1·D21ᵀ ≠ 0 (all mixed-sensitivity plants) the closed loop exceeded the reported γ. Controllers for those plants change; others are bitwise identical.
- HinfSyn and H2Syn handle D22 ≠ 0 via loop shift (K = K0(I + D22·K0)⁻¹); closed loop, γ and H2 norm unchanged; always well-posed.
- ErrH2DirectFeedthrough is deprecated; H2Syn no longer returns it.
v1.6.0 — PID tuning evidence and arbitrary-input identification
- Bounded PID tuning with focus, free weights and direct FRD designs
- Independent PID integral and derivative formulas
- Process and general state-space identification from arbitrary input records
- Fix: ideal-derivative PID stability rejects hidden unstable modes
- Fix: lag-one residual metric is a Pearson correlation in [-1, 1]
v1.5.1 — Update Gonum dependency
Updates the required Gonum fork to v0.19.0-fork, including LAPACK scaling fixes and intervening BLAS updates. Installation instructions, CI, and the local downstream-consumer action use the same dependency version.
Requires Go 1.27.1 or newer (previous minimum: Go 1.26.3). Applications importing controlsys must set their own replacement because dependency replace directives do not propagate:
replace gonum.org/v1/gonum => github.com/jamestjsp/gonum v0.19.0-forkGo 1.27.1 substantially reduces the large older-toolchain performance regressions. Ten interleaved samples across 236 benchmarks show a 1.07% timing-geomean improvement on Apple M1 Pro at eight workers. Longer follow-up still confirms SISO frequency-response generation +6.17%, internal-delay simulation +4.38%, and SISO delayed simulation +3.38%. The original MatLog/D2C/Stabsep regressions shrink to roughly 0.5–1.1%. DC motor simulation improves 13.29% and regulator construction 25.20% in the follow-up.
Full performance report and evidence. These measurements do not establish performance on other hardware or worker counts.
Validation: full uncached tests, race tests, go fix, go vet, go build, external-consumer test, and CI passed on the Go 1.27.1 update. CLI govulncheck v1.8.0 reports no vulnerabilities.
Includes PR #171, rebase-merged at bcee41b7dd48ffeb14576a77ae3ac8c69efd450d. The release tree matches the tested PR head. Remaining performance differences are tracked in Gonum issue #10.
v1.5.0 — Efficient pointwise delay sweeps
Highlights
- Reuse the effective input/output delay matrix across all frequency points evaluated by
System.FreqResponsePointwise. - Keep delayed sweep allocations constant as the frequency grid grows instead of rebuilding a slice and dense-matrix header for every point.
- Construct the transfer-function fallback delay matrix lazily, only if a state-space solve fails at an individual frequency.
- Preserve the existing bit-identical single-point arithmetic contract; the optimization changes allocation ownership, not per-frequency numerical operations.
Compatibility notes
- This release changes no public API or caller workflow.
- Existing
FreqResponsePointwiseresults and fallback behavior remain unchanged. - The module path remains
github.com/jamestjsp/controlsys.
Validation
- Release commit:
fdda4f150d13b34a969de7faed6ae896e827ce94 go fix ./...go vet ./...go build ./...go test -v -count=1go test -race -count=1 ./...- Main-branch GitHub CI passed on the release commit.
Merged pull request
- #170 Reuse delay matrices across
FreqResponsePointwisefrequency points
Full changelog: v1.4.0...v1.5.0