【发布时间】:2021-05-03 17:03:17
【问题描述】:
假设我们在 R 中有一个任意的 ODE 系统,我们想要解决它,例如 SIR 模型
dS <- -beta * I * S
dI <- beta * I * S - gamma * I
dR <- gamma * I
例如,我希望 beta 和 gamma 具有随时间变化的参数
beta_vector <- seq(0.05, 1, by=0.05)
gamma_vector <- seq(0.05, 1, by=0.05)
用户@Ben Bolker 给了我在梯度函数中使用 beta
sir_1 <- function(beta, gamma, S0, I0, R0, times) {
require(deSolve) # for the "ode" function
# the differential equations:
sir_equations <- function(time, variables, parameters) {
beta <- beta_vector[ceiling(time)]
gamma <- gamma_vector[ceiling(time)]
with(as.list(c(variables, parameters)), {
dS <- -beta * I * S
dI <- beta * I * S - gamma * I
dR <- gamma * I
return(list(c(dS, dI, dR)))
})
}
# the parameters values:
parameters_values <- c(beta=beta, gamma = gamma)
# the initial values of variables:
initial_values <- c(S = S0, I = I0, R = R0)
# solving
out <- ode(initial_values, times, sir_equations, parameters_values)
# returning the output:
as.data.frame(out)
}
sir_1(beta = beta, gamma = gamma, S0 = 99999, I0 = 1, R0 = 0, times = seq(0, 19))
当我执行它时,它给了我以下错误
Error in checkFunc(Func2, times, y, rho) :
The number of derivatives returned by func() (1) must equal the length of the initial
conditions vector (3)
问题一定出在此处:
parameters_values <- c(beta=beta, gamma = gamma)
我尝试将 paramters_values 更改为具有两行(第一行是 beta,第二行是 gamma)或两列的 Matrix,但它不起作用。我必须做什么才能完成这项工作?
【问题讨论】:
-
我无法重现您的错误。其实我可以成功运行
sir_1(beta = 1, gamma = 1, S0 = 99999, I0 = 1, R0 = 0, times = seq(0, 19))。 -
@Peace Wang:我不希望 gamma 和 beta 被固定为 1(或任何其他值)我想要在 sir_1(beta = beta, gamma = gamma, S0 = 99999, I0 = 1, R0 = 0, times = seq(0, 19)) beta 和 gamma 为上面定义的向量
-
两点: 1. 即使使用您的代码,我也无法重现您的错误。 2. 你在哪里定义 gamma 和 beta?它不应该在
sir_equations或sir_1函数中定义。 -
感谢您尝试帮助我,这真的很奇怪,因为我再次运行它并得到相同的错误:这部分我在函数 beta_vector 之外定义
标签: r variables parameters ode