|
| 1 | +using ModelingToolkit, DiffEqJump, Test, LinearAlgebra |
| 2 | +MT = ModelingToolkit |
| 3 | + |
| 4 | +# basic SIR model with tweaks |
| 5 | +@parameters β γ t |
| 6 | +@variables S I R |
| 7 | +rate₁ = β*S*I |
| 8 | +affect₁ = [S ~ S - 1, I ~ I + 1] |
| 9 | +rate₂ = γ*I+t |
| 10 | +affect₂ = [I ~ I - 1, R ~ R + 1] |
| 11 | +j₁ = ConstantRateJump(rate₁,affect₁) |
| 12 | +j₂ = VariableRateJump(rate₂,affect₂) |
| 13 | +js = JumpSystem([j₁,j₂], t, [S,I,R], [β,γ]) |
| 14 | +mtjump1 = MT.assemble_crj(js, j₁) |
| 15 | +mtjump2 = MT.assemble_crj(js, j₂) |
| 16 | + |
| 17 | +# doc version |
| 18 | +rate1(u,p,t) = (0.1/1000.0)*u[1]*u[2] |
| 19 | +function affect1!(integrator) |
| 20 | + integrator.u[1] -= 1 |
| 21 | + integrator.u[2] += 1 |
| 22 | +end |
| 23 | +jump1 = ConstantRateJump(rate1,affect1!) |
| 24 | +rate2(u,p,t) = 0.01u[2]+t |
| 25 | +function affect2!(integrator) |
| 26 | + integrator.u[2] -= 1 |
| 27 | + integrator.u[3] += 1 |
| 28 | +end |
| 29 | +jump2 = VariableRateJump(rate2,affect2!) |
| 30 | + |
| 31 | +# test crjs |
| 32 | +u = [100, 9, 5] |
| 33 | +p = (0.1/1000,0.01) |
| 34 | +t = 1.0 |
| 35 | +mutable struct TestInt |
| 36 | + u |
| 37 | + p |
| 38 | + t |
| 39 | +end |
| 40 | +mtintegrator = TestInt(u,p,t) |
| 41 | +integrator = TestInt(u,p,t) |
| 42 | +@test abs(mtjump1.rate(u,p,t) - jump1.rate(u,p,t)) < 10*eps() |
| 43 | +@test abs(mtjump2.rate(u,p,t) - jump2.rate(u,p,t)) < 10*eps() |
| 44 | +mtjump1.affect!(mtintegrator) |
| 45 | +jump1.affect!(integrator) |
| 46 | +@test norm(integrator.u - mtintegrator.u) < 10*eps() |
| 47 | +mtintegrator.u .= u; integrator.u .= u |
| 48 | +mtjump2.affect!(mtintegrator) |
| 49 | +jump2.affect!(integrator) |
| 50 | +@test norm(integrator.u - mtintegrator.u) < 10*eps() |
| 51 | + |
| 52 | + |
0 commit comments