“Know how to solve every problem that has been solved.” “What I cannot create, I do not understand.” — Richard Feynman

Padé via Lanczos (Feldmann & Freund 1995): faithful reproduction

Circuits

Padé via Lanczos (PVL) is the algorithm Feldmann and Freund published in 1995 to fix the numerical disaster that was Asymptotic Waveform Evaluation (AWE). AWE had been the workhorse for fast linear-circuit transfer-function approximation since Pillage and Rohrer 1990, but everyone in the room knew it broke down past about poles — the explicit moment matrix became so ill-conditioned that any further Padé coefficients were noise. F&F's contribution was to realize that the same Padé approximant could be assembled without ever forming the moment matrix, by running a Lanczos iteration on the same operator and reading the approximant off directly from the tridiagonalization. This page reproduces the paper's two key diagnostic experiments — AWE moment-matrix condition numbers blowing up, PVL convergence to machine precision — on a small symmetric RC pencil, and walks through the F&F section 4 derivation that makes the Lanczos↔Padé identity precise.

This is the paper-faithful companion to /circuits/lanczos_mor, which builds the same Krylov-subspace machinery as a continued fraction in the symmetric case. The two pages use the same RC ladder; the difference is in framing. The MOR page emphasizes the physics (where do the Ritz values land in the spectrum, why do short chains miss the low-frequency mode); this page emphasizes the algorithm (why AWE failed, how PVL routes around the failure, and what the underlying algebra of the Padé identity is).

Setup: MNA descriptor form and the transfer function

Following F&F section 2: a lumped linear time-invariant circuit obeys the descriptor-form ODE

collects memoryless elements (resistors, algebraic constraints, sources), collects memory elements (capacitors, inductors), is the input selector, and is the output projection. Laplace-transform and rearrange to get the transfer function as a matrix element of the resolvent of the pencil :

For an interconnect mesh, the pencil is huge — millions of nodes — and you need across many decades of frequency. Re-factoring at every is out of the question; you want a reduced rational approximation valid across the operating band.

Change of variables: shift to an expansion point

Pick in the operating band of interest (real, typically). Provided is invertible, change variables to and define

Algebra gives

Taylor-expand the resolvent around :

The moments are what AWE tries to compute explicitly. They're available via the recursive solve with , then . One LU factorization, then triangular solves to get through . So far so good.

The Padé approximant — what it is, what AWE tries to do

The Padé approximant of in F&F's convention is the rational function

whose Taylor expansion matches in the first coefficients. That's the Padé entry, and it's the natural choice for a transfer function that decays to zero at high frequency.

AWE solves for the coefficients via the moment Hankel system

then roots the denominator polynomial to get the poles, and reads off residues via another linear solve.

Why AWE fails: the moments collapse onto one eigenvalue

The vectors AWE generates are exactly the right Krylov sequence for starting from . Power iteration: they converge to an eigenvector of corresponding to the eigenvalue of with largest magnitude. So the moments rapidly collapse to information about that one eigenvalue — and you can't extract distinct poles from a sequence that only knows about one.

The symptom is in the condition number of the moment matrix . Build a small symmetric RC ladder (200 nodes, , ), expand around , and compute the AWE condition numbers up to :

import numpy as np
import scipy.linalg as sla
import scipy.sparse as sp
import scipy.sparse.linalg as spla

# Symmetric RC ladder: the simplest pencil where the AWE-vs-PVL story is
# visible. F&F's algorithm extends to non-symmetric (G, C) via biorthogonal
# Lanczos with separate left and right starting vectors — the math
# specializes here because the pencil is symmetric.
N = 200
R = 1.0; C = 1e-9
g = 1.0 / R
diag = np.full(N, 2.0 * g); diag[0] = g; diag[-1] = g; diag += 1e-9
off = np.full(N - 1, -g)
G  = sp.diags([off, diag, off], [-1, 0, 1], format='csr')
Cm = sp.diags([C] * N, format='csr')
b  = np.zeros(N); b[0] = 1.0     # current source at node 0
l  = np.zeros(N); l[0] = 1.0     # observe voltage at node 0 (driving-point Z)
# AWE: compute moments  m_k = l^T A^k r  where  A = -(G + s0 C)^{-1} C,
# then form the Hankel moment matrix M_q[j,k] = m_{j+k} and try to solve
# for the Pade denominator coefficients.

def awe_moments(G, Cm, b, l, s0, K):
    M_pencil = (G + s0 * Cm).tocsc()
    LU = spla.splu(M_pencil)
    r = LU.solve(b)
    u = r.copy()
    m = [float(l @ u)]
    for _ in range(1, K):
        u = -LU.solve(Cm @ u)            # u_k = A^k r
        m.append(float(l @ u))
    return np.array(m)

s0 = 1e6                                  # expansion point, in the operating band
moments = awe_moments(G, Cm, b, l, s0, 2 * 16)
print("AWE moment-matrix condition numbers")
print(f"{'q':>4}  {'cond(M_q)':>16}")
for q in [2, 4, 6, 8, 10, 12, 14, 16]:
    M_q = np.array([[moments[j + k] for k in range(q)] for j in range(q)])
    print(f"{q:>4}  {np.linalg.cond(M_q):>16.3e}")
AWE moment-matrix condition numbers
   q         cond(M_q)
   2         8.123e+12
   4         1.681e+39
   6         1.267e+66
   8         3.492e+94
  10        1.842e+123
  12        1.478e+146
  14        2.692e+171
  16        3.058e+195

Same shape as F&F Table 1: at , climbing past by . Each factor-of-10 increase in is one more decimal digit of accuracy lost when solving the Hankel system. By the system is solvable only in the formal sense — the numerical answer is dominated by round-off.

Verify the consequence: try to extract the poles by solving the Hankel system and rooting the denominator.

# AWE attempts to extract poles by solving the Hankel system for the
# denominator polynomial and rooting it.

print(f"{'q':>4}  {'cond(M_q)':>14}  {'pole extraction result':>40}")
for q in [4, 8, 12, 16]:
    M_q = np.array([[moments[j + k] for k in range(q)] for j in range(q)])
    rhs = -moments[q:2 * q]
    try:
        denom_coeffs = np.linalg.solve(M_q, rhs)
        poly = np.concatenate([denom_coeffs[::-1], [1.0]])
        poles = np.roots(poly)
        n_real = sum(1 for p in poles if abs(p.imag) < 1e-10 * abs(p.real))
        msg = f"{n_real}/{q} poles real; max|pole| = {np.max(np.abs(poles)):.2e}"
    except np.linalg.LinAlgError:
        msg = "SINGULAR Hankel system"
    print(f"{q:>4}  {np.linalg.cond(M_q):>14.2e}  {msg:>40}")
   q       cond(M_q)                  pole extraction result
   4        1.68e+39      0/4 poles real; max|pole| = 2.63e+01
   8        3.49e+94      0/8 poles real; max|pole| = 4.91e+00
  12       1.48e+146     0/12 poles real; max|pole| = 3.22e+00
  16       3.06e+195     0/16 poles real; max|pole| = 2.20e+00

For this pencil all true poles of are real (the poles are at where are eigenvalues of the symmetrized Cholesky-conjugated , which is symmetric positive-definite). AWE returns zero real poles out of at every order tested. The Hankel-system solve is so corrupted that the resulting denominator polynomial doesn't have a single real root in the right ballpark. The numerical Padé approximant is garbage.

The PVL idea: route the same Padé approximant through Lanczos

F&F's observation: there's another way to compute the same Padé approximant that doesn't form at all. Run a Lanczos iteration on . In F&F's general non-Hermitian setting that means biorthogonal Lanczos (Algorithm 1 in the paper), with right starting vector and left starting vector :

With biorthogonality (diagonal). Then F&F show — and the derivation walk below reproduces step by step — that the Padé approximant of equals

No moment matrix. No Hankel system. The Padé coefficients are implicit in the Lanczos tridiagonal . Diagonalize and you have the poles and residues directly: , with and . F&F's Algorithm 2.

Derivation walk: from the Lanczos relations to the Padé identity

This is F&F section 4 spelled out in algebraic moves. Each step names the move so you can verify mentally instead of pattern-matching. Toggle "Every step" to see the micro algebra; use arrow keys to step.

What you'll see: the right and left Lanczos relations get pushed against the moment until biorthogonality collapses the inner factors and the moment becomes . Summing the Taylor series of with this substitution gives the closed-form PVL formula, and an eigendecomp of splits it into pole-residue form.
Step 1 of 15 · ← → keys to navigate
Step 1
The right Lanczos relation from Feldmann-Freund Algorithm 1. is the matrix of right Lanczos vectors built from starting vector . The tridiagonal carries the Lanczos 's on the diagonal and 's/'s on the off-diagonals. The trailing column is the residual that hasn't been absorbed yet.

PVL demo: convergence to machine precision

The same RC ladder, same expansion point. PVL specialized to the symmetric pencil collapses to a symmetric Lanczos run (the biorthogonal vectors become equal up to scaling) on the Cholesky-symmetrized . The full non-symmetric F&F algorithm — needed for general circuits with inductors that break symmetry — uses biorthogonal Lanczos with two starting vectors. The Lanczos↔Padé identity derived above doesn't care about symmetry; the simplification is purely algorithmic.

# PVL on the symmetric pencil (F&F section 4 specialized to G = G^T, C = C^T).
# Symmetrize:  C = L L^T  (diagonal, so L = sqrt(C))
#              K = L^{-1} G L^{-T}  (sparse, symmetric, positive-definite)
#              (G + s C) = L (K + s I) L^T
# Run symmetric Lanczos on  A_sym = -(K + s0 I)^{-1}  starting from
# y_0 = (K + s0 I)^{-1} bp,  bp = L^{-1} b.

def lanczos_symmetric(matvec, v0, n_iter):
    alphas, betas, Q = [], [], [v0.copy()]
    q_prev = np.zeros_like(v0); q = v0.copy(); beta_prev = 0.0
    for j in range(n_iter):
        w = matvec(q)
        alpha = float(q @ w)
        w = w - alpha * q - beta_prev * q_prev
        for qk in Q[:-1]:                    # full reorthogonalization
            w -= float(qk @ w) * qk
        beta = float(np.linalg.norm(w))
        alphas.append(alpha)
        if beta < 1e-14:
            break
        if j < n_iter - 1:
            betas.append(beta)
            q_prev = q; q = w / beta
            Q.append(q.copy())
    return np.array(alphas), np.array(betas), np.column_stack(Q)

def pvl(s_grid, G, Cm, b, l, s0, q):
    sqrtC = np.sqrt(Cm.diagonal()); Linv = 1.0 / sqrtC
    K = (sp.diags(Linv) @ G @ sp.diags(Linv)).tocsc()
    K_plus = (K + s0 * sp.diags(np.ones(K.shape[0]))).tocsc()
    LU = spla.splu(K_plus)
    bp = Linv * b; lp = Linv * l
    y0 = LU.solve(bp); norm_y0 = np.linalg.norm(y0)
    v0 = y0 / norm_y0
    alphas, betas, V = lanczos_symmetric(lambda x: -LU.solve(x), v0, q)
    T = np.diag(alphas) + np.diag(betas, 1) + np.diag(betas, -1)
    coeff_row = norm_y0 * (lp @ V)
    eigvals, S = sla.eigh(T)
    e1 = np.zeros(T.shape[0]); e1[0] = 1.0
    cS = coeff_row @ S
    Se1 = S.T @ e1
    H_q = np.zeros(len(s_grid), dtype=complex)
    for i, s in enumerate(s_grid):
        sigma = s - s0
        H_q[i] = np.sum(cS * Se1 / (1.0 - sigma * eigvals))
    return H_q

omegas = np.logspace(3, 9, 200)
H_ref = np.array([complex(l @ spla.spsolve((G + 1j * w * Cm).tocsc(), b))
                   for w in omegas])
print("PVL transfer-function convergence")
print(f"{'q':>4}  {'max rel error':>16}")
for q in [4, 8, 16, 32, 64, 128]:
    Hq = pvl(1j * omegas, G, Cm, b, l, s0, q)
    rel_err = np.max(np.abs(Hq - H_ref)) / np.max(np.abs(H_ref))
    print(f"{q:>4}  {rel_err:>16.3e}")
PVL transfer-function convergence
   q     max rel error
   4         9.798e-01
   8         1.560e-04
  16         1.297e-05
  32         4.115e-10
  64         1.623e-10
 128         1.625e-10

Compare with the AWE table from above. AWE's moment matrix at has condition number and produces zero real poles out of 16. PVL at matches the direct sparse solve to ten significant digits. Same problem, same pencil, same expansion point — different algorithm.

Two things to notice about the convergence. First, the dip at is wild (almost 100% error) because the Krylov subspace hasn't reached the low-eigenvalue mode that dominates low-frequency impedance (this is the failure mode the MOR page diagnoses in detail). Second, once is large enough to capture the relevant spectrum, convergence is essentially limited by round-off ( for double precision plus a moderately conditioned problem). That's the PVL story: monotone, predictable, controlled by problem geometry rather than by numerical degradation of the algorithm.

Pole-quality bound

PVL produces both the approximant and a quality measure on the poles. The poles are in the shifted variable, with eigenvalues of . These are Ritz values of in the Krylov basis. Each Ritz pair with has an explicit residual

where is the last component of . Taking norms and rescaling by (easily estimated from the Lanczos coefficients themselves) gives the F&F pole-quality measure

Small = converged pole; large = spurious pole that's an artifact of the projection. This is the other thing AWE can't give you. AWE produces poles and you have no idea which ones to trust; PVL produces poles AND quality numbers, and you keep the ones with small .

What PVL doesn't fix, and what came after

Two limitations of single-shift PVL, both addressed by follow-up work:

There's also the issue of Lanczos breakdowns. The biorthogonal recurrence can hit mid-chain even when neither vector is zero (Gutknecht's "serious breakdown," corresponding to singular blocks in the Padé table). F&F's implementation of PVL uses the look-ahead Lanczos variant of Freund-Gutknecht-Nachtigal 1993 that skips over these blocks. For symmetric pencils (the demo above) breakdowns don't occur, which is why the demo can use straight symmetric Lanczos.

Related on this site

Reference

P. Feldmann and R.W. Freund, "Efficient Linear Circuit Analysis by Padé Approximation via the Lanczos Process," 1995. The numerical experiments above reproduce Table 1 (moment-matrix condition numbers) and Figure 2 (PVL convergence) of that paper on a small symmetric RC ladder. The derivation walk reproduces the algebra of F&F section 4 (equations 19–27) in algebraic-move-named steps.