1
1
using ModelingToolkit, DiffEqBase, JumpProcesses, Test, LinearAlgebra
2
- using Random, StableRNGs
2
+ using Random, StableRNGs, NonlinearSolve
3
3
using OrdinaryDiffEq
4
4
using ModelingToolkit: t_nounits as t, D_nounits as D
5
5
MT = ModelingToolkit
456
456
Yact (t) = Y0 * exp (- k2val/ 10 * t) + (k1val / (k2val/ 10 )) * (1 - exp (- k2val/ 10 * t))
457
457
@test all (abs .(Xv .- Xact .(times)) .<= 0.05 .* Xv)
458
458
@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))
459
525
end
0 commit comments