Skip to content

Pedagogy: add 60_linear_algebra_2/225 — QZ algorithm with a genuine engineering example #443

@kwlee2025cpp

Description

@kwlee2025cpp

Context

The eigenvalue arc in 60_linear_algebra_2 now runs: 200 Power → 210 Jacobi → 212 Generalized eig (scipy.linalg.eigh) → 220 QR → 222 vibration (state-space + QR, mode shapes). 220 already teases the QZ algorithm (Moler & Stewart, 1973) as the generalized-eigenproblem extension of QR. A 225 notebook would complete the arc by actually doing QZ — on a genuine engineering example.

The catch (why the obvious example doesn't motivate QZ)

QZ (scipy.linalg.eig on a matrix pencil) is only genuinely needed when you cannot reduce to a symmetric-definite standard problem. The tempting example — K φ = ω² M φ with a massless DOF (singular M) — is not a clean QZ case: since K is SPD you can just swap roles, eigh(M, K) solves M φ = (1/ω²) K φ cleanly, and the massless mode appears as 1/ω² = 0. Verified.

QZ is genuinely forced only when the pencil is non-symmetric, or when neither matrix can serve as an SPD B (both singular/indefinite).

A verified bridge from 222

222 inverts M to build the state-space matrix and runs QR. If a DOF is massless, M⁻¹ doesn't exist — the QR state-space can't even be formed. Writing the system in descriptor form E ż =  z with E = diag(I, M) singular and  non-symmetric forces QZ. Verified: eigh can't apply, M⁻¹ raises LinAlgError, and eig(Â, E) returns the finite mode (ω ≈ 18.97 rad/s) plus genuine inf eigenvalues for the massless coordinate.

Candidate engineering examples (pick one)

  1. Massless-DOF descriptor — extends 222 directly; non-symmetric pencil + singular E; the ∞ eigenvalue = a massless/quasi-static DOF. Lightest, most continuous with the existing thread. (verified)
  2. Buckling / critical loadK x = λ K_G x, λ = critical load factor (when does the column/frame buckle); geometric stiffness K_G is indefinite/singular; non-buckling modes appear as λ = ∞. Very tangible engineering meaning, but needs a small geometric-stiffness model built from scratch.
  3. Rotordynamics (gyroscopic whirl)M ẍ + G ẋ + K x = 0 with skew-symmetric gyroscopic G → genuinely non-symmetric generalized eigenproblem; whirl frequencies split with spin speed (Campbell diagram). Most obviously "needs QZ", but heaviest (quadratic eigenproblem, complex modes).

Done =

A bilingual 60_linear_algebra_2/225 notebook that:

  • states the generalized problem A x = λ B x,
  • shows why eigh/reduction fail on the chosen example,
  • solves with scipy.linalg.eig / scipy.linalg.ordqz, exposing the α/β representation,
  • interprets the infinite (and/or complex) eigenvalues physically,
  • notes B = I recovers the QR algorithm,
  • uses concept-name cross-references only (renumber-proof),
  • is added to the 60 link-page and verified headless (CI=true jupyter nbconvert --execute).

Recommendation: option 1 for continuity with 212/222; option 2 if a more tangible engineering hook is preferred. Decision deferred (parked here from the 2026-06-01 session).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions