ODE:在时间轴中交替使用两个函数

ODE: alternate two functions in a timeline

我正在使用 ODE,我想交替 rk(x, times1, func1, parms)rk(x, times2, func2, parms) 20 次累积(更新)状态变量,所以每个新的 运行 都从上一个 运行。提前致谢!

require(deSolve)
func1 <- function(t, x, parms) {
  with(as.list(c(parms, x)),{

    drN  = k*(No-N) - (Np+Tp) + r*(Np+Tp)  
    drNp = L1*Np - r*Np - (s+k)*Np
    drTp = L2*Tp - r*Tp - (s+k)*Tp
    res <- c(drN, drNp, drTp)
    list(res)
  })
}

func2 <- function(t, x, parms) {
  with(as.list(c(parms, x)),{

    drN  = k*(No-N) - (Np+Tp) + r*(Np+Tp) + 1  
    drNp = L1*Np - r*Np - (s+k)*Np + 1
    drTp = L2*Tp - r*Tp - (s+k)*Tp + 1
    res <- c(drN, drNp, drTp) + 1
    list(res)
  })
}

times1  <- seq(0, 200, length = 200)
times2  <- seq(0, 20, length = 200)

parms  <- c(L1=0.4, L2=0.3, No=1.3, k=0.5, r=0.3, s=0.2)
x <- c(N = 0.4, Np = 0.01, Tp = 0.01)


out <- rk(x, times1, func1, parms) + rk(x, times2, func2, parms) +
  rk(x, times1, func1, parms) + rk(x, times2, func2, parms) +
  rk(x, times1, func1, parms) + rk(x, times2, func2, parms) +
  rk(x, times1, func1, parms) + rk(x, times2, func2, parms) #this is what I tried, but failed


plot (out)

这是我的快速解决方案,虽然不优雅,但有效:

out_list <- list()
combined <- matrix(data = c(0,0,0,0), ncol = 4)
time_sum <- 0

for(i in seq(1,20,2)){

  out1 <- rk(x, times1, func1, parms) 

  out_list[[i]] <- out1
  x <- out1[200,2:4]

  ## sum up timeline
  time_sum <- c(time_sum, time_sum[length(time_sum)]+out1[,"time"])

  out2 <- rk(x, times2, func2, parms) 

  out_list[[i+1]] <- out2
  x <- out2[200,2:4]

  ## sum up timeline
  time_sum <- c(time_sum, time_sum[length(time_sum)]+out2[,"time"])

  ## combine both ODEs
  combined <- rbind(combined, rbind(out1, out2))

}

## remove first column and "time" from combined matrix
combined <- combined[-1,]
time_sum <- time_sum[-1]

## plot ----
matplot(time_sum,combined[,2:4], type = "l")

此致,
J_F