Mengurangi alokasi memori di DifferentialEquations.jl
Saya menggunakan DifferentialEquations.jl untuk menyelesaikan sistem ODE seperti yang ditunjukkan di bawah ini. Hasilnya tidak terlalu relevan karena p
hanya 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 X
dan Y
dan telah mencoba mengalokasikannya di luar fungsi ODE, tetapi sayangnya tidak berhasil mengurangi alokasi dengan cara itu.
Jawaban
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 DifferentialEquations
ahli.