Skip to content

Commit 5f0a4ea

Browse files
committed
finish tests
1 parent 683a845 commit 5f0a4ea

File tree

1 file changed

+67
-1
lines changed

1 file changed

+67
-1
lines changed

test/jumpsystem.jl

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using ModelingToolkit, DiffEqBase, JumpProcesses, Test, LinearAlgebra
2-
using Random, StableRNGs
2+
using Random, StableRNGs, NonlinearSolve
33
using OrdinaryDiffEq
44
using ModelingToolkit: t_nounits as t, D_nounits as D
55
MT = ModelingToolkit
@@ -456,4 +456,70 @@ let
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))
459525
end

0 commit comments

Comments
 (0)