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
我正在使用 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