我在r中的ODE函数有问题,我不断得到错误"Error in checkFunc(Func2, times, y, rho) : The number of derivatives returned by func() (3006) must equal the length of the initial conditions vector (6)
"。这个函数似乎产生了tspan的大小加上初始条件向量的个数的导数。对如何办理有什么建议吗?
library(deSolve)
tend <- 300
dt <- 1
tspan <- seq(0, tend, by = dt)
# Parameters
rHI <- 0.4 # PI producers
rHN <- 0.4 # X2 free riders
rLI <- rHI * 0.1 # Xr resistant
rLN <- rHI * 0.1
K <- 10e13 # carrying capacity of tumor
delta0 <- 2
rhoS <- 1
rhoI <- 1
lambdaA <- 0.5
lambdaS <- 0.5
beta <- 1
eta <- 1e3
lambdaAS <- 0.02
BCG_dose <- 4e6
t0 <- 0
tnow <- times[1]
## Initial Conditions
TV <- 1.4 * 10e10
HI0 <- 0.5 * TV
HN0 <- 0.0 * TV
LI0 <- 0.25 * TV
LN0 <- 0.25 * TV
A0 <- 0
S0 <- 0
##Setting Up
initcond <- c(HI0, HN0, LI0, LN0, A0, S0)
names(initcond) <- c("HI", "HN", "LI", "LN", "A", "S")
##Setting Up BCG dose
interval <- 7
BCG <- rep(0, length(tspan))
BCG[seq(interval, length(tspan), by = interval)] <- BCG_dose
for (i in 2:length(tspan)) {
if (tspan[i] - tnow >= interval) {
# update tnow and BCG0 for exponential decay
BCG0 <- BCG[i-1]
t0 <- tnow
tnow <- tspan[i]
BCG[i] <- BCG0 * exp(-0.3 * (tnow - t0))
} else {
BCG[i] <- BCG[i-1]
}
}
bladder_ODE <- function(t, x, params, BCG) {
HI <- x[1]
HN <- x[2]
LI <- x[3]
LN <- x[4]
A <- x[5]
S <- x[6]
BCG0 <- BCG[which.max(tspan <= t)]
dBCG <- -BCG0 * exp(-0.3 * (t - t0))
BCG[which.max(tspan <= t)] <- BCG0 + dBCG
delta <- delta0 * max((A/(S+A) - 0.5), 0)
dHI <- rHI * HI * (1 - (HI + HN + LI + LN) / K) - delta * HI
dHN <- rHN * HN * (1 - (HI + HN + LI + LN) / K)
dLI <- rLI * LI * (1 - (HI + HN + LI + LN) / K)
dLN <- rLN * LN * (1 - (HI + HN + LI + LN) / K)
dA <- rhoS * (HI + LI) + beta * BCG / (eta + BCG) - lambdaA * A
dS <- rhoI * (HN + LN) - lambdaS * S - lambdaAS * A * S
return(list(c(dHI, dHN, dLI, dLN, dA, dS)))
}
out <- ode(y = initcond, times = tspan, func = bladder_ODE)
我已经尝试改变定义tspan的位置,但是,我仍然遇到同样的问题。我还将迭代的大小从0.1更改为1,但是,它仍然不起作用。
问题是,在bladder_ODE
模型中,dA
-方程中使用了变量BCG
。由于BCG
是一个有301个值的向量,因此对方程进行矢量化,将dA
扩展为301个元素。
这段代码还包含另外两个小问题:
- 在第5行,
tspan
被定义,但下面的一些行,tnow <- times[1]
出现,那可能是tnow <- tspan[1]
- 函数
bladder_ODE <- function(t, x, params, BCG)
包含一个参数BCG
,该参数也需要在ode
函数调用中使用,见下文。
通过这些更改,现在可以重现错误。我在代码中放置了两个cat
行来打印受影响变量的长度。
bladder_ODE <- function(t, x, params, BCG) {
HI <- x[1]
HN <- x[2]
LI <- x[3]
LN <- x[4]
A <- x[5]
S <- x[6]
BCG0 <- BCG[which.max(tspan <= t)]
dBCG <- -BCG0 * exp(-0.3 * (t - t0))
BCG[which.max(tspan <= t)] <- BCG0 + dBCG
cat(length(BCG), "n") # <----------
delta <- delta0 * max((A/(S+A) - 0.5), 0)
dHI <- rHI * HI * (1 - (HI + HN + LI + LN) / K) - delta * HI
dHN <- rHN * HN * (1 - (HI + HN + LI + LN) / K)
dLI <- rLI * LI * (1 - (HI + HN + LI + LN) / K)
dLN <- rLN * LN * (1 - (HI + HN + LI + LN) / K)
dA <- rhoS * (HI + LI) + beta * BCG / (eta + BCG) - lambdaA * A
dS <- rhoI * (HN + LN) - lambdaS * S - lambdaAS * A * S
cat(length(dA), "n") # <-----------
return(list(c(dHI, dHN, dLI, dLN, dA, dS)))
}
## aded argument BCG
out <- ode(y = initcond, times = tspan, func = bladder_ODE, BCG=BCG)
然后返回:
301
301
Error in checkFunc(Func2, times, y, rho) :
The number of derivatives returned by func() (306) must equal the length of the initial conditions vector (6)
除此之外,完整的BCG[which.max(....)]
看起来很不寻常。你可以在StackOverflow或整个互联网上搜索:
另一个注释:初始状态的数量级相当大(1e10),这会导致数值问题。原则上,可以为每个状态变量设置单独的公差。然而,重新确定问题的规模通常更容易。我通常建议将其重新调整到0.0001到10000之间,或者在0.001到1000之间更好。