Documentation

BSeries.Numerics.Williamson

Williamson 2N-storage Runge–Kutta schemes #

A Williamson low-storage scheme advances an s-stage Runge–Kutta step using only two registers via the recurrence

δ_l = A_l δ_{l-1} + h K_l, Y_l = Y_{l-1} + B_l δ_l.

Unrolling the recurrence expresses each register update as a linear combination of the stage slopes with weights β_{l,j} = B_l A_l A_{l-1} ⋯ A_{j+1}, which induces a Butcher tableau. Bazavov's criterion (arXiv:2509.20599, Theorem 3.1) characterises the explicit tableaux arising this way:

a_{ik} (b_j - a_{kj}) = (a_{ij} - a_{kj}) b_k whenever k = j + 1 ≤ i.

We prove both directions, formalise Bazavov's commutator-free lift of a low-storage scheme (arXiv:2509.20599, equation (4)) together with its collapse to the classical Runge–Kutta step under a flat (translation) exponential action — the structural input for the CF-EES lifts of the EES(2,5;x) and EES(2,7;x) families (arXiv:2509.20599, Proposition 3.1).

References #

theorem BSeries.RungeKutta.ext {ι : Type u_1} {R : Type v} {rk₁ rk₂ : RungeKutta ι R} (hA : ∀ (i j : ι), rk₁.A i j = rk₂.A i j) (hb : ∀ (j : ι), rk₁.b j = rk₂.b j) :
rk₁ = rk₂

Tableaux agreeing entrywise are equal.

structure BSeries.RungeKutta.LowStorage (s : ) (R : Type v) :

Low-storage (Williamson 2N) coefficient data for an s-stage scheme: the two-register recurrence δ_l = A_l δ_{l-1} + h K_l, Y_l = Y_{l-1} + B_l δ_l. The leading coefficient A 0 is never used.

  • A : Fin sR
  • B : Fin sR
Instances For
    def BSeries.RungeKutta.LowStorage.prodA {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) (j l : ) :
    R

    The product A_{j+1} A_{j+2} ⋯ A_l of recurrence coefficients, over natural indices (empty product when l ≤ j).

    Equations
    Instances For
      @[simp]
      theorem BSeries.RungeKutta.LowStorage.prodA_self {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) (j : ) :
      ls.prodA j j = 1
      theorem BSeries.RungeKutta.LowStorage.prodA_succ_bot {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) {j l : } (h : j < l) (hs : j + 1 < s) :
      ls.prodA j l = ls.A j + 1, hs * ls.prodA (j + 1) l
      def BSeries.RungeKutta.LowStorage.beta {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) (l j : Fin s) :
      R

      The unrolled slope weights: β_{l,j} = B_l A_l ⋯ A_{j+1} for j ≤ l, and 0 otherwise.

      Equations
      Instances For
        @[simp]
        theorem BSeries.RungeKutta.LowStorage.beta_self {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) (j : Fin s) :
        ls.beta j j = ls.B j
        theorem BSeries.RungeKutta.LowStorage.beta_eq_zero_of_lt {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) {l j : Fin s} (h : l < j) :
        ls.beta l j = 0
        theorem BSeries.RungeKutta.LowStorage.beta_eq {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) {j k : Fin s} (hk : j + 1 = k) (m : Fin s) :
        ls.beta m j = if m = j then ls.B j else ls.A k * ls.beta m k

        The one-step recurrence of the slope weights in the second index: β_{m,j} = A_{j+1} β_{m,j+1} off the diagonal.

        The Butcher tableau induced by unrolling the Williamson recurrence: a_{ij} = Σ_{m<i} β_{m,j} and b_j = Σ_m β_{m,j}.

        Equations
        Instances For
          theorem BSeries.RungeKutta.LowStorage.toRK_A {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) (i j : Fin s) :
          ls.toRK.A i j = mFinset.Iio i, ls.beta m j
          theorem BSeries.RungeKutta.LowStorage.toRK_b {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) (j : Fin s) :
          ls.toRK.b j = m : Fin s, ls.beta m j
          theorem BSeries.RungeKutta.LowStorage.toRK_A_of_le {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) {i j : Fin s} (hij : i j) :
          ls.toRK.A i j = 0

          The induced tableau is strictly lower triangular.

          The induced tableau is explicit.

          theorem BSeries.RungeKutta.LowStorage.toRK_b_succ {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) {j k : Fin s} (hk : j + 1 = k) :
          ls.toRK.b j = ls.B j + ls.A k * ls.toRK.b k

          The recurrence of the induced weights: b_j = B_j + A_{j+1} b_{j+1}.

          theorem BSeries.RungeKutta.LowStorage.toRK_A_of_lt {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) {i j k : Fin s} (hk : j + 1 = k) (hji : j < i) :
          ls.toRK.A i j = ls.B j + ls.A k * ls.toRK.A i k

          The recurrence of the induced stage matrix: a_{ij} = B_j + A_{j+1} a_{i,j+1} for j < i.

          theorem BSeries.RungeKutta.LowStorage.toRK_A_succ_self {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) {j k : Fin s} (hk : j + 1 = k) :
          ls.toRK.A k j = ls.B j

          The subdiagonal of the induced tableau recovers the B coefficients: a_{j+1,j} = B_j.

          Materialise low-storage data: coefficients are computed once and stored as lists, so repeated access does not re-evaluate expensive coefficient expressions.

          Equations
          • One or more equations did not get rendered due to their size.
          Instances For
            theorem BSeries.RungeKutta.LowStorage.toRK_b_last {R : Type v} {n : } [CommRing R] (ls : LowStorage (n + 1) R) :
            ls.toRK.b (Fin.last n) = ls.B (Fin.last n)

            The last induced weight is B_{s-1}.

            A tableau is Williamson 2N if it arises from a two-register low-storage recurrence (arXiv:2509.20599, equation (2)).

            Equations
            Instances For

              Bazavov's compatibility condition (arXiv:2509.20599, Theorem 3.1): a_{ik} (b_j - a_{kj}) = (a_{ij} - a_{kj}) b_k whenever k = j + 1 ≤ i.

              Equations
              Instances For

                Williamson 2N tableaux satisfy Bazavov's condition (the forward direction of arXiv:2509.20599, Theorem 3.1).

                def BSeries.RungeKutta.LowStorage.ofTableau {R : Type v} {n : } [Field R] (rk : RungeKutta (Fin (n + 1)) R) :
                LowStorage (n + 1) R

                Reconstruct low-storage data from an explicit tableau: B_j = a_{j+1,j} (with B_{s-1} = b_{s-1}) and A_{j+1} = (b_j - a_{j+1,j}) / b_{j+1}.

                Equations
                • One or more equations did not get rendered due to their size.
                Instances For
                  theorem BSeries.RungeKutta.LowStorage.ofTableau_B {R : Type v} {n : } [Field R] (rk : RungeKutta (Fin (n + 1)) R) (j : Fin (n + 1)) :
                  (ofTableau rk).B j = if h : j + 1 < n + 1 then rk.A j + 1, h j else rk.b j
                  theorem BSeries.RungeKutta.LowStorage.ofTableau_A {R : Type v} {n : } [Field R] (rk : RungeKutta (Fin (n + 1)) R) (k : Fin (n + 1)) :
                  (ofTableau rk).A k = if h : 0 < k then (rk.b k - 1, - rk.A k k - 1, ) / rk.b k else 0
                  theorem BSeries.RungeKutta.LowStorage.ofTableau_B_of_succ {R : Type v} {n : } [Field R] (rk : RungeKutta (Fin (n + 1)) R) {j k : Fin (n + 1)} (hk : j + 1 = k) :
                  (ofTableau rk).B j = rk.A k j
                  theorem BSeries.RungeKutta.LowStorage.ofTableau_B_last {R : Type v} {n : } [Field R] (rk : RungeKutta (Fin (n + 1)) R) :
                  (ofTableau rk).B (Fin.last n) = rk.b (Fin.last n)
                  theorem BSeries.RungeKutta.LowStorage.ofTableau_A_of_succ {R : Type v} {n : } [Field R] (rk : RungeKutta (Fin (n + 1)) R) {j k : Fin (n + 1)} (hk : j + 1 = k) :
                  (ofTableau rk).A k = (rk.b j - rk.A k j) / rk.b k
                  theorem BSeries.RungeKutta.isWilliamson2N_of_bazavovCondition {R : Type v} [Field R] {n : } {rk : RungeKutta (Fin (n + 1)) R} (hexp : rk.IsExplicit) (hb : ∀ (j : Fin (n + 1)), rk.b j 0) (hbaz : rk.BazavovCondition) :

                  Bazavov's theorem, converse direction (arXiv:2509.20599, Theorem 3.1): an explicit tableau with nonvanishing weights satisfying the compatibility condition is Williamson 2N.

                  theorem BSeries.RungeKutta.isWilliamson2N_iff_bazavovCondition {R : Type v} [Field R] {n : } {rk : RungeKutta (Fin (n + 1)) R} (hexp : rk.IsExplicit) (hb : ∀ (j : Fin (n + 1)), rk.b j 0) :

                  Bazavov's characterisation of Williamson 2N schemes (arXiv:2509.20599, Theorem 3.1; Bazavov, Theorem 2): an explicit tableau with nonvanishing weights is Williamson 2N if and only if it satisfies the compatibility condition.

                  Bazavov's commutator-free lift #

                  A Williamson 2N scheme lifts to a commutator-free method by replacing the register update Y_l = Y_{l-1} + B_l δ_l with the exponential action Y_l = Λ(exp(B_l δ_l), Y_{l-1}) (arXiv:2509.20599, equation (4)). Unrolling the recurrence, the l-th exponential argument is V_l = Σ_j β_{l,j} K_j.

                  Bazavov's commutator-free lift of a Williamson 2N scheme (arXiv:2509.20599, equation (4)): stage i composes the exponentials exp(V_m) for m < i, where V_m = Σ_j β_{m,j} K_j, and the step composes all s of them. Each stage adds exactly one new exponential, so the lift uses s exponentials per step in two registers.

                  Equations
                  • One or more equations did not get rendered due to their size.
                  Instances For
                    theorem BSeries.RungeKutta.LowStorage.toCommutatorFree_stageExps {R : Type v} {s : } [CommRing R] (ls : LowStorage s R) (i : Fin s) :
                    ls.toCommutatorFree.stageExps i = List.map (fun (m : Fin s) => ls.beta m) (List.filter (fun (m : Fin s) => decide (m < i)) (List.finRange s))

                    The translation action of a module on itself: the "flat" exponential map, under which commutator-free methods collapse to classical Runge–Kutta schemes.

                    Equations
                    Instances For
                      theorem BSeries.RungeKutta.LowStorage.toCommutatorFree_stagePoint_translation {R : Type v} {s : } [CommRing R] {E : Type w} [AddCommMonoid E] [Module R E] (ls : LowStorage s R) (K : Fin sE) (i : Fin s) (y : E) :

                      On a flat space the Bazavov lift reproduces the Runge–Kutta stage values: composing the lift's stage exponentials under the translation action yields the stage point of the induced Butcher tableau.

                      theorem BSeries.RungeKutta.LowStorage.toCommutatorFree_step_translation {R : Type v} {s : } [CommRing R] {E : Type w} [AddCommMonoid E] [Module R E] (ls : LowStorage s R) (K : Fin sE) (y : E) :

                      On a flat space the Bazavov lift collapses to the classical Runge–Kutta step (arXiv:2509.20599, Section 3): the commutator-free step under the translation action is y + Σ_j b_j K_j for the induced Butcher weights.