免责声明:在Stack Computational Science
上的交叉发布 目标:我正在尝试使用sde package中的de sde.sim()
函数以数字方式求解R中的Lotka-Volterra ODE。我想使用sde.sim()
函数,以便最终将此系统转换为SDE。因此,最初,我从一个没有噪声项的简单ODE系统(Lotka Volterra模型)开始。
Lotka-Volterra ODE系统:
,初始值分别为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")
问题
我认为漂移功能可能有问题,但是我不确定。试图在sde.sim()
中解决此ODE系统的问题是什么?
答案 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
达到了最佳平衡。
可以看到实际错误
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)
的截断误差是对随机数的相当小的扰动。