R 中的 Lsoda 函数

Lsoda function in R

为了计算我的 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 将在求解时间之间进行插值以在用户请求的时间获得输出,而不一定会在这些时间求解模型。根据经验,当涉及到数值 ODE 求解器时,硬时间或空间接口是一件坏事™。