301
301
# basic VariableRateJump test
302
302
let
303
303
N = 1000 # number of simulations for testing solve accuracy
304
- Random. seed! (rng, 1111 )
304
+ Random. seed! (rng, 1111 )
305
305
@variables A (t) B (t) C (t)
306
306
@parameters k
307
307
vrj = VariableRateJump (k * (sin (t) + 1 ), [A ~ A + 1 , C ~ C + 2 ])
@@ -427,20 +427,34 @@ end
427
427
let
428
428
@variables X (t) Y (t)
429
429
@parameters k1 k2
430
- rate1 = k1 * X
431
- affect1! = [X ~ X - 1 ]
432
- rate2 = k1
433
- affect2! = [Y ~ Y + 1 ]
430
+ vrj1 = VariableRateJump (k1 * X, [X ~ X - 1 ])
431
+ vrj2 = VariableRateJump (k2, [Y ~ Y + 1 ])
434
432
eqs = [D (X) ~ k2, D (Y) ~ - k2/ 100 * Y]
435
- vrj1 = VariableRateJump (rate1, affect1!)
436
- vrj2 = VariableRateJump (rate2, affect2!)
437
433
@named jsys = JumpSystem ([vrj1, vrj2, eqs[1 ], eqs[2 ]], t, [X, Y], [k1, k2])
438
434
jsys = complete (jsys)
439
- u0 = [X => 0.0 , Y => 0.0 ]
440
- p = [k1 => 1.0 , k2 => 20.0 ]
435
+ X0 = 0.0 ; Y0 = 0.0
436
+ u0 = [X => X0, Y => Y0]
437
+ k1val = 1.0 ; k2val = 20.0
438
+ p = [k1 => k1val, k2 => k2val]
441
439
tspan = (0.0 , 20.0 )
442
440
oprob = ODEProblem (jsys, u0, tspan, p)
443
441
jprob = JumpProblem (jsys, oprob; rng)
444
- sol = solve (jprob, Tsit5 ())
442
+
443
+ times = range (0.0 , 20.0 , length = 100 )
444
+ Nsims = 2000
445
+ X = zeros (length (times))
446
+ Y = similar (X)
447
+ for n in 1 : Nsims
448
+ sol = solve (jprob, Tsit5 ())
449
+ X .+ = Array (sol (times; idxs = X))
450
+ Y .+ = Array (sol (times; idxs = Y))
451
+ end
452
+ X ./= Nsims; Y ./= Nsims;
453
+
454
+ Xact (t) = X0 * exp (- k1val * t) + (k2val / k1val) * (1 - exp (- k1val * t))
455
+ Yact (t) = Y0 * exp (- k2val/ 100 * t) + (k1 / (k2val/ 100 )) * (1 - exp (- k2val/ 100 * t))
456
+
457
+ @test all (abs .(X .- Xact .(times)) .<= 0.05 .* X)
458
+ @test all (abs .(Y .- Yact .(times)) .<= 0.05 .* Y)
445
459
446
460
end
0 commit comments