R中的Lsoda函数

R中的Lsoda函数,r,ode,R,Ode,为了计算我的2方程组的行为,我在R中使用了lsoda函数。参数a随时间变化:当时间为偶数时为1,否则为0。以下是一个最小的可复制示例: mo=function(t,x,m){ if(t%%2==0){ a=m }else{ a=0 } dx=rep(0,2) dx[1]=-a*x[1] dx[2]=a*x[1] res=dx return(list(dx)) } xs=c(10,0) ti=1:100 m=1 data1=as.data.frame(lsoda(xs,ti,mo,m)

为了计算我的2方程组的行为,我在R中使用了lsoda函数。参数a随时间变化:当时间为偶数时为1,否则为0。以下是一个最小的可复制示例:

mo=function(t,x,m){
if(t%%2==0){
   a=m
}else{
   a=0
}
dx=rep(0,2)
dx[1]=-a*x[1]
dx[2]=a*x[1]
res=dx
return(list(dx))
}
xs=c(10,0)
ti=1:100
m=1
data1=as.data.frame(lsoda(xs,ti,mo,m))

问题是,当你调查结果时,你会发现x[1]保持在10,而x[2]保持在0,这意味着lsoda总是取a的值0(而不是1)。这是模的问题吗?

lsoda
选择自己的内部时间步长,因此无法保证
t%%2==0
在该条件为真时(例如,
t=2
)即使请求输出也会为真。我的理解是,
lsoda
将在求解时间之间进行插值,以在用户要求的时间获得输出,而不一定在这些时间求解模型。根据经验,硬的时间或空间接口是一件坏事™ 当涉及到数值常微分方程解算器时

我试图将条件t%%2==0替换为“tI不遵循”。当我使用
tYes时,就是这样。这意味着问题不仅与时间步长有关,还与模函数有关。一种解释可能是,所使用的时间步长不是数字。你怎么看?不,这是因为
lsoda
t%%2==0
的时间段内移动。将打印语句放入
t
a
t%%2
中,观察它们的变化
lsoda
当此语句为真时,会逐步执行,因此它永远不会为真。时间必须能被二整除才是真的。由于
lsoda
可以工作到许多小数位,所以这种情况很可能从未发生过。是的,对不起,我想说的是整数而不是数字。谢谢