[R-sig-dyn-mod] lsoda (deSolve) order of magnitude slower than ode45
Maciek Jacek Swat
maciej.swat at gmail.com
Wed Nov 22 10:39:50 CET 2017
hi All,
I ran a simple ODE model (see PS for R and Matlab code) and get order of
magnitude longer running times with lsoda (as implemented in deSolve) than
with ode45 in Matlab. (lsoda takes 2.97 seconds, ode45 takes 0.12 seconds).
Is this so or can it be optimized?
For example, the ODEs in R are coded using the notation dA <- ..., dB <-
... and not the vectorized one, is it the reason for the longer simulation
times?
Any comments would be very appreciated,
Best, Maciej
PS:
R code:
rm(list=ls())
Nanda <- function(t, state, parameters) {
with(as.list(c(state, parameters)), {
dB_CLL <- 1/body*(((r*B_CLL)*body) - ((d_B*B_CLL)*body) + ((b_B)*body)
- ((d_BN*B_CLL*NK)*body) - ((d_BT*B_CLL*Tc)*body))
dNK <- 1/body*(-((d_NB*NK*B_CLL)*body) + ((b_N)*body) -
((d_N*NK)*body))
dTc <- 1/body*(-((d_TB*Tc*B_CLL)*body) - ((d_T*Tc)*body) + ((b_T)*body)
+ (k*a_TH*B_CLL^L/(s+B_CLL^L)*TH*Tc))
dTH <- 1/body*((a_TH*B_CLL^L/(s+B_CLL^L)*TH) - ((d_TH*TH)*body) +
((b_TH)*body))
list(c(
dB_CLL,dNK,dTc,dTH
))
})
}
parameters <- c(
a_TH = 0.0001,
L = 2,
s = 1000,
d_B = 0.0076,
r = 0.0176,
b_B = 68,
B_CLL_0 = 100,
NK_0 = 1000,
Tc_0 = 100,
TH_0 = 100,
d_BN = 0.0001,
d_BT = 0.026,
d_NB = 0.0001,
b_N = 3.98,
d_N = 0.0159,
d_TB = 0.001,
d_T = 0.005,
b_T = 2.6,
k = 0.6,
d_TH = 0.01,
b_TH = 10.4,
body = 1
)
state <- c(
B_CLL = 100,
NK = 1000,
Tc = 100,
TH = 100
)
t1=proc.time()
times <- seq(0, 300, by = 0.01)
out <- ode(y = state, times = times, func = Nanda, method="lsoda", parms =
parameters)
cat((proc.time()-t1)[3],'\n')
Matlab code:
clear all; close all; clc;
yy0(1) = 100; % B_CLL
yy0(2) = 1000; % NK
yy0(3) = 100; % Tc
yy0(4) = 100; % TH
tic
[T,Y] = ode45(@(t,y)NandaFCT(t,y),[0 300],yy0);
toc
figure
semilogy(T,Y); grid on;
function dydt = NandaFCT(t,y)
a_TH = 0.0001;
L = 2;
s = 1000;
d_B = 0.0076;
r = 0.0176;
b_B = 68;
B_CLL_0 = 100;
NK_0 = 1000;
Tc_0 = 100;
TH_0 = 100;
d_BN = 0.0001;
d_BT = 0.026;
d_NB = 0.0001;
b_N = 3.98;
d_N = 0.0159;
d_TB = 0.001;
d_T = 0.005;
b_T = 2.6;
k = 0.6;
d_TH = 0.01;
b_TH = 10.4;
body = 1;
dydt = zeros(4,1);
dydt(1)= 1/body*(((r*y(1))*body) - ((d_B*y(1))*body) + ((b_B)*body) -
((d_BN*y(1)*y(2))*body) - ((d_BT*y(1)*y(3))*body)); % B_CLL
dydt(2)= 1/body*(-((d_NB*y(2)*y(1))*body) + ((b_N)*body) -
((d_N*y(2))*body)); % NK
dydt(3)= 1/body*(-((d_TB*y(3)*y(1))*body) - ((d_T*y(3))*body) +
((b_T)*body) + (k*a_TH*y(1)^L/(s+y(1)^L)*y(4)*y(3))); % Tc
dydt(4)= 1/body*((a_TH*y(1)^L/(s+y(1)^L)*y(4)) - ((d_TH*y(4))*body) +
((b_TH)*body)); % TH
end
[[alternative HTML version deleted]]
More information about the R-sig-dynamic-models
mailing list