Skip to content

Commit c3305d2

Browse files
fix up SDESystem conversion
1 parent fd72716 commit c3305d2

File tree

3 files changed

+41
-5
lines changed

3 files changed

+41
-5
lines changed

src/ModelingToolkit.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ include("systems/diffeqs/first_order_transform.jl")
9191
include("systems/diffeqs/modelingtoolkitize.jl")
9292
include("systems/nonlinear/nonlinear_system.jl")
9393
include("systems/pde/pdesystem.jl")
94+
include("systems/reaction/reactionsystem.jl")
9495
include("latexify_recipes.jl")
9596
include("build_function.jl")
9697

@@ -99,6 +100,7 @@ export SDESystem, SDEFunction
99100
export NonlinearSystem
100101
export ode_order_lowering
101102
export PDESystem
103+
export Reaction, ReactionSystem
102104
export Differential, expand_derivatives, @derivatives
103105
export IntervalDomain, ProductDomain, , CircleDomain
104106
export Equation, ConstrainedEquation

src/systems/reaction/reactionsystem.jl

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,53 @@ struct ReactionSystem
1111
ps
1212
end
1313

14-
function Base.convert(::Type{<:ODESystem},rs::ReactionSystem)
14+
# TODO: Make it do the combinatorics stuff
15+
reaction_expr(reactants) = *(reactants...)
16+
17+
function essemble_drift(rs)
1518
D = Differential(rs.iv)
1619
eqs = [D(x) ~ 0 for x in rs.dvs]
1720

1821
for rx in rs.rxs
1922
for reactant in rx.reactants
2023
i = findfirst(x->x.op == reactant.op,rs.dvs)
21-
eqs[i] = Equation(eqs[i].lhs,eqs[i].rhs - reactant)
24+
eqs[i] = Equation(eqs[i].lhs,eqs[i].rhs - rx.rate * reaction_expr(rx.reactants))
25+
end
26+
27+
for product in rx.products
28+
i = findfirst(x->x.op == product.op,rs.dvs)
29+
eqs[i] = Equation(eqs[i].lhs,eqs[i].rhs + rx.rate * reaction_expr(rx.reactants))
30+
end
31+
end
32+
eqs
33+
end
34+
35+
function essemble_diffusion(rs)
36+
eqs = Expression[Constant(0) for x in rs.dvs, y in rs.rxs]
37+
@show size(eqs)
38+
39+
for (j,rx) in enumerate(rs.rxs)
40+
for reactant in rx.reactants
41+
i = findfirst(x->x.op == reactant.op,rs.dvs)
42+
eqs[i,j] -= sqrt(rx.rate) * reaction_expr(rx.reactants)
2243
end
2344

2445
for product in rx.products
2546
i = findfirst(x->x.op == product.op,rs.dvs)
26-
eqs[i] = Equation(eqs[i].lhs,+(eqs[i].rhs,rx.reactants...))
47+
eqs[i,j] += sqrt(rx.rate) * reaction_expr(rx.reactants)
2748
end
2849
end
50+
eqs
51+
end
2952

53+
function Base.convert(::Type{<:ODESystem},rs::ReactionSystem)
54+
eqs = essemble_drift(rs)
3055
ODESystem(eqs,rs.iv,rs.dvs,rs.ps)
3156
end
57+
58+
function Base.convert(::Type{<:SDESystem},rs::ReactionSystem)
59+
D = Differential(rs.iv)
60+
eqs = essemble_drift(rs)
61+
noiseeqs = essemble_diffusion(rs)
62+
SDESystem(eqs,noiseeqs,rs.iv,rs.dvs,rs.ps)
63+
end

test/reactions.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using ModelingToolkit
22

3-
@parameters t a b
3+
@parameters t a b c
44
@variables x(t) y(t) z(t)
55
rxs = [Reaction(a,[x],[y]),
6-
Reaction(b,[y],[x])]
6+
Reaction(b,[y],[x]),
7+
Reaction(c,[x,y],[x])]
78
rs = ReactionSystem(rxs,t,[x,y],[a,b])
89
sys = convert(ODESystem,rs)
10+
sys = convert(SDESystem,rs)

0 commit comments

Comments
 (0)