Skip to content

Control Systems Stability

Two real linear systems, not a downloaded dataset: real physics and real, cited engineering, in the same spirit as Dynamical Systems & Chaos: Stephen Boyd’s Stanford EE263 Boeing 747 longitudinal-dynamics example (cruise, 40,000ft / 774 ft/s), and an asymmetric two-stage passive RC lowpass filter cascade derived directly from Kirchhoff’s current law, with real standard E12-series component values.

MATRIX boeing747 = [[-0.003, 0.039, 0, -0.322], [-0.065, -0.319, 7.74, 0], [0.020, -0.101, -0.429, 0], [0, 0, 1, 0]]
LET eigs = EIGENVALUES_GENERAL boeing747

Returns -0.3750±0.8818j (the short-period mode) and -0.0005±0.0674j (the phugoid mode), matching Boyd’s own published values, and numpy.linalg.eigvals, exactly. Both modes are stable (negative real part) but lightly damped (nonzero imaginary part, genuine oscillation): the short-period mode has a ~7-second period, the phugoid mode a ~93-second period, both real, well-known aircraft handling-qualities concepts.

EIGEN_GENERAL correctly refuses to compute eigenvectors for this matrix: its eigenvalues are genuinely complex, and EIGEN_GENERAL is deliberately scoped to the real-eigenvalue case only (no public general complex-eigenvector API exists in the underlying linear-algebra library). A loud, documented error, not a silently wrong real approximation: exactly the design boundary this use case exists to demonstrate.

The scalar Complex type, on the same real eigenvalues

Section titled “The scalar Complex type, on the same real eigenvalues”
SELECT COMPLEX(-0.3750, 0.8818) AS short_period,
ABS(COMPLEX(-0.3750, 0.8818)) AS natural_frequency,
PHASE(COMPLEX(-0.3750, 0.8818)) AS phase_angle

ABS/PHASE recover the mode’s natural frequency and damping angle directly from the Complex scalar, cross-checked against Python’s own cmath.polar on the same complex number, exactly.

Real eigenvectors, on a genuinely non-symmetric matrix

Section titled “Real eigenvectors, on a genuinely non-symmetric matrix”
MATRIX rc_filter = [[-3127.66, 2127.66], [967.12, -967.12]]
LET vals, vecs = EIGEN_GENERAL rc_filter

A two-stage RC lowpass cascade (R1=10kΩ/C1=100nF, R2=4.7kΩ/C2=220nF, deliberately mismatched stages, so the resulting state matrix is genuinely asymmetric) gives real eigenvalues -3843.13 and -251.65: two real time constants (~260 microseconds and ~3.97 milliseconds), physically guaranteed real since a passive RC network with no inductance can’t resonate. Eigenvectors match numpy.linalg.eig exactly, and A·v = λ·v is verified directly via linaldb’s own MATMUL.

Plain EIGEN correctly refuses this matrix ("matrix is not symmetric"). This is the direct motivating contrast for why EIGEN_GENERAL exists: real non-symmetric physical systems (aircraft, circuits, mechanical linkages) are the norm in engineering, not the exception the old symmetric-only EIGEN alone could handle.