FAQs
How to disable rescaling of reaction rates in rate laws?
As explained in the Reaction rate laws used in simulations section, for a reaction such as k, 2X --> 0
, the generated rate law will rescale the rate constant, giving k*X^2/2
instead of k*X^2
for ODEs and k*X*(X-1)/2
instead of k*X*(X-1)
for jumps. This can be disabled when directly convert
ing a ReactionSystem
. If rn
is a generated ReactionSystem
, we can do
osys = convert(ODESystem, rn; combinatoric_ratelaws=false)
Disabling these rescalings should work for all conversions of ReactionSystem
s to other ModelingToolkit.AbstractSystem
s.
How to modify generated ODEs?
Conversion to other ModelingToolkit.AbstractSystem
s allows the possibility to modify the system with further terms that are difficult to encode as a chemical reaction. For example, suppose we wish to add a forcing term, $10\sin(10t)$, to the ODE for dX/dt
above. We can do so as:
dXdteq = equations(osys)[1]
t = get_iv(osys)
dXdteq = Equation(dXdteq.lhs, dXdteq.rhs + 10*sin(10*t))
@named osys2 = ODESystem([dXdteq], t, states(osys), parameters(osys))
oprob = ODEProblem(osys2, u0map, tspan, pmap)
osol = solve(oprob, Tsit5())
We can add $e^{-X}$ to $dX/dt$ as a forcing term by
dXdteq = equations(osys)[1]
@variables X(t)
dXdteq = Equation(dXdteq.lhs, dXdteq.rhs + exp(-X))
@named osys2 = ODESystem([dXdteq], t, states(osys), parameters(osys))
oprob = ODEProblem(osys2, u0map, tspan, pmap)
osol = solve(oprob, Tsit5())
How to override mass action kinetics rate laws?
While generally one wants the reaction rate law to use the law of mass action, so the reaction
rn = @reaction_network begin
k, X --> ∅
end k
occurs at the (ODE) rate $d[X]/dt = -k[X]$, it is possible to override this by using any of the following non-filled arrows when declaring the reaction: ⇐
, ⟽
, ⇒
, ⟾
, ⇔
, ⟺
. This means that the reaction
rn = @reaction_network begin
k, X ⇒ ∅
end k
will occur at rate $d[X]/dt = -k$ (which might become a problem since $[X]$ will be degraded at a constant rate even when very small or equal to 0).
Note, stoichiometric coefficients are still included, i.e. the reaction
rn = @reaction_network begin
k, 2*X ⇒ ∅
end k
has rate $d[X]/dt = -2 k$.
How to specify user defined functions as reaction rates?
The reaction network DSL can "see" user defined functions that work with ModelingToolkit. e.g., this is should work
myHill(x) = 2.0*x^3/(x^3+1.5^3)
rn = @reaction_network begin
myHill(X), ∅ → X
end
In some cases, it may be necessary or desirable to register functions with Symbolics.jl before their use in Catalyst, see the discussion here.