难度 运行 R 中的 ODE 模型,包括随时间变化的参数(强制函数)
Difficulty running an ODE model in R including a parameter that varies by time (forcing function)
我正在尝试使用 deSolve 拟合一个合理的基本 ODE 模型,包括在模型中随时间变化的参数(感染力;FOI)。虽然 运行 没有此参数的模型工作正常,但包含时间相关参数会产生错误(见下文)。
我对 R 和数学建模比较陌生,一段时间以来一直在尝试解决这个问题。
我将 FOI 参数创建为值矩阵,然后使用 approxfun 函数进行插值(正如我所见,这适用于强制函数,例如 https://rdrr.io/rforge/deSolve/man/forcings.html)。
没有这个与时间相关的参数的模型运行没有任何错误,但试图包含它会给出错误:
Error in checkFunc(Func2, times, y, rho) :
The number of derivatives returned by func() (200) must equal the
length of the initial conditions vector (2)
我不知道如何解决这个错误,因为我只有 2 个初始条件,而且似乎包含这个时间相关的 FOI 参数会生成更多的导数。
我知道其他人也问过类似的问题,但我没有发现这个问题是关于强制函数的。
非常感谢您的任何建议。
# Forcing function data
foi <- matrix(ncol=2,byrow=TRUE,data=c(
0, 0.003, 2, 0.03, 3, 0.08, 4,0.1, 5, 0.12, 6, 0.15,
8, 0.16, 10, 0.14,12, 0.12,14,0.08,15, 0.06,16, 0.03,
17, 0.01,18,0.003,19,0.003,20,0.003,30,0.003,40,0.003,
50,0.003,60,0.003,65,0.01, 70,0.08, 72,0.095,74,0.10,
76,0.1, 78,0.08, 80,0.06))
age <- seq(0, 80, by = 1)
input <- approxfun(x = foi[,1], y = foi[,2], method = "constant", rule = 2)
# Function
ab <- function(time, state, pars) {
with(as.list(c(state, pars)), {
import<-c(input(t))
diggP<- (import *iggN) - iggR*iggP
diggN<- (-import*iggN) + iggR*iggP
return(list(c(diggP, diggN)))
})
}
# Initial values
yini <- c(iggP=0, iggN=1)
# Parameters
pars <- c(iggR = 0, import)
# ODE solver
results<- ode(y=yini, times=age, func=foi_model, pars)
我希望制作一个模型,其中在每个时间点(或在本例中为年龄),FOI 根据我在 FOI 矩阵中输入的值而变化。因此,我想看看随年龄变化的 FOI 如何影响微分方程的输出。
您的主要问题是您将参数 t
传递给 input
,但您的代码中不存在该变量。时间作为名为 time
的参数传递给您的模型。 (此外,您的模型称为 ab
而不是 foi_model
,如对 ode
的调用中所述,加上 pars
不需要 import
,应该是传递给 ode
.)
# Load library
library(deSolve)
# Create FOI matrix
foi <- matrix(ncol=2,byrow=TRUE,data=c(
0, 0.003, 2, 0.03, 3, 0.08, 4,0.1, 5, 0.12, 6, 0.15,
8, 0.16, 10, 0.14,12, 0.12,14,0.08,15, 0.06,16, 0.03,
17, 0.01,18,0.003,19,0.003,20,0.003,30,0.003,40,0.003,
50,0.003,60,0.003,65,0.01, 70,0.08, 72,0.095,74,0.10,
76,0.1, 78,0.08, 80,0.06))
# Times for model solution
age <- seq(0, 80, by = 1)
# Linear interpolation function from FOI data
input <- approxfun(x = foi[,1], y = foi[,2], method = "constant", rule = 2)
# Model to be integrated
ab <- function(time, state, parms) {
with(as.list(c(state, parms)), {
##### IMPORTANT #####
import<-input(time) #<- 'time' was previously 't'
#####################
# Derivatives
diggP<- (import *iggN) - iggR*iggP
diggN<- (-import*iggN) + iggR*iggP
# Return results
return(list(c(diggP, diggN)))
})
}
# Initial values
yini <- c(iggP=0, iggN=1)
# Parameters
pars <- c(iggR = 0)
# Solve model
results<- ode(y=yini, times=age, func=ab, parms = pars)
# Plot results
plot(results)
由 reprex package (v0.2.1)
于 2019-03-27 创建
我正在尝试使用 deSolve 拟合一个合理的基本 ODE 模型,包括在模型中随时间变化的参数(感染力;FOI)。虽然 运行 没有此参数的模型工作正常,但包含时间相关参数会产生错误(见下文)。
我对 R 和数学建模比较陌生,一段时间以来一直在尝试解决这个问题。
我将 FOI 参数创建为值矩阵,然后使用 approxfun 函数进行插值(正如我所见,这适用于强制函数,例如 https://rdrr.io/rforge/deSolve/man/forcings.html)。
没有这个与时间相关的参数的模型运行没有任何错误,但试图包含它会给出错误:
Error in checkFunc(Func2, times, y, rho) :
The number of derivatives returned by func() (200) must equal the
length of the initial conditions vector (2)
我不知道如何解决这个错误,因为我只有 2 个初始条件,而且似乎包含这个时间相关的 FOI 参数会生成更多的导数。
我知道其他人也问过类似的问题,但我没有发现这个问题是关于强制函数的。
非常感谢您的任何建议。
# Forcing function data
foi <- matrix(ncol=2,byrow=TRUE,data=c(
0, 0.003, 2, 0.03, 3, 0.08, 4,0.1, 5, 0.12, 6, 0.15,
8, 0.16, 10, 0.14,12, 0.12,14,0.08,15, 0.06,16, 0.03,
17, 0.01,18,0.003,19,0.003,20,0.003,30,0.003,40,0.003,
50,0.003,60,0.003,65,0.01, 70,0.08, 72,0.095,74,0.10,
76,0.1, 78,0.08, 80,0.06))
age <- seq(0, 80, by = 1)
input <- approxfun(x = foi[,1], y = foi[,2], method = "constant", rule = 2)
# Function
ab <- function(time, state, pars) {
with(as.list(c(state, pars)), {
import<-c(input(t))
diggP<- (import *iggN) - iggR*iggP
diggN<- (-import*iggN) + iggR*iggP
return(list(c(diggP, diggN)))
})
}
# Initial values
yini <- c(iggP=0, iggN=1)
# Parameters
pars <- c(iggR = 0, import)
# ODE solver
results<- ode(y=yini, times=age, func=foi_model, pars)
我希望制作一个模型,其中在每个时间点(或在本例中为年龄),FOI 根据我在 FOI 矩阵中输入的值而变化。因此,我想看看随年龄变化的 FOI 如何影响微分方程的输出。
您的主要问题是您将参数 t
传递给 input
,但您的代码中不存在该变量。时间作为名为 time
的参数传递给您的模型。 (此外,您的模型称为 ab
而不是 foi_model
,如对 ode
的调用中所述,加上 pars
不需要 import
,应该是传递给 ode
.)
# Load library
library(deSolve)
# Create FOI matrix
foi <- matrix(ncol=2,byrow=TRUE,data=c(
0, 0.003, 2, 0.03, 3, 0.08, 4,0.1, 5, 0.12, 6, 0.15,
8, 0.16, 10, 0.14,12, 0.12,14,0.08,15, 0.06,16, 0.03,
17, 0.01,18,0.003,19,0.003,20,0.003,30,0.003,40,0.003,
50,0.003,60,0.003,65,0.01, 70,0.08, 72,0.095,74,0.10,
76,0.1, 78,0.08, 80,0.06))
# Times for model solution
age <- seq(0, 80, by = 1)
# Linear interpolation function from FOI data
input <- approxfun(x = foi[,1], y = foi[,2], method = "constant", rule = 2)
# Model to be integrated
ab <- function(time, state, parms) {
with(as.list(c(state, parms)), {
##### IMPORTANT #####
import<-input(time) #<- 'time' was previously 't'
#####################
# Derivatives
diggP<- (import *iggN) - iggR*iggP
diggN<- (-import*iggN) + iggR*iggP
# Return results
return(list(c(diggP, diggN)))
})
}
# Initial values
yini <- c(iggP=0, iggN=1)
# Parameters
pars <- c(iggR = 0)
# Solve model
results<- ode(y=yini, times=age, func=ab, parms = pars)
# Plot results
plot(results)
由 reprex package (v0.2.1)
于 2019-03-27 创建