【问题标题】:Reducing memory allocation in DifferentialEquations.jl减少DifferentialEquations.jl 中的内存分配
【发布时间】:2020-12-08 01:44:38
【问题描述】:

我正在使用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 函数之外预分配它们,但不幸的是没有成功地以这种方式减少分配。

【问题讨论】:

    标签: julia differentialequations.jl


    【解决方案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 专家。

    【讨论】:

    • 感谢您的回复。我确实需要单独的 X 和 Y,因为它们是附加的 du 的一部分,我在这里省略了以保持简短。
    猜你喜欢
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2020-07-18
    相关资源
    最近更新 更多