Skip to content

Commit 5904a99

Browse files
SKopeczranocha
andauthored
Extended and revised problem library (#118)
* Added std_rhs to library problems * included prob_pds_mapk in api_reference.md * Update test/runtests.jl Co-authored-by: Hendrik Ranocha <[email protected]> * typo * bugfix * typo docstring minmapk * typo docstring minmapk --------- Co-authored-by: Hendrik Ranocha <[email protected]>
1 parent 92b7e71 commit 5904a99

File tree

4 files changed

+280
-10
lines changed

4 files changed

+280
-10
lines changed

docs/src/api_reference.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ prob_pds_bertolazzi
1818
prob_pds_brusselator
1919
prob_pds_linmod
2020
prob_pds_linmod_inplace
21+
prob_pds_minmapk
2122
prob_pds_nonlinmod
2223
prob_pds_npzd
2324
prob_pds_robertson

src/PDSProblemLibrary.jl

Lines changed: 190 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# linear model problem
22

33
P_linmod(u, p, t) = @SMatrix [0.0 u[2]; 5.0*u[1] 0.0]
4+
f_linmod(u, p, t) = @SVector [u[2] - 5.0 * u[1]; 5.0 * u[1] - u[2]]
45
function f_linmod_analytic(u0, p, t)
56
u₁⁰, u₂⁰ = u0
67
a = 5.0
@@ -31,12 +32,16 @@ There is one independent linear invariant, e.g. ``u_1+u_2 = 1``.
3132
[DOI: 10.1016/S0168-9274(03)00101-6](https://doi.org/10.1016/S0168-9274(03)00101-6)
3233
"""
3334
prob_pds_linmod = ConservativePDSProblem(P_linmod, u0_linmod, (0.0, 2.0),
34-
analytic = f_linmod_analytic)
35+
analytic = f_linmod_analytic, std_rhs = f_linmod)
3536

3637
function P_linmod!(P, u, p, t)
3738
P .= P_linmod(u, p, t)
3839
return nothing
3940
end
41+
function f_linmod!(du, u, p, t)
42+
du .= f_linmod(u, p, t)
43+
return nothing
44+
end
4045

4146
"""
4247
prob_pds_linmod_inplace
@@ -45,12 +50,18 @@ Same as [`prob_pds_linmod`](@ref) but with in-place computation.
4550
"""
4651
prob_pds_linmod_inplace = ConservativePDSProblem(P_linmod!, Array(u0_linmod),
4752
(0.0, 2.0),
48-
analytic = f_linmod_analytic)
53+
analytic = f_linmod_analytic,
54+
std_rhs = f_linmod!)
4955

5056
# nonlinear model problem
5157
function P_nonlinmod(u, p, t)
5258
@SMatrix [0.0 0.0 0.0; u[2] * u[1]/(u[1] + 1.0) 0.0 0.0; 0.0 0.3*u[2] 0.0]
5359
end
60+
function f_nonlinmod(u, p, t)
61+
@SVector [-u[2] * u[1] / (u[1] + 1);
62+
u[2] * u[1] / (u[1] + 1) - 0.3 * u[2];
63+
0.3 * u[2]]
64+
end
5465
u0_nonlinmod = @SVector [9.98; 0.01; 0.01]
5566
"""
5667
prob_pds_nonlinmod
@@ -74,12 +85,18 @@ There is one independent linear invariant, e.g. ``u_1+u_2+u_3 = 10.0``.
7485
Applied Numerical Mathematics 47.1 (2003): 1-30.
7586
[DOI: 10.1016/S0168-9274(03)00101-6](https://doi.org/10.1016/S0168-9274(03)00101-6)
7687
"""
77-
prob_pds_nonlinmod = ConservativePDSProblem(P_nonlinmod, u0_nonlinmod, (0.0, 30.0))
88+
prob_pds_nonlinmod = ConservativePDSProblem(P_nonlinmod, u0_nonlinmod, (0.0, 30.0),
89+
std_rhs = f_nonlinmod)
7890

7991
# robertson problem
8092
function P_robertson(u, p, t)
8193
@SMatrix [0.0 1e4*u[2]*u[3] 0.0; 4e-2*u[1] 0.0 0.0; 0.0 3e7*u[2]^2 0.0]
8294
end
95+
function f_robertson(u, p, t)
96+
return @SVector [1e4 * u[2] * u[3] - 4e-2 * u[1];
97+
4e-2 * u[1] - 1e4 * u[2] * u[3] - 3e7 * u[2]^2;
98+
3e7 * u[2]^2]
99+
end;
83100
u0_robertson = @SVector [1.0, 0.0, 0.0]
84101
"""
85102
prob_pds_robertson
@@ -101,7 +118,8 @@ There is one independent linear invariant, e.g. ``u_1+u_2+u_3 = 1.0``.
101118
"Solving Ordinary Differential Equations II - Stiff and Differential-Algebraic Problems."
102119
2nd Edition, Springer (2002): Section IV.1.
103120
"""
104-
prob_pds_robertson = ConservativePDSProblem(P_robertson, u0_robertson, (0.0, 1.0e11))
121+
prob_pds_robertson = ConservativePDSProblem(P_robertson, u0_robertson, (0.0, 1.0e11),
122+
std_rhs = f_robertson)
105123

106124
# brusselator problem
107125
function P_brusselator(u, p, t)
@@ -114,6 +132,14 @@ function P_brusselator(u, p, t)
114132
u[1] 0.0 0.0 0.0 0.0 u[5]^2*u[6];
115133
0.0 0.0 0.0 0.0 u2u5 0.0]
116134
end;
135+
function f_brusselator(u, p, t)
136+
@SVector [-u[1];
137+
-u[2] * u[5];
138+
u[2] * u[5];
139+
u[5];
140+
u[1] - u[2] * u[5] + u[5]^2 * u[6] - u[5];
141+
u[2] * u[5] - u[5]^2 * u[6]]
142+
end;
117143
u0_brusselator = @SVector [10.0, 10.0, 0.0, 0.0, 0.1, 0.1]
118144
"""
119145
prob_pds_brusselator
@@ -139,10 +165,14 @@ There are two independent linear invariants, e.g. ``u_1+u_4+u_5+u_6 = 10.2`` and
139165
Journal of Scientific Computing 70 (2017): 859 - 895.
140166
[DOI: 10.1007/s10915-016-0267-9](https://doi.org/10.1007/s10915-016-0267-9)
141167
"""
142-
prob_pds_brusselator = ConservativePDSProblem(P_brusselator, u0_brusselator, (0.0, 10.0))
168+
prob_pds_brusselator = ConservativePDSProblem(P_brusselator, u0_brusselator, (0.0, 10.0),
169+
std_rhs = f_brusselator)
143170

144171
# SIR problem
145172
P_sir(u, p, t) = @SMatrix [0.0 0.0 0.0; 2*u[1]*u[2] 0.0 0.0; 0.0 u[2] 0.0]
173+
f_sir(u, p, t) = @SVector [-2 * u[1] * u[2];
174+
2 * u[1] * u[2] - u[2];
175+
u[2]];
146176
u0_sir = @SVector [0.99, 0.005, 0.005]
147177
"""
148178
prob_pds_sir
@@ -165,7 +195,7 @@ There is one independent linear invariant, e.g. ``u_1+u_2+u_3 = 1.0``.
165195
Computers and Mathematics with Applications 66 (2013): 2307-2316.
166196
[DOI: 10.1016/j.camwa.2013.06.011](https://doi.org/10.1016/j.camwa.2013.06.011)
167197
"""
168-
prob_pds_sir = ConservativePDSProblem(P_sir, u0_sir, (0.0, 20.0))
198+
prob_pds_sir = ConservativePDSProblem(P_sir, u0_sir, (0.0, 20.0), std_rhs = f_sir)
169199

170200
# bertolazzi problem
171201
function P_bertolazzi(u, p, t)
@@ -176,6 +206,14 @@ function P_bertolazzi(u, p, t)
176206

177207
return @SMatrix [0.0 f1 f1; f2 0.0 f2; f3 f3 0.0]
178208
end
209+
function f_bertolazzi(u, p, t)
210+
f1 = 5 * u[2] * u[3] / (1e-2 + (u[2] * u[3])^2) +
211+
u[2] * u[3] / (1e-16 + u[2] * u[3] * (1e-8 + u[2] * u[3]))
212+
f2 = 10 * u[1] * u[3]^2
213+
f3 = 0.1 * (u[3] - u[2] - 2.5)^2 * u[1] * u[2]
214+
215+
return @SVector [2 * f1 - f2 - f3; -f1 + 2 * f2 - f3; -f1 - f2 + 2 * f3]
216+
end
179217
u0_bertolazzi = @SVector [0.0, 1.0, 2.0]
180218
"""
181219
prob_pds_bertolazzi
@@ -198,7 +236,8 @@ There is one independent linear invariant, e.g. ``u_1+u_2+u_3 = 3.0``.
198236
Computers and Mathematics with Applications 32 (1996): 29-43.
199237
[DOI: 10.1016/0898-1221(96)00142-3](https://doi.org/10.1016/0898-1221(96)00142-3)
200238
"""
201-
prob_pds_bertolazzi = ConservativePDSProblem(P_bertolazzi, u0_bertolazzi, (0.0, 1.0))
239+
prob_pds_bertolazzi = ConservativePDSProblem(P_bertolazzi, u0_bertolazzi, (0.0, 1.0),
240+
std_rhs = f_bertolazzi)
202241

203242
# npzd problem
204243
function P_npzd(u, p, t)
@@ -212,6 +251,20 @@ function P_npzd(u, p, t)
212251

213252
return @SMatrix [0.0 dpn dzn ddn; dnp 0.0 0.0 0.0; 0.0 dpz 0.0 0.0; 0.0 dpd dzd 0.0]
214253
end
254+
function f_npzd(u, p, t)
255+
dnp = u[1] / (0.01 + u[1]) * u[2]
256+
dpz = 0.5 * (1.0 - exp(-1.21 * u[2]^2)) * u[3]
257+
dpn = 0.01 * u[2]
258+
dzn = 0.01 * u[3]
259+
ddn = 0.003 * u[4]
260+
dpd = 0.05 * u[2]
261+
dzd = 0.02 * u[3]
262+
263+
return @SVector [dpn + dzn + ddn - dnp;
264+
dnp - dpn - dpz - dpd;
265+
dpz - dzn - dzd;
266+
dpd + dzd - ddn]
267+
end
215268
u0_npzd = @SVector [8.0, 2.0, 1.0, 4.0]
216269
"""
217270
prob_pds_npzd
@@ -235,7 +288,7 @@ There is one independent linear invariant, e.g. ``u_1+u_2+u_3+u_4 = 15.0``.
235288
Ocean Dynamics 55 (2005): 326-337.
236289
[DOI: 10.1007/s10236-005-0001-x](https://doi.org/10.1007/s10236-005-0001-x)
237290
"""
238-
prob_pds_npzd = ConservativePDSProblem(P_npzd, u0_npzd, (0.0, 10.0))
291+
prob_pds_npzd = ConservativePDSProblem(P_npzd, u0_npzd, (0.0, 10.0), std_rhs = f_npzd)
239292

240293
# stratospheric reaction problem
241294
function P_stratreac(u, p, t)
@@ -295,6 +348,52 @@ function d_stratreac(u, p, t)
295348

296349
return @SVector [0.0, r11, 0.0, r2, 0.0, 0.0]
297350
end
351+
function f_stratreac(u, p, t)
352+
O1D, O, O3, O2, NO, NO2 = u
353+
354+
Tr = 4.5
355+
Ts = 19.5
356+
T = mod(t / 3600, 24)
357+
if (Tr <= T) && (T <= Ts)
358+
Tfrac = (2 * T - Tr - Ts) / (Ts - Tr)
359+
sigma = 0.5 + 0.5 * cos(pi * abs(Tfrac) * Tfrac)
360+
else
361+
sigma = 0.0
362+
end
363+
364+
M = 8.120e16
365+
366+
k1 = 2.643e-10 * sigma^3
367+
k2 = 8.018e-17
368+
k3 = 6.120e-4 * sigma
369+
k4 = 1.567e-15
370+
k5 = 1.070e-3 * sigma^2
371+
k6 = 7.110e-11
372+
k7 = 1.200e-10
373+
k8 = 6.062e-15
374+
k9 = 1.069e-11
375+
k10 = 1.289e-2 * sigma
376+
k11 = 1.0e-8
377+
378+
r1 = k1 * O2
379+
r2 = k2 * O * O2
380+
r3 = k3 * O3
381+
r4 = k4 * O3 * O
382+
r5 = k5 * O3
383+
r6 = k6 * M * O1D
384+
r7 = k7 * O1D * O3
385+
r8 = k8 * O3 * NO
386+
r9 = k9 * NO2 * O
387+
r10 = k10 * NO2
388+
r11 = k11 * NO * O
389+
390+
return @SVector [r5 - r6 - r7;
391+
2 * r1 - r2 + r3 - r4 + r6 - r9 + r10 - r11;
392+
r2 - r3 - r4 - r5 - r7 - r8;
393+
-r1 - r2 + r3 + 2 * r4 + r5 + 2 * r7 + r8 + r9;
394+
-r8 + r9 + r10 - r11;
395+
r8 - r9 - r10 + r11]
396+
end
298397
u0_stratreac = @SVector [9.906e1, 6.624e8, 5.326e11, 1.697e16, 4e6, 1.093e9]
299398
"""
300399
prob_pds_stratreac
@@ -337,4 +436,86 @@ There are two independent linear invariants, e.g. ``u_1+u_2+3u_3+2u_4+u_5+2u_6=(
337436
Communications in Applied Mathematics and Computer Science 16 (2021): 155-179.
338437
[DOI: 10.2140/camcos.2021.16.155](https://doi.org/10.2140/camcos.2021.16.155)
339438
"""
340-
prob_pds_stratreac = PDSProblem(P_stratreac, d_stratreac, u0_stratreac, (4.32e4, 3.024e5))
439+
prob_pds_stratreac = PDSProblem(P_stratreac, d_stratreac, u0_stratreac, (4.32e4, 3.024e5),
440+
std_rhs = f_stratreac)
441+
442+
# mapk problem
443+
function f_minmapk(u, p, t)
444+
k1 = 100 / 3
445+
k2 = 1 / 3
446+
k3 = 50
447+
k4 = 0.5
448+
k5 = 10 / 3
449+
k6 = 0.1
450+
k7 = 0.7
451+
452+
return @SVector [k6 * u[6] - k7 * u[1] - k1 * u[1] * u[2] + k2 * u[4];
453+
k5 * u[3] - k1 * u[1] * u[2];
454+
k2 * u[4] - k3 * u[1] * u[3] + k4 * u[5] - k5 * u[3];
455+
k1 * u[1] * u[2] - k2 * u[4];
456+
k3 * u[1] * u[3] - k4 * u[5];
457+
k7 * u[1] - k6 * u[6]]
458+
end
459+
function P_minmapk(u, p, t)
460+
k1 = 100 / 3
461+
k2 = 1 / 3
462+
k3 = 50
463+
k4 = 0.5
464+
k5 = 10 / 3
465+
k6 = 0.1
466+
k7 = 0.7
467+
468+
return @SMatrix [0 0 0 k2*u[4] 0 k6*u[6]
469+
0 0 k5*u[3] 0 0 0;
470+
0 0 k2*u[4] 0 k4*u[5] 0;
471+
k1*u[1]*u[2] 0 0 0 0 0;
472+
0 0 k3*u[1]*u[3] 0 0 0;
473+
k7*u[1] 0 0 0 0 0]
474+
end
475+
function D_minmapk(u, p, t)
476+
k1 = 100 / 3
477+
478+
return @SVector [0; k1 * u[1] * u[2]; 0; 0; 0; 0]
479+
end
480+
481+
u0 = @SVector [0.1; 0.175; 0.15; 1.15; 0.81; 0.5]
482+
tspan = (0.0, 200.0)
483+
484+
"""
485+
prob_pds_minmapk
486+
487+
Positive and nonconservative autonomous nonlinear PDS
488+
```math
489+
\\begin{aligned}
490+
u_1' &= k_6u_6-k_7u_1-k_1u_1u_2 +k_2u_4,\\\\
491+
u_2' &= k_5u_3-k_1u_2u_2,\\\\
492+
u_3' &= k_2u_4-k_3u_1u_3+k_4u_5-k_5u_3,\\\\
493+
u_4' &= k_1u_1u_2-k_2u_4,\\\\
494+
u_5' &= k_3u_1u_3-k_4u_5,\\\\
495+
u_6' &= k_7u_1-k_6u_6,
496+
\\end{aligned}
497+
```
498+
with constants
499+
```math
500+
\\begin{aligned}
501+
k_1 &=\\frac{100}{3}, & k_2 &=\\frac{1}{3}, & k_3 &=50,\\\\
502+
k_4 &=0.5, & k_5 &=\\frac{10}{3} , & k_6 &= 0.1,\\\\
503+
k_7 &= 0.1.
504+
\\end{aligned}
505+
```
506+
507+
The initial value is ``\\mathbf{u}_0 = (0.1, 0.175, 0.15, 1.15, 0.81, 0.5)^T`` and the time domain ``(0, 200)``.
508+
There are two independent linear invariants, e.g. ``u_1+u_4+u_6=1.75`` and ``u_2+u_3+u_4+u_5 =2.285``.
509+
510+
## References
511+
512+
- Sergio Blanes, Arieh Iserles, and Shev Macnamara.
513+
"Positivity preserving methods for ordinary differential equations."
514+
ESAIM: Mathematical Modelling and Numerical Analysis 56 (2022): 1843–1870.
515+
[DOI: 10.1051/m2an/2022042](https://doi.org/10.1051/m2an/2022042)
516+
- Otto Hadač, František Muzika, Vladislav Nevoral, Michal Přibyl, and Igor Schreiber
517+
"Minimal oscillating subnetwork in the Huang-Ferrell model of the MAPK cascade."
518+
PLoS ONE 12 (2017): e0178457.
519+
[DOI: 10.1371/journal.pone.0178457](https://doi.org/10.1371/journal.pone.0178457)
520+
"""
521+
prob_pds_minmapk = PDSProblem(P_minmapk, D_minmapk, u0, tspan; std_rhs = f_minmapk)

src/PositiveIntegrators.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export SSPMPRK22, SSPMPRK43
4646

4747
export prob_pds_linmod, prob_pds_linmod_inplace, prob_pds_nonlinmod,
4848
prob_pds_robertson, prob_pds_brusselator, prob_pds_sir,
49-
prob_pds_bertolazzi, prob_pds_npzd, prob_pds_stratreac
49+
prob_pds_bertolazzi, prob_pds_npzd, prob_pds_stratreac, prob_pds_minmapk
5050

5151
export isnegative, isnonnegative
5252

0 commit comments

Comments
 (0)