在ODE中强制执行功能

时间:2015-09-16 04:28:46

标签: r differential-equations

我有一个普通微分方程系统,它包含一个强制函数R_0。强制函数具有在每个时间步计算的公式。我尝试在R中使用approxfunc(),但是当我打印R_0_matrix时,我在每个时间点都在R_0列上得到(?),当我运行R_0_value

时收到此错误消息
 Error in xy.coords(x, y) : 
  (list) object cannot be coerced to type 'double'  

我不知道代码中的错误在哪里,任何帮助都将不胜感激

以下是我的代码的一部分:

# define model paramters
parameters <- c(N = 3.2*10^6,L =1000/15,dimm = 1/1.07, d_in = 75/365, d_treat0 = 2/52, p1 = 0.87, p2 = 0.08, k = 0.082, eta0 = 0.05, R_m =1.23,amp = 0.67,phi = 3/12)

# R_0 Forcing Function
t <- seq(0, 100, by = 0.1)
R_0 <-function(t,paramters){
    with(as.list(parameters),{
    R_0=R_m*amp*cos(2*pi*(t-phi))+R_m
    return(R_0)
    })
}

R_0_matrix <-cbind(t,R_0)
R_0_value<- approxfun(x=R_0_matrix[,1], y= R_0_matrix[,2], method="linear", rule=2)

1 个答案:

答案 0 :(得分:1)

R_0是一个功能。所以cbind(t, R_0)可能不是你想要的,因为它试图创建一个矩阵,其中一列是数字而另一列是函数。看看会发生什么,例如,如果您在控制台中输入:cbind(1:10, function(x) {x})。可能你打算这样做:

R_0_t = R_0(t, parameters)

R_0_matrix <- cbind(t, R_0_t)
R_0_value <- approxfun(x=R_0_matrix[,1], y= R_0_matrix[,2], method="linear", rule=2)

命名函数R_0,然后在函数环境R_0中调用计算对象可能会引起一些混淆。即使该函数在函数环境中创建了一个名为R_0 的对象,但全局环境中存在的对象R_0也是函数本身。为避免混淆,最好为函数和函数环境中创建的任何对象使用不同的名称。

此外,该函数不会将名为R_0的对象返回到全局环境。它只返回通过计算函数R_0得到的数字向量。全局环境中此返回向量的名称是您在调用函数时分配的内容(上面的代码示例中为R_0_t)。

只是为了检查近似函数:

plot(t[1:30], R_0_t[1:30], type="l", lwd=2)
lines(t[1:30], R_0_value(t[1:30]), col="red", lwd=6, lty=3)

enter image description here