Обратные вызовы в Джулии, когда я использую реакционную сеть

Я новичок в использовании Джулии и пытаюсь смоделировать сеть реакций, в то время как возмущение меняет концентрацию одного вида с течением времени. Я узнал, что могу использовать обратный вызов, чтобы изменить ценность определенного вида в определенный момент времени, чтобы имитировать это внешнее возмущение. Хотя я прочитал документацию, но не смог найти, как это сделать. Вот код, в котором я попытался реализовать эту симуляцию. Сначала я определил реакционную сеть и ее параметры:

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

увеличить ценность вида А в два раза

affect!(integrator) = integrator.??? += 2

Но здесь я не уверен, какие параметры использовать для изменения значения A.

И остальная часть моего кода:

cb = DiscreteCallback(condition, affect!)

sol = solve(prob, Tsit5(), callback = cb, tstops = [10.0])

using Plots
plot(sol) 

Буду признателен за любую помощь в улучшении моего понимания в этой области.

Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
0
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В данном случае хочется сказать affect!(integrator) = integrator.u[1] += 2. Вам необходимо получить доступ к индексированному состоянию интегратора. Чтобы выяснить, какой индекс вам нужно использовать, вы можете проверить states(rn), чтобы увидеть порядок неизвестных, которые вам нужно использовать, чтобы убедиться, что вы получаете доступ к правильному индексу. Если бы вы вместо этого написали первую реакцию как B + A, то B было бы первым состоянием в списке states(rn), и вам нужно было бы увеличить integrator.u[2].

Если вы точно знаете время, когда хотите создать беспокойство, я бы также рекомендовал вместо этого использовать PresetTimeCallback (см. здесь). DiscreteCallback необходимо оценивать состояние после каждого шага интегратора, что может привести к ненужным накладным расходам.

Другие вопросы по теме