[R-sig-dyn-mod] lsoda (deSolve) order of magnitude slower than ode45

Karline Soetaert Karline.Soetaert at nioz.nl
Wed Nov 22 10:51:16 CET 2017


Hi Maciek,
I think it is because you request such detailed output. Try:

times <- seq(0, 300, by = 1)
rather than 
times <- seq(0, 300, by = 0.01)


Karline Soetaert
-----Original Message-----
From: R-sig-dynamic-models [mailto:r-sig-dynamic-models-bounces at r-project.org] On Behalf Of Maciek Jacek Swat
Sent: woensdag 22 november 2017 10:40
To: r-sig-dynamic-models at r-project.org
Subject: [R-sig-dyn-mod] lsoda (deSolve) order of magnitude slower than ode45

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]]

_______________________________________________
R-sig-dynamic-models mailing list
R-sig-dynamic-models at r-project.org
https://stat.ethz.ch/mailman/listinfo/r-sig-dynamic-models



More information about the R-sig-dynamic-models mailing list