R中deSolve中未更新的人口值

时间:2014-12-09 01:13:13

标签: r ode

我正在研究一个针对不同年龄段和吸烟者/非吸烟者的不同隔间的模型。我认为一切进展顺利,但是当我开始深入研究输出时,我发现人群并没有像我预期的那样在每个时间步更新。我使用调试器来逐步执行代码,实际上,它会继续使用每个时间步长的初始库存大小,因此我最终会不断改变种群大小,这是不正确的。

模型中有200只股票,所以我不想粘贴整个内容,但这里有我觉得最相关的部分。

smokdiff <- function(times,init,parameters) {
  with(as.list(c(init,parameters)), {

    dns00 <- births - ns00*mort[1,1] - ns00/5 
    dns05 <- ns00/5 - ns05*mort[1,2] - ns05/5

...

    list(c(dns00,dns05,dns10,...
 })
}

times <- seq(0,tf,dt)
init <- c(ns00,ns05,ns10,...
parameters <- c(births,mort,init15,utinit15,ltinit15)
out <- ode(func=smokdiff, times=times, y=init, parms=parameters)

以下是ns00填充的输出示例:

     time       1
[1,]    0 9244769
[2,]    1 9217034
[3,]    2 9189300
[4,]    3 9161566
[5,]    4 9133832
[6,]    5 9106097 

正如您所看到的,每一步减少约27,734,这对第一步来说是正确的(例如,它应该在第二步减少22,104)。

我已经比较了我在网上找到的多个模型,而且我无法发现我做错了什么。我也尝试过其他方法&#34;在颂歌中,但它们都显示出不断的变化。我开始担心我对这应该如何运作有一些基本的误解。谁能看到我做错了什么?谢谢!

解: 初始状态必须在“状态=值”中定义。方式。简单地将变量与其中的值放在一起是不够的。这是一个小工作示例:

library(deSolve)
smokdiff <- function(times,init,parameters) {
  with(as.list(c(init,parameters)), {

    dns00 <- births - ns00*mort[1] - ns00/5 
    dns05 <- ns00/5 - ns05*mort[2] - ns05/5
    dns10 <- ns05/5 - ns10*mort[3] - ns10/5

    list(c(dns00,dns05,dns10))
 })
}

mort <- c(0.003, 0.001, 0.001)
ns00 <- 9000000; ns05 <- 8500000; ns10 <- 8500000
births <- ns00/5
times <- seq(0,50,0.25)
init <- c(ns00=ns00,ns05=ns05,ns10=ns10)
parameters <- c(births,mort)
out <- ode(func=smokdiff, times=times, y=init, parms=parameters)

0 个答案:

没有答案