如何调节 ODE 函数中的参数值? (deSolve, if-else)

How can I condition the parameter values in an ODE function? (deSolve, if-else)

我正在尝试为给定状态初始值的某些参数创建条件值。例如,如果D状态为D >= 60,则S值将为S=1800。否则,如果 D 状态为 D <60,则 S 值将为 S=4800。我在 ode 函数 (AedesIbag_model) 中使用了函数 if-else。当我 运行 用 D=70 if-else 赋值时,不切换 S 参数值。所以我还没有做到这一点效果很好。如果我的英语不是很好,我深表歉意。感谢您的帮助。

library(deSolve)

AedesIbag_model<-function(t, state, parameters) {
  with(as.list(c(state, parameters)), {
    dL = R*theta*S - mu_L*L - gamma_L*L - mu_w*L  
    dP = gamma_L*L - mu_P*P  - gamma_P*P - mu_w*P   
    dA = gamma_P*P - mu_A*A 
    dD = beta - alpha*D 
    if (D >= 60) { 
      S = 1800
      } else if (D < 60) {
        S = 4800
        } else if (D >= 10) {
          mu_w = 0.1
          } else if (D < 60) {
            mu_w = 0.1*100
          }
    
    return(list(c(dL, dP, dA, dD)))
  })
}

parameters  <- list(R = 0.24, theta = 10, S = 0,
                gamma_L = 0.2088, gamma_P = 0.384,
                beta = 10, mu_L = 0.0105, mu_P = 0.01041,
                mu_A = 0.091, mu_w = 0.1, alpha = 10
                )
state      <- c(L = 100, P = 60, A = 10, D = 70)
times       <- seq(0, 100, by = 0.1)

out_1 <- ode(y = state, times = times, func = AedesIbag_model, parms = parameters)
parameters

当我 运行 我的模特时。条件参数不会更改值。看!!!

> parameters
$R
[1] 0.24

$theta
[1] 10

$S
[1] 0   #S value doesn't change

$gamma_L
[1] 0.2088

$gamma_P
[1] 0.384

$beta
[1] 10

$mu_L
[1] 0.0105

$mu_P
[1] 0.01041

$mu_A
[1] 0.091

$mu_w
[1] 0        #S value doesn't change

$alpha
[1] 10

如果我的英语不是很好,我深表歉意。感谢您的帮助。

我猜你正在使用 pkg deSolve。查看您的代码,首先要注意的是,尝试通过打印 parameters 的值来评估函数的行为是无效的。 ode 函数只接受这些值,但不修改它们,因为 R 是一种函数式语言,因此不应修改其参数。下一个要纠正的错误是 if-else 结构。它永远不会修改当前形式的 mu_w 参数,因为 D >= 60D < 60 所以 S 可能永远不会被修改为 mu_w.

我不知道 if(.){.}else{.} 构造是否有效,并且开始相信你的话,直到我意识到我上面写的内容,它才会失败。因此,我使用了一种不同形式的逻辑运算,用布尔数学代替级联 if-else 构造:

    S    <- (D >= 60)* 1800 + (D < 60) * 4800
    mu_w <- (D >= 10) * 0.1 + (D < 60)* 0.1*100

我还认为 ode 的函数参数名称应该与您的目标函数中的名称相匹配,所以应该是 parms 而不是 parameters,但我没有当我进行更改时,我发现行为有很大差异,因此参数可能是按位置而不是按名称传递的。如果您想查看 ode 调用的结果如何演变,绘制结果更有效:

 png(); matplot(out_1, pch=1:3)
       legend("topright", 4, unlist(dimnames(out_1)[2]),
              pch = 1:5, col = 1:5)
 dev.off()

关于调试的进一步说明:由于 parameters 的值没有改变,您需要在定义的函数中放置一个 printcat 语句来监视命名参数的本地环境值。

使用 packageDescription('deSolve') 可以了解到有一个包含教程的 gitHub 托管网页。在该页面上进一步了解到有一个关于主题 ?forcings 的帮助页面。我强烈推荐可读性很强的文本“用 R 求解微分方程”。还有一个 link 到动态模型邮件列表:邮件列表:https://stat.ethz.ch/mailman/listinfo/r-sig-dynamic-models

在简要查看教程和“?forcings”中的 material 之后,我怀疑软件包作者建议使用分段线性函数而不是不连续函数来处理状态变化的参数。