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 求解器时,硬时间或空间接口是一件坏事™。
为了计算我的 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 求解器时,硬时间或空间接口是一件坏事™。