在微分方程解中非常小的种群/状态变量为零

我之所以发布,是因为我正在数值上求解常微分方程,并且想约束状态变量。总而言之,我是一个模拟种群的生物学家,并希望当种群变得很小时灭绝。

当我运行模型时,种群会变得非常小(例如

在微分方程解中非常小的种群/状态变量为零

),但永远不会达到0。对我而言,这样做很重要,这样我就可以计算出灭绝率。但是更现实的是,当一个人口的密度远小于地球上原子的密度时,那不是太现实;)

即使在像下面这样的简单的2种物种的敌方受害者模型中,

在微分方程解中非常小的种群/状态变量为零

的密度也想被解释为0。

library(package = "deSolve")

lv <- function(times,state,parms) {
    with(as.list(c(state,parms)),{
    dR <- 2*R - 0.5*R*C
    dC <- 0.2*R*C - 0.6*C
    return(list(c(dR,dC)))
    })
}

time_vec <- seq(from = 0,to = 100,length.out = 1e4)
y_0 <- c(R = 50,C = 20)

out <- ode(y = y_0,times = time_vec,func = lv,parms = NULL,method = "lsoda")
min(out[,-1])
plot(x = out[,2],y = out[,3],type = "l")

理想情况下,我想看看如何使用R中的求解器“ deSolve”来模拟灭绝,但是对于将我引向此类问题的一般答案/名称的任何帮助,也将不胜感激。

P.S。这类似于关于用0(link)替换负值的帖子,但是有所不同,因为我希望总体不只是非负数,而是无限地保持为0。但是,在这篇文章中,如何做到这一点也没有很好的答案。

ccyzzxt 回答:在微分方程解中非常小的种群/状态变量为零

这里是一个例子。如前所述,非常务实。

library(package = "deSolve")

lv <- function(times,state,parms) {
  with(as.list(c(state,parms)),{
    dR <- 2*R - 0.5*R*C
    dC <- 0.2*R*C - 0.6*C
    return(list(c(dR,dC)))
  })
}

time_vec <- seq(from = 0,to = 100,length.out = 1e4)
y_0 <- c(R = 50,C = 20)
out <- ode(y = y_0,times = time_vec,func = lv,parms = NULL,method = "lsoda")
min(out[,-1])

eps <- 1e-2
## event triggered if state variable <= eps
rootfun <- function (t,y,pars) {
  return(y - eps)
}

## sets state variable = 0
eventfun <- function(t,pars) {
  if (y[1] <= eps) y[1] <- 0
  if (y[2] <= eps) y[2] <- 0
  return(y)
}

out1 <- ode(y = y_0,method = "lsoda",rootfun = rootfun,events = list(func = eventfun,root = TRUE))

plot(out,out1)
min(out1[,-1])
本文链接:https://www.f2er.com/2982867.html

大家都在问