将一组常微分方程应用于每个网格单元

时间:2017-06-27 15:02:35

标签: r ode differential-equations

我正在开发一种基于代理的模型,以模拟由栖息地多边形(或连接细胞团块)组成的异质景观中的传染病传播。为了简化模型,我考虑一个包含每个单元格的多边形ID的栖息地网格(或栅格)。另外,我有与每个多边形ID相关的流行病学参数。在每个时间步,参数值在多边形中改变。因此,在每个时间步骤更新数据帧</form> <!-- Define "Download .csv link here" --> <a href="javascript:void(0)" onclick="download_csv_function();" >Get data as csv file</a> </form> (见下文)。以下是t = 0的示例:

landscape

为了研究疾病动态,我还在开发基于常微分方程(ODE)系统的隔室模型。以下是表示ODE系统的示例:

landscape <- data.frame(polygon_ID = seq(1, 10, by = 1), 
                        beta = sample(c(100, 200, 400, 600), 10, replace = TRUE), 
                        gamma = sample(c(25, 26, 27, 28), 10, replace = TRUE))

在每个时间步,是否可以将ODE系统应用于数据框solve_sir_model <- function (times, parameters) { sir_model <- function (times, states, parameters) { with(as.list(c(states, parameters)), { dSdt <- -beta*S*I dIdt <- beta*S*I-gamma*I dRdt <- gamma*I dNdt <- dSdt + dIdt + dRdt return(list(c(dSdt, dIdt, dRdt, dNdt))) }) } states <- c(S = 99, I = 1, R = 0, N = 100) return(ode(y = states, times = times, func = sir_model, parms = parameters)) } require(deSolve) output <- as.data.frame(solve_sir_model(times = seq(0, 5, by = 1), parameters = c(beta = 400, gamma = 28))) 中的每个栖息地多边形(因此每一行)?我使用lsoda作为ODE求解器。我是否需要在每个时间步使用其他求解器来应用ODE?

修改

似乎函数landscape中的方法iteration在我的案例中非常有用:

  

方法“迭代”的特殊之处在于函数func应该   返回状态变量的新值而不是速率   更改。这可以用于基于个体的模型,以用于差异   方程式,或者在其中执行积分的情况   FUNC)。

我已经测试了该方法,但我不明白为什么它不适用于单个时间步骤:

ode

1 个答案:

答案 0 :(得分:1)

像这样。

# Library *not* require
library(deSolve)

# Parameters: number of polygons, beta, & gamma
n.polys <- 10 
beta <- sample(c(100, 200, 400, 600), n.polys, replace = TRUE)
gamma <- sample(c(25, 26, 27, 28), n.polys, replace = TRUE)

# Model defintion
sir_model <- function (t, Y, pars) { 
  # Break up state variable into parts
  S <- Y[1:n.polys]
  I <- Y[(n.polys+1):(2 * n.polys)]
  R <- Y[(2 * n.polys+1):(3 * n.polys)]

  # Calculate rate of change
  dSdt <- -beta * S * I 
  dIdt <- beta * S * I - gamma * I 
  dRdt <- gamma * I 

  # Return rates of change after concatenating them 
  return(list(c(dSdt, dIdt, dRdt))) 
} 

# Initial conditions
Y.ini <- c(S = rep(99, n.polys), I = rep(1, n.polys), R = rep(0, n.polys)) 

# Solve the model
ode(y = Y.ini, times = 0:5, func = sir_model, parms = NULL)