【发布时间】:2019-04-19 15:41:23
【问题描述】:
我尝试了解如何以数值方式求解随机微分方程 (SDE)(我没有任何语言的经验,但出于某些原因我选择了 Julia)。作为初始模型,我决定使用Lotka-Volterra equations。我为DifferentialEquations.jl 阅读了手册和tutorial。虽然我的模型是一个简单的 ODE 系统:
一切正常:
using DifferentialEquations
using Plots
function lotka(du,u,p,t);
????, ????, ????, ???? = p;
du[1] = ????*u[1]-????*u[1]*u[2];
du[2] = ????*u[1]*u[2]-????*u[2];
end
u0 = [15.0,1.0,0.0,0.0];
p = (0.3,0.05,0.7,0.1);
tspan = (0.0,50.0);
prob = ODEProblem(lotka,u0,tspan,p);
sol = solve(prob);
plot(sol,vars = (1,2))
现在我想添加 Ornstein-Uhlenbeck 噪声:
愚蠢的直接解决方案是:
using DifferentialEquations
using Plots
function lotka(du,u,p,t);
????, ????, ????, ????, ????, ???? = p;
du[1] = ????*u[1]-????*u[1]*u[2]+u[3];
du[2] = ????*u[1]*u[2]-????*u[2]+u[4];
du[3] = -u[3]/????+sqrt((2.0*????^2.0/????))*randn();
du[4] = -u[4]/????+sqrt((2.0*????^2.0/????))*randn();
end
u0 = [15.0,1.0,0.0,0.0];
p = (0.3,0.05,0.7,0.1,0.1,0.1);
tspan = (0.0,50.0);
prob = ODEProblem(lotka,u0,tspan,p);
sol = solve(prob);
但是,正如预期的那样,它不起作用,因为求解器不适用于此类 SDE 问题。
┌ Warning: Interrupted. Larger maxiters is needed.
└ @ DiffEqBase /home/jrun/.julia/packages/DiffEqBase/ujEgN/src/integrator_interface.jl:116
我试图阅读SDE Julia documentation,但没有好的例子我无法理解如何处理它。此外,我的数学背景很差,而且我似乎没有正确理解符号。我怎样才能使它适用于 SDE?
更新:
最后,我有以下代码:
using DifferentialEquations,Plots;
function lotka(du,u,p,t);
????, ????, ????, ????, ????, ???? = p;
du[1] = ????*u[1]-????*u[1]*u[2];
du[2] = ????*u[1]*u[2]-????*u[2];
end
function stoch(du,u,p,t)
????, ????, ????, ????, ????, ???? = p;
du[1] = 1
du[2] = 1
end
u0 = [15.0,1.0];
p = (0.3,0.05,0.7,0.1,0.9,0.1);
????, ????, ????, ????, ????, ???? = p;
OU = OrnsteinUhlenbeckProcess(1/????, 0.0, ????, 0.0, 0.0);
tspan = (0.0,100.0);
prob = SDEProblem(lotka,stoch,u0,tspan,p,noise = OU);
sol = solve(prob,EM(),dt = 1e-3, adaptive=false);
要结束这个话题,我还有两个问题:
-
它是正确的代码吗? (恐怕在这种情况下我的噪音不是对角线)
-
我可以为两个方程中的每一个设置不同的初始噪声 (W0) 吗?
【问题讨论】:
-
“它没有用”...你这是什么意思?您的脚本是否以错误消息结尾,或者输出与您预期的不一样?
-
@SvenKrüger 我在主题中添加错误消息
-
这不是错误,它“只是”一个警告。尝试提供更大的时间间隔
tspan = [0 t_max],其中t_max > 50。 -
好的,这是一个警告,我可能会尝试更改 maxiter 参数,但这不是一个好的解决方案。他们是专门设计的求解器,我不明白如何使用
-
应该是 prob = SDEProblem(lotka,u0,tspan,p);
标签: julia numerical-methods differential-equations stochastic