11# linear model problem
22
33P_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 ]]
45function 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"""
3334prob_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
3637function P_linmod! (P, u, p, t)
3738 P .= P_linmod (u, p, t)
3839 return nothing
3940end
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"""
4651prob_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
5157function 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 ]
5359end
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
5465u0_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
8092function 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 ]
8294end
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 ;
83100u0_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
107125function 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 ]
116134end ;
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 ;
117143u0_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
145172P_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 ]];
146176u0_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
171201function 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 ]
178208end
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
179217u0_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
204243function 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 ]
214253end
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
215268u0_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
241294function 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 ]
297350end
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
298397u0_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)
0 commit comments