用R数值求解Lotka-Volterra ODE

时间:2019-02-12 09:39:44

标签: r ode

免责声明:在Stack Computational Science

上的交叉发布

目标:我正在尝试使用sde package中的de sde.sim()函数以数字方式求解R中的Lotka-Volterra ODE。我想使用sde.sim()函数,以便最终将此系统转换为SDE。因此,最初,我从一个没有噪声项的简单ODE系统(Lotka Volterra模型)开始。

Lotka-Volterra ODE系统:

dxdt

,初始值分别为x = 10和y = 10。

alpha,beta,delta和gamma的参数值分别为1.1、0.4、0.1和0.4(类似于example)。

试图解决问题:

library(sde)
d <- expression((1.1 * x[0] - 0.4 * x[0] * x[1]), (0.1 * x[0] * x[1] - 0.4 * x[1]))
s <- expression(0, 0)
X <- sde.sim(X0=c(10,10), T = 10, drift=d, sigma=s) 
plot(X)

但是,这似乎并没有产生捕食者和被捕食者种群的良好循环行为。

预期产量

我在R中使用了deSolve包来生成预期的输出。

library(deSolve)
alpha <-1.1
beta <- 0.4
gamma <- 0.1
delta <- 0.4

yini <- c(X = 10, Y = 10) 
Lot_Vol <- function (t, y, parms) {
  with(as.list(y), {
    dX <- alpha * X - beta * X * Y 
    dY <- 0.1 * X * Y - 0.4 * Y
    list(c(dX, dY))
  }) }
times <- seq(from = 0, to = 100, by = 0.01)
out   <- ode(y = yini, times = times, func = Lot_Vol, parms = NULL)
plot(y=out[, "X"], x = out[, "time"], type = 'l', col = "blue", xlab = "Time", ylab = "Animals (#)")
lines(y=out[, "Y"], x = out[, "time"], type = 'l', col = "red")

enter image description here

问题

我认为漂移功能可能有问题,但是我不确定。试图在sde.sim()中解决此ODE系统的问题是什么?

1 个答案:

答案 0 :(得分:3)

假设未指定方法在列表中排在第一位,并且所有其他未指定的参数都在默认值下,则您正在以步长h=0.1执行Euler方法。

众所周知,对于具有凸同心轨迹的函数,欧拉方法将产生向外的螺旋。作为一阶方法,错误的大小应增加到T*h=10*0.1=1左右。或者,如果要进行更悲观的估计,则错误的大小为(exp(LT)-1)*h/L,而L=3处于某种适应的范式中,这将得出3.5e11的小数位数。


探究Euler方法的实际误差e(t)=c(t)*h,可以得到以下图表。欧拉方法中,左边是各步长的分量误差,右边是各种步长的轨迹。左图中函数c(t)的误差系数按因子(exp(L*t)-1)/L进行缩放,以在较大的时间间隔内获得可比的值,值L=0.06达到了最佳平衡。

error and solution plot

可以看到实际错误

abs(e(t))<30*h*(exp(L*t)-1)/L

在线性误差模型和指数误差模型之间,但更接近线性误差模型。


要减少错误,您必须减小步长。在SDE.sim的调用中,这是通过设置参数N=5000或更大以获取步长h=10/5000=0.002来实现的,这样您可以希望前两位数字正确无误30*h*T=0.6的边界。在SDE情况下,您在每一步中都会累积大小为sqrt(h)的高斯噪声,因此O(h^2)的截断误差是对随机数的相当小的扰动。