#julia #differentialequations.jl
#джулия #differentialequations.jl
Вопрос:
Я использую DifferentialEquations.jl для решения системы ODE, как показано ниже. Результат на самом деле не имеет значения, поскольку p
содержит только тестовые параметры для создания MWE, но ключ в том, что я вижу много выделения памяти, несмотря на использование встроенной функции ODE.
using DifferentialEquations
function ode_fun!(du,u,p,t)
a,b,c,d,e = p
X = @. u[1] * a * ((b-c)/b)
Y = @. u[2] * d * ((b-e)/b)
du[1] = -sum(X) sum(Y) - u[1]*u[2]
du[2] = sum(X) - sum(Y) - u[1]*u[2]
end
#exemplary parameters
a = collect(10:-0.1:0.1)
b = a.^2
c = b*0.7
d = collect(0.01:0.01:1)
e = b*0.3
u0 = [1.0, 0.5]
p = [a,b,c,d,e]
tspan = [0.0, 100.0]
t = collect(0:0.01:100)
prob = ODEProblem(ode_fun!,u0,tspan,p,saveat=t)
@time sol = solve(prob)
1.837609 seconds (5.17 M allocations: 240.331 MiB, 2.31% gc time) #Julia 1.5.2
Поскольку мне нужно повторно решать эту систему ODE, я хотел бы максимально сократить выделение, и мне интересно, можно ли с ними что-нибудь сделать. Мне было интересно, связана ли проблема с X
и Y
и попытался предварительно выделить их вне функции ODE, но, к сожалению, не удалось таким образом уменьшить выделение.
Ответ №1:
Я почти уверен, что это должно быть быстрее и вдвое меньше выделений
function ode_fun!(du,u,p,t)
a,b,c,d,e = p
XmY = @. u[1] * a * (1-c/b) - u[2] * d * (1-e/b)
sXmY = sum(XmY)
du[1] = -sXmY - u[1]*u[2]
du[2] = sXmY - u[1]*u[2]
end
Вероятно, есть способ избавиться от них всех, но я не DifferentialEquations
эксперт.
Комментарии:
1. Спасибо за ответ. Мне нужны X и Y отдельно, хотя, поскольку они являются частью дополнительных
du
, которые я здесь опустил, чтобы быть кратким.