R:将参数移交给函数(deSolve-package)

时间:2016-09-28 09:44:48

标签: r function ode

我最近下载了deSolve-package来解决ODE模型问题。我根据我发现的一些示例代码编写了一个模型,然而,由于我得到了一个关于未知参数的错误按钮,所以参数的移交似乎存在问题。

  library(deSolve)

  model <- function(t, y, parms) {
  dY1 = -(k1 * y[1]) + (k2 * y[6]) - (k13 * y[1] * 400*sin(((2*pi)/period_ca)*t-phase_ca)+600) + (k14 * y[2]) - (k17 * y[1] * 400*sin(((2*pi)/period_dg)*t-phase_dg)+600) + (k18 *y[11]) - (k3*y[1] * AA) + (k4 * y[7])
  dY2 = (k13 * y[1] * 400*sin(((2*pi)/period_ca)*t-phase_ca)+600) - (k14 * y[2]) - (k15 * y[2] *400*sin(((2*pi)/period_dg)*t-phase_dg)+600) + (k16 * y[3]) - (k5 * y[2]) + (k6 * y[8]) - (k7 * y[2] * AA) + (k8 * y[9])
  dY3 = (k15 * y[2] * 400*sin(((2*pi)/period_dg)*t-phase_dg)+600) - (k16 * y[3]) - (k9 * y[3]) + (k10 * y[10])
  dY4 = -(k11 * y[4]) + (k12 * y[5]) + (k19 * y[11] * AA) - (k20 * y[4])
  dY5 =  (k11 * y[4]) - (k12 * y[5])
  dY6 = (k1 * y[1]) - (k2 * y[6])
  dY7 = (k3 + y[1] * AA) - (k4 * y[7])
  dY8 = (k5 * y[2]) - (k6 * y[8])
  dY9 = (k7 * y[2] * AA) - (k8 * y[9])
  dY10 = (k9 * y[3]) - (k10 * y[10])
  dY11 = (k17 * y[1] * 400*sin(((2*pi)/period_dg)*t-phase_dg)+600) - (k18 * y[11]) - (k19 * y[11] * AA) + (k20 * y[4])
  list(c(dY1, dY2, dY3,dY4, dY5, dY6,dY7, dY8, dY9, dY10, dY11))
  }

  yini <- c(y1 = 1000, y2 = 0, y3 = 0, y4 = 0, y5 = 0, y6 = 20, y7 = 0, y8 =    0, y9 = 0, y10 = 0, y11 = 0)
  times <- seq(from = 0, to = 5000, by = 0.1)
  parms <- c(AA=11000, k1=1, k2=50, k3=1.2e-7, k4=0.1, k5=1.2705, k6=3.5026, k7=1.2e-6, k8=0.1, k9=1, k10=0.1, k11=2, k12=0.2, k13=0.0006, k14=0.5, k15=7.998e-6,
           k16=8.6348, k17=6e-7, k18=0.1, k19=1.8e-5, k20=2, period_ca=100, phase_ca=0, period_dg=100,
           phase_dg=0)
  out <- ode (times = times, y = yini, func = model, parms = parms)

这里dY1至dY11表示某些系统组件的微分方程。 Parms是定义必要参数值的向量,yini定义初始条件并计算时间尺度。

我收到以下错误消息:

  

func中的错误(时间,状态,参数,......):对象&#39;&#39;&#39;找不到

我是R的新手并且不了解问题的根源(我发现的所有示例代码都以相同的方式构建)。

1 个答案:

答案 0 :(得分:1)

您必须从deSolve包中查找一些示例。要在函数中使用参数,您需要使用with函数:

model <- function(t, y, parms) {
  with(as.list(c(y, parms)), {
  dY1 = ...
  .
  .
  .
  dY11 = ...

  list(c(dY1, dY2, dY3,dY4, dY5, dY6,dY7, dY8, dY9, dY10, dY11))
})
}

然而我收到了一个错误,因为集成失败了,但这不是因为代码错误。也许你的电脑不是这种情况。

您可以尝试使用此代码来解决ODE,这会产生一些警告,但集成成功(在我的电脑上):

out <- ode(times = times, y = yini, func = model, parms = parms, method = "bdf")