首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少DifferentialEquations.jl中的内存分配

减少DifferentialEquations.jl中的内存分配
EN

Stack Overflow用户
提问于 2020-12-08 09:44:39
回答 1查看 145关注 0票数 4

我正在使用DifferentialEquations.jl来解决如下所示的ODE系统。结果并不重要,因为p只包含用于生成MWE的测试参数,但关键是,尽管使用了就地ODE函数,但我还是看到了大量的内存分配。

代码语言:javascript
复制
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系统,所以我想尽可能地减少分配,我想知道是否有什么可以做的。我一直在想,问题是否出在XY上,并试图在ODE函数之外预先分配它们,但不幸的是,没有成功地以这种方式减少分配。

EN

回答 1

Stack Overflow用户

发布于 2020-12-08 13:51:49

我很确定这应该会更快而且分配的一半

代码语言:javascript
复制
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专家。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65191918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档