如何将Matlab ode23tb函数转换为R

时间:2017-11-30 18:40:35

标签: r matlab ode

背景

我在大气化学中有常微分方程(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”方法?

0 个答案:

没有答案