11using ModelingToolkit, DiffEqBase, JumpProcesses, Test, LinearAlgebra
2- using Random, StableRNGs
2+ using Random, StableRNGs, NonlinearSolve
33using OrdinaryDiffEq
44using ModelingToolkit: t_nounits as t, D_nounits as D
55MT = ModelingToolkit
456456 Yact (t) = Y0 * exp (- k2val/ 10 * t) + (k1val / (k2val/ 10 )) * (1 - exp (- k2val/ 10 * t))
457457 @test all (abs .(Xv .- Xact .(times)) .<= 0.05 .* Xv)
458458 @test all (abs .(Yv .- Yact .(times)) .<= 0.1 .* Yv)
459+ end
460+
461+ # that mixes ODEs and jump types, and then contin events
462+ let
463+ Random. seed! (rng, 1111 )
464+ @variables X (t) Y (t)
465+ @parameters α β
466+ vrj = VariableRateJump (β * X, [X ~ X - 1 ]; save_positions = (false , false ))
467+ crj = ConstantRateJump (β* Y, [Y ~ Y - 1 ])
468+ maj = MassActionJump (α, [0 => 1 ], [Y => 1 ])
469+ eqs = [D (X) ~ α* (1 + Y)]
470+ @named jsys = JumpSystem ([maj, crj, vrj, eqs[1 ]], t, [X, Y], [α, β])
471+ jsys = complete (jsys)
472+
473+ p = (α = 6.0 , β = 2.0 , X₀ = 2.0 , Y₀ = 1.0 )
474+ u0map = [X => p. X₀, Y => p. Y₀]
475+ pmap = [α => p. α, β => p. β]
476+ tspan = (0.0 , 20.0 )
477+ oprob = ODEProblem (jsys, u0map, tspan, pmap)
478+ jprob = JumpProblem (jsys, oprob; rng, save_positions = (false , false ))
479+
480+ times = range (0.0 , tspan[2 ], length = 100 )
481+ Nsims = 4000
482+ Xv = zeros (length (times))
483+ Yv = zeros (length (times))
484+ for n in 1 : Nsims
485+ sol = solve (jprob, Tsit5 (); saveat = times)
486+ Xv .+ = sol[1 ,:]
487+ Yv .+ = sol[2 ,:]
488+ end
489+ Xv ./= Nsims; Yv ./= Nsims;
490+ function Yf (t, p)
491+ @unpack α, β, Y₀ = p
492+ return (α / β) + (Y₀ - α / β) * exp (- β * t)
493+ end
494+ function Xf (t, p)
495+ @unpack α, β, X₀, Y₀ = p
496+ return (α / β) + (α^ 2 / β^ 2 ) + α * (Y₀ - α / β) * t * exp (- β * t) + (X₀ - α / β - α^ 2 / β^ 2 ) * exp (- β * t)
497+ end
498+ Xact = [Xf (t,p) for t in times]
499+ Yact = [Yf (t,p) for t in times]
500+ @test all (abs .(Xv .- Xact) .<= 0.05 .* Xv)
501+ @test all (abs .(Yv .- Yact) .<= 0.05 .* Yv)
502+
503+ Xss = (p. α / p. β) + (p. α^ 2 / p. β^ 2 )
504+ function affect! (integ, u, p, ctx)
505+ savevalues! (integ, true )
506+ terminate! (integ)
507+ nothing
508+ end
509+ cevents = [t ~ .2 ] => (affect!, [], [], [], nothing )
510+ @named jsys = JumpSystem ([maj, crj, vrj, eqs[1 ]], t, [X, Y], [α, β];
511+ continuous_events = cevents)
512+ jsys = complete (jsys)
513+ tspan = (0.0 , 200.0 )
514+ oprob = ODEProblem (jsys, u0map, tspan, pmap)
515+ jprob = JumpProblem (jsys, oprob; rng, save_positions = (false , false ))
516+ Xsamp = 0.0
517+ Nsims = 4000
518+ for n in 1 : Nsims
519+ sol = solve (jprob, Tsit5 (), saveat = tspan[2 ])
520+ @test sol. retcode == ReturnCode. Terminated
521+ Xsamp += sol[1 ,end ]
522+ end
523+ Xsamp /= Nsims
524+ @test abs (Xsamp - Xf (.2 ,p) < .05 * Xf (.2 ,p))
459525end
0 commit comments