determin.ant
06-eigenvalues / 6.3

Module 6: Eigenvalues

Complex Eigenvalues

Where you'll see this: whether a control system is stable depends on the eigenvalues of its state matrix. Complex eigenvalues with negative real part → oscillating but converging (stable). Positive real part → oscillating and diverging (unstable). Every autopilot, robot arm, and PID controller is designed around this.

Not all matrices have real eigenvectors. When the characteristic polynomial has no real roots, the eigenvalues come in complex conjugate pairs — and the geometric behavior becomes rotational rather than stretching.

When eigenvalues are complex

If the discriminant Δ=tr(A)24det(A)<0\Delta = \text{tr}(A)^2 - 4\det(A) < 0, the eigenvalues are:

λ=tr(A)2±Δ2i\lambda = \frac{\text{tr}(A)}{2} \pm \frac{\sqrt{|\Delta|}}{2} i

These are complex conjugates: λ=a±bi\lambda = a \pm bi. The real part a controls growth/decay; the imaginary part b controls rotation.

The modulus determines stability

The modulus (magnitude) of the complex eigenvalue is:

λ=a2+b2=det(A)|\lambda| = \sqrt{a^2 + b^2} = \sqrt{\det(A)}

Apply the matrix repeatedly — points orbit the origin:

  • λ=1|\lambda| = 1: pure rotation, orbits stay on a circle
  • λ>1|\lambda| > 1: spiral outward (unstable)
  • λ<1|\lambda| < 1: spiral inward, converges to zero (stable)
Complex eigenvalues = rotation + scaling. The real part is growth/decay; the imaginary part is the angular speed. |λ| < 1 is the stability criterion.

The rotation angle

The angle of rotation per step is θ=arctan(b/a)\theta = \arctan(b/a) — the argument of the complex eigenvalue. A rotation matrix of angle θ has eigenvaluese±iθ=cosθ±isinθe^{\pm i\theta} = \cos\theta \pm i\sin\theta.

Try it

Pick a preset and watch how points spiral (or orbit) under repeated application of the matrix. The dashed circle is the starting unit circle. Use the steps slider to see long-term behavior.

Stability check in NumPy:
import numpy as np

A = np.array([[0.8, -0.4], [0.4, 0.8]])
eigenvalues = np.linalg.eigvals(A)

for lam in eigenvalues:
    print(f"λ = {lam:.3f}, |λ| = {abs(lam):.3f}")
# λ = 0.800+0.400j, |λ| = 0.894 → stable (spirals in)
The Characteristic PolynomialDiagonalization

Complex eigenvalues: λ = 1.1 ± 0.5i

|λ| = 1.208

|λ| > 1 — spirals outward