Experimental convergence order of MPRK schemes

In this tutorial, we check that all implemented MPRK schemes can achieve their expected order of convergence. We also address the issue that some methods suffer from order reduction when the solution gets too close to zero.

Conservative production-destruction systems

First, we consider conservative production-destruction systems (PDS). To investigate the convergence order, we define the non-autonomous test problem

\[\begin{aligned} u_1' &= \cos(\pi t)^2 u_2 - \sin(2\pi t)^2 u_1, & u_1(0)&=0.9, \\ u_2' & = \sin(2\pi t)^2 u_1 - \cos(\pi t)^2 u_2, & u_2(0)&=0.1, \end{aligned}\]

for $0≤ t≤ 1$. The PDS is conservative since the sum of the right-hand side terms equals zero. An implementation of this problem is given next.

using PositiveIntegrators

# define problem
P(u, p, t) = [0.0 cos.(π * t) .^ 2 * u[2]; sin.(2 * π * t) .^ 2 * u[1] 0.0]
prob = ConservativePDSProblem(P, [0.9; 0.1], (0.0, 1.0))

To use analyticless_test_convergence from DiffEqDevTools.jl, we need to pick a solver to compute the reference solution and specify tolerances. Since the problem is not stiff, we use the high-order explicit solver Vern9() from OrdinaryDiffEqVerner.jl.

using OrdinaryDiffEqVerner
using DiffEqDevTools: analyticless_test_convergence

# solver and tolerances to compute reference solution
test_setup = Dict(:alg => Vern9(), :reltol => 1e-14, :abstol => 1e-14)

To keep the code short, we also define an auxiliary function that outputs a convergence table, which lists the errors obtained with the respective time step size $Δ t$ as well as the estimated order of convergence in parentheses.

using Printf: @sprintf
using PrettyTables: pretty_table

# auxiliary function
function convergence_table(dts, prob, algs, labels, test_setup)
    # compute errors and estimated convergence orders
    err_eoc = []
    for i in eachindex(algs)
        sim = analyticless_test_convergence(dts, prob, algs[i], test_setup)

        err = sim.errors[:l∞]
        eoc = [NaN; -log2.(err[2:end] ./ err[1:(end - 1)])]

        push!(err_eoc, tuple.(err, eoc))
    end

    # gather data for table
    data = hcat(dts, reduce(hcat,err_eoc))

    # print table
    formatter = (v, i, j) ->  (j>1) ? (@sprintf "%5.2e (%4.2f) " v[1] v[2]) : (@sprintf "%5.2e " v)
    pretty_table(data, formatters = formatter, header = ["Δt"; labels])
end

Second-order and third-order MPRK schemes

First, we test several second-order and third-order MPRK schemes.

# choose step sizes
dts = 0.5 .^ (5:10)

# select 2nd order schemes
algs2 = [MPRK22(0.5); MPRK22(2.0 / 3.0); MPRK22(1.0); SSPMPRK22(0.5, 1.0); MPDeC(2)]
labels2 = ["MPRK22(0.5)"; "MPRK22(2.0/3.0)"; "MPRK22(1.0)"; "SSPMPRK22(0.5, 1.0)"; "MPDeC(2)"]

# select 3rd order schemes
algs3 = [MPRK43I(1.0, 0.5); MPRK43I(0.5, 0.75); MPRK43II(0.5); MPRK43II(2.0 / 3.0);
         SSPMPRK43(); MPDeC(3)]
labels3 = ["MPRK43I(1.0,0.5)"; "MPRK43I(0.5, 0.75)"; "MPRK43II(0.5)"; "MPRK43II(2.0/3.0)";
          "SSPMPRK43()"; "MPDeC(3)"]

convergence_table(dts, prob, algs2, labels2, test_setup)

convergence_table(dts, prob, algs3, labels3, test_setup)
┌───────────┬──────────────────┬──────────────────┬──────────────────┬─────────────────────┬──────────────────┐
│        Δt │      MPRK22(0.5) │  MPRK22(2.0/3.0) │      MPRK22(1.0) │ SSPMPRK22(0.5, 1.0) │         MPDeC(2) │
├───────────┼──────────────────┼──────────────────┼──────────────────┼─────────────────────┼──────────────────┤
│ 3.12e-02  │ 3.97e-04 ( NaN)  │ 2.93e-04 ( NaN)  │ 6.01e-04 ( NaN)  │    5.88e-04 ( NaN)  │ 4.57e-04 ( NaN)  │
│ 1.56e-02  │ 1.01e-04 (1.98)  │ 7.69e-05 (1.93)  │ 1.54e-04 (1.97)  │    1.45e-04 (2.02)  │ 1.15e-04 (1.99)  │
│ 7.81e-03  │ 2.55e-05 (1.98)  │ 1.97e-05 (1.96)  │ 3.90e-05 (1.98)  │    3.60e-05 (2.01)  │ 2.88e-05 (1.99)  │
│ 3.91e-03  │ 6.41e-06 (1.99)  │ 5.00e-06 (1.98)  │ 9.82e-06 (1.99)  │    8.96e-06 (2.01)  │ 7.22e-06 (2.00)  │
│ 1.95e-03  │ 1.61e-06 (2.00)  │ 1.26e-06 (1.99)  │ 2.46e-06 (1.99)  │    2.24e-06 (2.00)  │ 1.81e-06 (2.00)  │
│ 9.77e-04  │ 4.02e-07 (2.00)  │ 3.16e-07 (2.00)  │ 6.17e-07 (2.00)  │    5.58e-07 (2.00)  │ 4.52e-07 (2.00)  │
└───────────┴──────────────────┴──────────────────┴──────────────────┴─────────────────────┴──────────────────┘
┌───────────┬──────────────────┬────────────────────┬──────────────────┬───────────────────┬──────────────────┬──────────────────┐
│        Δt │ MPRK43I(1.0,0.5) │ MPRK43I(0.5, 0.75) │    MPRK43II(0.5) │ MPRK43II(2.0/3.0) │      SSPMPRK43() │         MPDeC(3) │
├───────────┼──────────────────┼────────────────────┼──────────────────┼───────────────────┼──────────────────┼──────────────────┤
│ 3.12e-02  │ 1.46e-05 ( NaN)  │   1.97e-05 ( NaN)  │ 1.13e-05 ( NaN)  │  1.14e-05 ( NaN)  │ 2.54e-05 ( NaN)  │ 1.87e-06 ( NaN)  │
│ 1.56e-02  │ 1.98e-06 (2.88)  │   2.56e-06 (2.94)  │ 1.42e-06 (2.99)  │  1.43e-06 (2.99)  │ 3.60e-06 (2.82)  │ 2.69e-07 (2.80)  │
│ 7.81e-03  │ 2.57e-07 (2.95)  │   3.26e-07 (2.97)  │ 1.79e-07 (2.99)  │  1.80e-07 (2.99)  │ 4.79e-07 (2.91)  │ 3.60e-08 (2.90)  │
│ 3.91e-03  │ 3.27e-08 (2.97)  │   4.12e-08 (2.98)  │ 2.24e-08 (3.00)  │  2.26e-08 (3.00)  │ 6.18e-08 (2.95)  │ 4.65e-09 (2.95)  │
│ 1.95e-03  │ 4.13e-09 (2.99)  │   5.18e-09 (2.99)  │ 2.81e-09 (3.00)  │  2.83e-09 (3.00)  │ 7.85e-09 (2.98)  │ 5.92e-10 (2.98)  │
│ 9.77e-04  │ 5.18e-10 (2.99)  │   6.49e-10 (3.00)  │ 3.51e-10 (3.00)  │  3.54e-10 (3.00)  │ 9.89e-10 (2.99)  │ 7.46e-11 (2.99)  │
└───────────┴──────────────────┴────────────────────┴──────────────────┴───────────────────┴──────────────────┴──────────────────┘

The table shows that all schemes converge as expected.

Higher-order MPRK schemes

To actually see the order of higher-order methods we need to use more accurate floating-point numbers. Here, we use DoubleFloats.

using DoubleFloats

# define problem using Double64
P(u, p, t) = [0 cospi(t)^2 * u[2]; sinpi(2 * t)^2 * u[1] 0]
u0 = [Double64(9) / 10; Double64(1) / 10]
tspan = (Double64(0), Double64(1))
prob_d64 = ConservativePDSProblem(P, u0, tspan)

# choose step sizes
dts_d64 = Double64(1/2) .^ (5:9)

# select higher-order schemes
algs4 = [MPDeC(4); MPDeC(5); MPDeC(6); MPDeC(7); MPDeC(8); MPDeC(9); MPDeC(10)]
labels4 = ["MPDeC(4)"; "MPDeC(5)"; "MPDeC(6)"; "MPDeC(7)"; "MPDeC(8)"; "MPDeC(9)"; "MPDeC(10)"]

# solver and tolerances to compute reference solution
test_setup_d64 = Dict(:alg => Vern9(), :reltol => 1e-30, :abstol => 1e-30)

# compute errors and experimental order of convergence
convergence_table(dts_d64, prob_d64, algs4, labels4, test_setup_d64)
┌───────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┐
│        Δt │         MPDeC(4) │         MPDeC(5) │         MPDeC(6) │         MPDeC(7) │         MPDeC(8) │         MPDeC(9) │        MPDeC(10) │
├───────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┤
│ 3.12e-02  │ 4.19e-07 ( NaN)  │ 1.52e-09 ( NaN)  │ 1.71e-10 ( NaN)  │ 1.60e-12 ( NaN)  │ 5.20e-14 ( NaN)  │ 1.95e-15 ( NaN)  │ 4.13e-17 ( NaN)  │
│ 1.56e-02  │ 2.62e-08 (4.00)  │ 5.98e-11 (4.67)  │ 2.70e-12 (5.99)  │ 1.72e-14 (6.53)  │ 2.07e-16 (7.97)  │ 5.80e-18 (8.39)  │ 7.71e-20 (9.07)  │
│ 7.81e-03  │ 1.64e-09 (4.00)  │ 2.09e-12 (4.84)  │ 4.20e-14 (6.01)  │ 1.57e-16 (6.78)  │ 9.49e-19 (7.77)  │ 1.38e-20 (8.71)  │ 9.97e-23 (9.59)  │
│ 3.91e-03  │ 1.02e-10 (4.00)  │ 6.88e-14 (4.92)  │ 6.56e-16 (6.00)  │ 1.33e-18 (6.89)  │ 4.20e-21 (7.82)  │ 2.98e-23 (8.86)  │ 1.11e-25 (9.80)  │
│ 1.95e-03  │ 6.40e-12 (4.00)  │ 2.21e-15 (4.96)  │ 1.03e-17 (6.00)  │ 1.08e-20 (6.95)  │ 1.74e-23 (7.91)  │ 6.11e-26 (8.93)  │ 1.17e-28 (9.90)  │
└───────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┘

Again, all schemes show the expected converge order.

Non-conservative PDS

Next, we consider the non-autonomous but also non-conservative test problem

\[\begin{aligned} u_1' &= \cos(\pi t)^2 u_2 - \sin(2\pi t)^2 u_1 - \cos(2\pi t)^2 u_1, & u_1(0)&=0.9,\\ u_2' & = \sin(2\pi t)^2 u_1 - \cos(\pi t)^2 u_2 - \sin(\pi t)^2 u_2, & u_2(0)&=0.1, \end{aligned}\]

for $0≤ t≤ 1$. Since the sum of the right-hand side terms does not vanish, the PDS is indeed non-conservative. Hence, we need to use PDSProblem for its implementation.

# PDS
P(u, p, t) = [0.0 cospi(t)^2 * u[2]; sinpi(2 * t)^2 * u[1] 0.0]
D(u, p, t) = [cospi(2 * t)^2 * u[1]; sinpi(t)^2 * u[2]]
prob = PDSProblem(P, D, [0.9; 0.1], (0.0, 1.0))

The following tables demonstrate that the chosen MPRK schemes converge as expected also for this non-conservative PDS.

Second-order and third-order MPRK schemes

convergence_table(dts, prob, algs2, labels2, test_setup)

convergence_table(dts, prob, algs3, labels3, test_setup)
┌───────────┬──────────────────┬──────────────────┬──────────────────┬─────────────────────┬──────────────────┐
│        Δt │      MPRK22(0.5) │  MPRK22(2.0/3.0) │      MPRK22(1.0) │ SSPMPRK22(0.5, 1.0) │         MPDeC(2) │
├───────────┼──────────────────┼──────────────────┼──────────────────┼─────────────────────┼──────────────────┤
│ 3.12e-02  │ 2.92e-04 ( NaN)  │ 1.79e-04 ( NaN)  │ 5.56e-04 ( NaN)  │    4.94e-04 ( NaN)  │ 4.62e-04 ( NaN)  │
│ 1.56e-02  │ 7.51e-05 (1.96)  │ 4.75e-05 (1.92)  │ 1.42e-04 (1.97)  │    1.24e-04 (1.99)  │ 1.17e-04 (1.98)  │
│ 7.81e-03  │ 1.89e-05 (1.99)  │ 1.24e-05 (1.94)  │ 3.59e-05 (1.98)  │    3.12e-05 (2.00)  │ 2.94e-05 (1.99)  │
│ 3.91e-03  │ 4.76e-06 (1.99)  │ 3.15e-06 (1.97)  │ 9.02e-06 (1.99)  │    7.79e-06 (2.00)  │ 7.38e-06 (2.00)  │
│ 1.95e-03  │ 1.19e-06 (2.00)  │ 7.97e-07 (1.99)  │ 2.26e-06 (2.00)  │    1.95e-06 (2.00)  │ 1.85e-06 (2.00)  │
│ 9.77e-04  │ 2.99e-07 (2.00)  │ 2.00e-07 (1.99)  │ 5.66e-07 (2.00)  │    4.87e-07 (2.00)  │ 4.63e-07 (2.00)  │
└───────────┴──────────────────┴──────────────────┴──────────────────┴─────────────────────┴──────────────────┘
┌───────────┬──────────────────┬────────────────────┬──────────────────┬───────────────────┬──────────────────┬──────────────────┐
│        Δt │ MPRK43I(1.0,0.5) │ MPRK43I(0.5, 0.75) │    MPRK43II(0.5) │ MPRK43II(2.0/3.0) │      SSPMPRK43() │         MPDeC(3) │
├───────────┼──────────────────┼────────────────────┼──────────────────┼───────────────────┼──────────────────┼──────────────────┤
│ 3.12e-02  │ 1.29e-05 ( NaN)  │   1.12e-05 ( NaN)  │ 1.06e-05 ( NaN)  │  1.08e-05 ( NaN)  │ 2.32e-05 ( NaN)  │ 3.36e-06 ( NaN)  │
│ 1.56e-02  │ 1.73e-06 (2.90)  │   1.46e-06 (2.95)  │ 1.40e-06 (2.93)  │  1.34e-06 (3.01)  │ 3.06e-06 (2.93)  │ 4.48e-07 (2.90)  │
│ 7.81e-03  │ 2.24e-07 (2.95)  │   1.86e-07 (2.97)  │ 1.79e-07 (2.96)  │  1.72e-07 (2.96)  │ 3.91e-07 (2.97)  │ 5.80e-08 (2.95)  │
│ 3.91e-03  │ 2.86e-08 (2.97)  │   2.34e-08 (2.99)  │ 2.27e-08 (2.98)  │  2.18e-08 (2.98)  │ 4.95e-08 (2.98)  │ 7.38e-09 (2.97)  │
│ 1.95e-03  │ 3.61e-09 (2.99)  │   2.95e-09 (2.99)  │ 2.85e-09 (2.99)  │  2.74e-09 (2.99)  │ 6.22e-09 (2.99)  │ 9.31e-10 (2.99)  │
│ 9.77e-04  │ 4.54e-10 (2.99)  │   3.69e-10 (3.00)  │ 3.58e-10 (3.00)  │  3.43e-10 (3.00)  │ 7.80e-10 (3.00)  │ 1.17e-10 (2.99)  │
└───────────┴──────────────────┴────────────────────┴──────────────────┴───────────────────┴──────────────────┴──────────────────┘

Higher-order MPRK schemes

# problem implementation using DoubleFloats
P(u, p, t) = [0 cospi(t)^2 * u[2]; sinpi(2 * t)^2 * u[1] 0]
D(u, p, t) = [cospi(2 * t)^2 * u[1]; sinpi(t)^2 * u[2]]
prob_d64 = PDSProblem(P, D, [Double64(9)/10; Double64(1)/10], (Double64(0), Double64(1)))

convergence_table(dts_d64, prob_d64, algs4, labels4, test_setup_d64)
┌───────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┐
│        Δt │         MPDeC(4) │         MPDeC(5) │         MPDeC(6) │         MPDeC(7) │         MPDeC(8) │         MPDeC(9) │        MPDeC(10) │
├───────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┤
│ 3.12e-02  │ 2.97e-07 ( NaN)  │ 3.40e-09 ( NaN)  │ 1.49e-10 ( NaN)  │ 4.79e-12 ( NaN)  │ 1.72e-13 ( NaN)  │ 7.72e-15 ( NaN)  │ 3.04e-16 ( NaN)  │
│ 1.56e-02  │ 1.86e-08 (4.00)  │ 1.28e-10 (4.73)  │ 2.82e-12 (5.73)  │ 4.92e-14 (6.60)  │ 9.37e-16 (7.52)  │ 2.16e-17 (8.48)  │ 4.44e-19 (9.42)  │
│ 7.81e-03  │ 1.16e-09 (4.00)  │ 4.40e-12 (4.86)  │ 4.87e-14 (5.85)  │ 4.42e-16 (6.80)  │ 4.33e-18 (7.76)  │ 5.05e-20 (8.74)  │ 5.32e-22 (9.71)  │
│ 3.91e-03  │ 7.29e-11 (4.00)  │ 1.44e-13 (4.93)  │ 8.02e-16 (5.92)  │ 3.71e-18 (6.90)  │ 1.84e-20 (7.88)  │ 1.08e-22 (8.87)  │ 5.76e-25 (9.85)  │
│ 1.95e-03  │ 4.56e-12 (4.00)  │ 4.62e-15 (4.96)  │ 1.29e-17 (5.96)  │ 3.00e-20 (6.95)  │ 7.50e-23 (7.94)  │ 2.21e-25 (8.93)  │ 5.92e-28 (9.92)  │
└───────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┘

Order reduction

It was shown in Torlo, Öffner, Ranocha: Issues with positivity-preserving Patankar-type schemes with positivity-preserving Patankar-type schemes that some MPRK methods suffer from order reduction if the solution of the PDS is too close to zero. We demonstrate this by solving a problem where one component of the initial condition is equal to zero.

The problem is

\[\begin{aligned} u_1' &= -u_1, & u_1(0)&=1, \\ u_2' & = u_1, & u_2(0)&=0, \end{aligned}\]

for $0≤ t≤ 1$ and can be implemented as follows.

# PDS
P(u, p, t) = [0 0; u[1] 0]
prob = ConservativePDSProblem(P, [1.0; 0.0], (0.0, 1.0))

Next, we generate the corresponding convergence tables as in the sections above.

test_setup = Dict(:alg => Vern9(), :reltol => 1e-14, :abstol => 1e-14)

dts = 0.5 .^ (6:12)

convergence_table(dts, prob, algs2, labels2, test_setup)
convergence_table(dts, prob, algs3, labels3, test_setup)
convergence_table(dts, prob, algs4, labels4, test_setup)
┌───────────┬──────────────────┬──────────────────┬──────────────────┬─────────────────────┬──────────────────┐
│        Δt │      MPRK22(0.5) │  MPRK22(2.0/3.0) │      MPRK22(1.0) │ SSPMPRK22(0.5, 1.0) │         MPDeC(2) │
├───────────┼──────────────────┼──────────────────┼──────────────────┼─────────────────────┼──────────────────┤
│ 1.56e-02  │ 1.48e-05 ( NaN)  │ 1.48e-05 ( NaN)  │ 1.48e-05 ( NaN)  │    7.14e-06 ( NaN)  │ 1.48e-05 ( NaN)  │
│ 7.81e-03  │ 3.72e-06 (1.99)  │ 3.72e-06 (1.99)  │ 3.72e-06 (1.99)  │    1.83e-06 (1.97)  │ 3.72e-06 (1.99)  │
│ 3.91e-03  │ 9.33e-07 (2.00)  │ 9.33e-07 (2.00)  │ 9.33e-07 (2.00)  │    4.62e-07 (1.98)  │ 9.33e-07 (2.00)  │
│ 1.95e-03  │ 2.34e-07 (2.00)  │ 2.34e-07 (2.00)  │ 2.34e-07 (2.00)  │    1.16e-07 (1.99)  │ 2.34e-07 (2.00)  │
│ 9.77e-04  │ 5.84e-08 (2.00)  │ 5.84e-08 (2.00)  │ 5.84e-08 (2.00)  │    2.92e-08 (2.00)  │ 5.84e-08 (2.00)  │
│ 4.88e-04  │ 1.46e-08 (2.00)  │ 1.46e-08 (2.00)  │ 1.46e-08 (2.00)  │    7.30e-09 (2.00)  │ 1.46e-08 (2.00)  │
│ 2.44e-04  │ 3.65e-09 (2.00)  │ 3.65e-09 (2.00)  │ 3.65e-09 (2.00)  │    1.83e-09 (2.00)  │ 3.65e-09 (2.00)  │
└───────────┴──────────────────┴──────────────────┴──────────────────┴─────────────────────┴──────────────────┘
┌───────────┬──────────────────┬────────────────────┬──────────────────┬───────────────────┬──────────────────┬──────────────────┐
│        Δt │ MPRK43I(1.0,0.5) │ MPRK43I(0.5, 0.75) │    MPRK43II(0.5) │ MPRK43II(2.0/3.0) │      SSPMPRK43() │         MPDeC(3) │
├───────────┼──────────────────┼────────────────────┼──────────────────┼───────────────────┼──────────────────┼──────────────────┤
│ 1.56e-02  │ 2.85e-07 ( NaN)  │   1.43e-07 ( NaN)  │ 1.71e-07 ( NaN)  │  1.72e-07 ( NaN)  │ 2.86e-06 ( NaN)  │ 8.08e-05 ( NaN)  │
│ 7.81e-03  │ 3.61e-08 (2.98)  │   1.81e-08 (2.98)  │ 2.17e-08 (2.98)  │  2.17e-08 (2.98)  │ 3.60e-07 (2.99)  │ 2.03e-05 (1.99)  │
│ 3.91e-03  │ 4.54e-09 (2.99)  │   2.27e-09 (2.99)  │ 2.72e-09 (2.99)  │  2.73e-09 (2.99)  │ 4.52e-08 (2.99)  │ 5.08e-06 (2.00)  │
│ 1.95e-03  │ 5.69e-10 (3.00)  │   2.85e-10 (3.00)  │ 3.42e-10 (3.00)  │  3.42e-10 (3.00)  │ 5.67e-09 (3.00)  │ 1.27e-06 (2.00)  │
│ 9.77e-04  │ 7.13e-11 (3.00)  │   3.57e-11 (3.00)  │ 4.28e-11 (3.00)  │  4.28e-11 (3.00)  │ 7.09e-10 (3.00)  │ 3.18e-07 (2.00)  │
│ 4.88e-04  │ 8.96e-12 (2.99)  │   4.50e-12 (2.99)  │ 5.38e-12 (2.99)  │  5.38e-12 (2.99)  │ 8.88e-11 (3.00)  │ 7.95e-08 (2.00)  │
│ 2.44e-04  │ 1.15e-12 (2.96)  │   6.18e-13 (2.87)  │ 7.35e-13 (2.87)  │  7.35e-13 (2.87)  │ 1.13e-11 (2.98)  │ 1.99e-08 (2.00)  │
└───────────┴──────────────────┴────────────────────┴──────────────────┴───────────────────┴──────────────────┴──────────────────┘
┌───────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┐
│        Δt │         MPDeC(4) │         MPDeC(5) │         MPDeC(6) │         MPDeC(7) │         MPDeC(8) │         MPDeC(9) │        MPDeC(10) │
├───────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┤
│ 1.56e-02  │ 8.09e-05 ( NaN)  │ 1.01e-04 ( NaN)  │ 1.01e-04 ( NaN)  │ 1.09e-04 ( NaN)  │ 1.09e-04 ( NaN)  │ 1.13e-04 ( NaN)  │ 1.13e-04 ( NaN)  │
│ 7.81e-03  │ 2.03e-05 (2.00)  │ 2.54e-05 (2.00)  │ 2.54e-05 (2.00)  │ 2.74e-05 (2.00)  │ 2.74e-05 (2.00)  │ 2.84e-05 (2.00)  │ 2.84e-05 (2.00)  │
│ 3.91e-03  │ 5.08e-06 (2.00)  │ 6.35e-06 (2.00)  │ 6.35e-06 (2.00)  │ 6.86e-06 (2.00)  │ 6.86e-06 (2.00)  │ 7.11e-06 (2.00)  │ 7.11e-06 (2.00)  │
│ 1.95e-03  │ 1.27e-06 (2.00)  │ 1.59e-06 (2.00)  │ 1.59e-06 (2.00)  │ 1.72e-06 (2.00)  │ 1.72e-06 (2.00)  │ 1.78e-06 (2.00)  │ 1.78e-06 (2.00)  │
│ 9.77e-04  │ 3.18e-07 (2.00)  │ 3.97e-07 (2.00)  │ 3.97e-07 (2.00)  │ 4.29e-07 (2.00)  │ 4.29e-07 (2.00)  │ 4.45e-07 (2.00)  │ 4.45e-07 (2.00)  │
│ 4.88e-04  │ 7.95e-08 (2.00)  │ 9.93e-08 (2.00)  │ 9.93e-08 (2.00)  │ 1.07e-07 (2.00)  │ 1.07e-07 (2.00)  │ 1.11e-07 (2.00)  │ 1.11e-07 (2.00)  │
│ 2.44e-04  │ 1.99e-08 (2.00)  │ 2.48e-08 (2.00)  │ 2.48e-08 (2.00)  │ 2.68e-08 (2.00)  │ 2.68e-08 (2.00)  │ 2.78e-08 (2.00)  │ 2.78e-08 (2.00)  │
└───────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┘

We find that all methods apart from MPDeC($K$) methods with $K ≥ 3$ converge as expected. The MPDeC($K$) methods with $K ≥ 3$ suffer from order reduction and show convergence order 2 instead of $K$.