Mengurangi alokasi memori di DifferentialEquations.jl

Dec 08 2020

Saya menggunakan DifferentialEquations.jl untuk menyelesaikan sistem ODE seperti yang ditunjukkan di bawah ini. Hasilnya tidak terlalu relevan karena phanya berisi parameter uji untuk tujuan menghasilkan MWE, tetapi kuncinya adalah saya melihat banyak alokasi memori meskipun menggunakan fungsi ODE di tempat.

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

Karena saya perlu menyelesaikan sistem ODE ini berulang kali, saya ingin mengurangi alokasi sebanyak mungkin dan bertanya-tanya apakah ada yang bisa dilakukan untuk mengatasinya. Saya bertanya-tanya apakah masalahnya terletak pada Xdan Ydan telah mencoba mengalokasikannya di luar fungsi ODE, tetapi sayangnya tidak berhasil mengurangi alokasi dengan cara itu.

Jawaban

2 OscarSmith Dec 08 2020 at 12:51

Saya cukup yakin ini harus lebih cepat dan setengah dari alokasi

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

Mungkin ada cara untuk menyingkirkan semuanya, tapi saya bukan DifferentialEquationsahli.