11using OrdinaryDiffEq, ParameterizedFunctions, DiffEqDevTools, StaticArrays,
22 OrdinaryDiffEqTaylorSeries
3- using Plots, BenchmarkTools
3+ using Plots, BenchmarkTools, Random, LinearAlgebra
44gr ();
55
6- abstols = 1.0 ./ 10.0 .^ (6 : 15 )
7- reltols = 1.0 ./ 10.0 .^ (3 : 12 );
8-
96function lotka (du, u, p, t)
107 x = u[1 ]
118 y = u[2 ]
129 du[1 ] = p[1 ] * x - p[2 ] * x * y
1310 du[2 ] = - p[3 ] * y + p[4 ] * x * y
1411end
15- prob = ODEProblem {true, SciMLBase.FullSpecialize} (
12+ prob_lotka = ODEProblem {true, SciMLBase.FullSpecialize} (
1613 lotka, [1.0 , 1.0 ], (0.0 , 10.0 ), [1.5 , 1.0 , 3.0 , 1.0 ])
17- sol = solve (prob, Vern7 (), abstol = 1 / 10 ^ 14 , reltol = 1 / 10 ^ 14 )
14+ sol_lotka = solve (prob_lotka, Vern7 (), abstol = 1e-14 , reltol = 1e-14 );
15+
16+ function fitzhugh (du, u, p, t)
17+ v = u[1 ]
18+ w = u[2 ]
19+ a = p[1 ]
20+ b = p[2 ]
21+ τinv = p[3 ]
22+ l = p[4 ]
23+ du[1 ] = v - v^ 3 / 3 - w + l
24+ du[2 ] = τinv * (v + a - b * w)
25+ end
26+ prob_fitzhugh = ODEProblem {true, SciMLBase.FullSpecialize} (
27+ fitzhugh, [1.0 ; 1.0 ], (0.0 , 10.0 ), [0.7 , 0.8 , 1 / 12.5 , 0.5 ])
28+ sol_fitzhugh = solve (prob_fitzhugh, Vern7 (), abstol = 1e-14 , reltol = 1e-14 );
29+
30+ function rigid (du, u, p, t)
31+ I₁ = p[1 ]
32+ I₂ = p[2 ]
33+ I₃ = p[3 ]
34+ du[1 ] = I₁ * u[2 ] * u[3 ]
35+ du[2 ] = I₂ * u[1 ] * u[3 ]
36+ du[3 ] = I₃ * u[1 ] * u[2 ] + 0.25 * sin (t)^ 2
37+ end
38+ prob_rigid = ODEProblem {true, SciMLBase.FullSpecialize} (
39+ rigid, [1.0 ; 0.0 ; 0.9 ], (0.0 , 10.0 ), [- 2.0 , 1.25 , - 0.5 ])
40+ sol_rigid = solve (prob_rigid, Vern7 (), abstol = 1e-14 , reltol = 1e-14 );
41+
42+ function make_problem_random_dense (N; seed = 1 )
43+ Random. seed! (seed)
44+ λ = - rand (N) .- 1 # eigenvalues in [-2,-1]
45+ D = Diagonal (λ)
46+ Q, _ = qr (randn (N, N)) # random orthogonal matrix
47+ A = Q * D * Q' # similar transformation
48+ f (du, u, p, t) = du .= A * u
49+ u0 = rand (N)
50+ ODEProblem {true, SciMLBase.FullSpecialize} (f, u0, (0.0 , 10.0 ))
51+ end
52+
53+ function make_problem_random_sparse (N; seed = 1 , density = 0.1 )
54+ Random. seed! (seed)
55+ λ = - rand (N) .- 1 # eigenvalues in [-2,-1]
56+ D = Diagonal (λ)
57+ Q, _ = qr (randn (N, N)) # random orthogonal matrix
58+ A_dense = Q * D * Q' # similar transformation
59+ A_sparse = sparse (A_dense)
60+ A_sparse .= sprand (N, N, density) .* A_sparse # make sparse but keep structure
61+ f (du, u, p, t) = du .= A_sparse * u
62+ u0 = rand (N)
63+ ODEProblem {true, SciMLBase.FullSpecialize} (f, u0, (0.0 , 10.0 ))
64+ end
65+
66+ # prob_dense = make_problem_random_dense(64)
67+ prob_dense = make_problem_poisson (16 )
68+ sol_dense = solve (prob_dense, Vern7 (), abstol = 1e-14 , reltol = 1e-14 );
1869
1970# Make work-precision plot
2071setups = [Dict (:alg => DP5 ())
@@ -26,6 +77,17 @@ for order in 6:2:12
2677 push! (names, " Taylor $(order) " )
2778 push! (setups, Dict (:alg => ExplicitTaylor (order = Val (order + 1 ))))
2879end
29- wp = WorkPrecisionSet ([prob], abstols, reltols, setups; names = names, appxsol = [sol],
30- save_everystep = false , numruns = 100 , maxiters = 10000 )
31- plot (wp)
80+
81+ function make_plot (
82+ prob, sol; numruns = 100 , maxiters = 1000 , absrange = (- 13 : - 6 ), relrange = (- 10 : - 3 ))
83+ abstols = 10.0 .^ absrange
84+ reltols = 10.0 .^ relrange
85+ wp = WorkPrecisionSet ([prob], abstols, reltols, setups; names = names, appxsol = [sol],
86+ save_everystep = false , numruns = numruns, maxiters = maxiters)
87+ p = plot (wp)
88+ return p
89+ end
90+ p_lotka = make_plot (prob_lotka, sol_lotka)
91+ p_fitzhugh = make_plot (prob_fitzhugh, sol_fitzhugh)
92+ p_rigid = make_plot (prob_rigid, sol_rigid)
93+ p_dense = make_plot (prob_dense, sol_dense)
0 commit comments