Skip to content

Releases: PlantControl/controlsys

v1.12.0 — Thiran follow-ups: short delays, faster bank, MIMO path delays

Choose a tag to compare

@jamestjsp jamestjsp released this 03 Oct 14:51
47f7579
  • 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

Choose a tag to compare

@jamestjsp jamestjsp released this 03 Oct 14:50
df86d39
  • Conversion methods: ZOH, triangle FOH, Tustin with prewarp, matched, impulse and least-squares C2D, with reverse conversion (D2C) and resampling (D2D).
  • Delays: Thiran ThiranOrder is a maximum order min(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. DelayModeling is either delay or state.
  • DiscretizeWithResult/D2CWithResult/D2DWithResult return ConversionResult: initial-state map, Approximate flag and warnings, including delay rounding or Thiran approximation.
  • Behaviour changes: ZOH no longer accepts Thiran. Thiran keeps the whole-sample remainder as a delay. D22 internal 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 γ

Choose a tag to compare

@jamestjsp jamestjsp released this 27 Sep 12:37
1bb229f
  • 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

Choose a tag to compare

@jamestjsp jamestjsp released this 03 Oct 14:53
3363231
  • Module path changed from github.com/jamestjsp/controlsys to plantcontrol.org/v1/controlsys. Update import paths; the old path stays at v1.8.0.
  • Linear algebra switched from gonum.org/v1/gonum v0.15.0 to the plantcontrol.org/v1/gonum v0.20.0 fork. Matrix types in the API now come from plantcontrol.org/v1/gonum/mat.
  • Go source changes are import paths only. Numerical results can still differ slightly because the gonum version changed.

Includes PRs #177 and #178.

v1.8.0 — One-gain PID tuning takes the plant's phase margin

Choose a tag to compare

@jamestjsp jamestjsp released this 26 Sep 22:45
  • 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.

Includes PRs #175 and #176.

v1.7.0 — HinfSyn D11 ≠ 0 synthesis; HinfSyn/HinfNorm accuracy

Choose a tag to compare

@jamestjsp jamestjsp released this 26 Sep 18:23
  • 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

Choose a tag to compare

@jamestjsp jamestjsp released this 26 Sep 16:54
  • 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

Choose a tag to compare

@jamestjsp jamestjsp released this 26 Sep 16:54
  • 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

Choose a tag to compare

@jamestjsp jamestjsp released this 13 Sep 01:24

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-fork

Go 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

Choose a tag to compare

@jamestjsp jamestjsp released this 26 Aug 01:37
fdda4f1

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 FreqResponsePointwise results 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=1
  • go test -race -count=1 ./...
  • Main-branch GitHub CI passed on the release commit.

Merged pull request

  • #170 Reuse delay matrices across FreqResponsePointwise frequency points

Full changelog: v1.4.0...v1.5.0