Я пытаюсь понять, как решать стохастические дифференциальные уравнения (СДУ) численно (у меня нет опыта в любом языке, но по некоторым причинам я выбрал Юлию). В качестве начальной модели я решил использовать уравнения Лотки-Вольтерры. Я прочитал руководство и руководство для DifferentialEquations.jl. Пока моя модель представляет собой простую систему 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))
Теперь я хочу добавить шум Орнштейна-Уленбека:
Глупое простое решение:
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, но без хорошего примера я не мог понять как с этим бороться. Кроме того, у меня плохой математический фон, и, похоже, я неправильно понял обозначения. Как я могу заставить это работать для 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) для каждого из двух уравнений?
tspan = [0 t_max]
, гдеt_max > 50
. - person Sven Krüger   schedule 16.11.2018a,b
вdX = a(t,X) dt + b(t,X) dW
в качестве аргументов в конструктореSDEProblem
. - person Lutz Lehmann   schedule 16.11.2018