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