我在大气化学中有常微分方程(ODEs)。我有一个Matlab脚本,由另一个人编写,可以解决它们。现在我已将其转换为R脚本。但结果却不同。
在Matlab中,许多函数可用于解决ODE,包括ode15s,ode23s,ode23t,ode23tb。我的Matlab脚本使用ode23tb。
R中的deSolve包提供了一个函数ode()
,其中有许多方法可用:
method = c("lsoda", "lsode", "lsodes", "lsodar", "vode", "daspk",
"euler", "rk4", "ode23", "ode45", "radau",
"bdf", "bdf_d", "adams", "impAdams", "impAdams_d", "iteration")
但是,不包括ode23tb。
我在Matlab online help测试了一个简单的ODE:
d y / d t = - 10 * t *
Matlab脚本:
tspan = [0 2];
y0 = 1;
[t,y] = ode23tb(@(t,y) -10*t, tspan, y0);
我的R脚本
tspan = seq(0, 2, 0.2)
y0 = 1
testf <- function(t, y, p){
with(as.list(c(y, p)), {
dydt = -a*t
list(dydt)
})
}
p <- list(a = 10)
zz <- deSolve::ode(y = y0, times = tspan, func = testf, parms = p)
结果不同。在R scirpt中,ode()
使用默认方法'lsoda'。
如果我在两个脚本中使用ode23方法,即在Matlab脚本中使用:
[t,y] = ode23(@(t,y) -10*t, tspan, y0);
在R脚本中:
zz <- deSolve::ode(y = y0, times = tspan, func = testf, parms = p, method = 'ode23')
他们给出相同的结果。
然而,我必须解决的大气化学ODE是复杂的。如果我使用ode23方法,Matlab和R中的计算速度太慢。12小时过去了,计算仍在继续。
如何在R中使用Matlab ode23tb函数?或者我如何在Matlab中使用“lsoda”方法?