我是使用 Julia 的新手,我正在尝试模拟一个反应网络,而干扰会随着时间的推移改变一种物质的浓度。我了解到我可以使用回调来改变给定时间特定物种的值来模拟这种外部干扰。尽管我已阅读文档,但我找不到如何做到这一点。这是我尝试实现此模拟的代码。首先,我定义了反应网络及其参数:
using Catalyst
using DifferentialEquations
rn = @reaction_network begin
α, A + B --> 2B
β, B --> A
end α,β
p = [:α => 1, :β => 2]
tspan = (0.0,20.0)
u0 = [:A => 5.0, :B=> 5.0]
op = ODEProblem(rn, u0, tspan, p)
接下来,对于在 t=10 时触发的回调
condition(u, t, integrator) = t == 10
使物种A的价值增加两倍
affect!(integrator) = integrator.??? += 2
但这就是我不确定使用哪些参数来更改 A 的值的地方。
我的其余代码:
cb = DiscreteCallback(condition, affect!)
sol = solve(prob, Tsit5(), callback = cb, tstops = [10.0])
using Plots
plot(sol)
如果您能帮助我提高我在这方面的理解,我将不胜感激。
在这种情况下,你想说
affect!(integrator) = integrator.u[1] += 2
。您需要访问积分器的索引状态。要确定您需要使用哪个索引,您可以检查 states(rn)
以查看您需要使用的未知数的顺序,以确保您访问的是正确的索引。如果您将第一个反应写为 B + A
,那么 B
将是 states(rn)
列出的第一个状态,并且您需要增加 integrator.u[2]
。
如果您确切知道要产生干扰的时间,我还建议使用
PresetTimeCallback
代替(请参阅此处)。 DiscreteCallback
需要在每个积分器步骤之后评估条件,这会增加不必要的开销。