Случайные обыкновенные дифференциальные уравнения
В этом руководстве содержатся сведения о функциональных возможностях для решения случайных обыкновенных дифференциальных уравнений (RODE). Другие руководства можно найти в SciMLTutorials.jl.
Здесь предполагается, что вы ознакомились с руководством об обыкновенных дифференциальных уравнениях. |
Пример 1. Скалярные обыкновенные дифференциальные уравнения со случайным параметром (RODE)
В этом примере мы будем решать уравнение,
где , а представляет собой процесс Винера (процесс Гаусса).
using DifferentialEquations
using Plots
function f3(u, p, t, W)
2u * sin(W)
end
u0 = 1.00
tspan = (0.0, 5.0)
prob = RODEProblem(f3, u0, tspan)
sol = solve(prob, RandomEM(), dt = 1 / 100)
plot(sol)
В качестве случайного процесса по умолчанию используется процесс Винера/Гаусса, поэтому больше ничего не требуется. В документации по NoiseProcess
можно узнать, как определяются другие процессы шума.
Пример 2. Система обыкновенных дифференциальных уравнений со случайным параметром
Как и в случае с другими типами задач, существует версия на месте, которая более эффективна для систем. Вот сигнатура: f(du,u,p,t,W)
. Например,
using DifferentialEquations
using Plots
function f(du, u, p, t, W)
du[1] = 2u[1] * sin(W[1] - W[2])
du[2] = -2u[2] * cos(W[1] + W[2])
end
u0 = [1.00; 1.00]
tspan = (0.0, 5.0)
prob = RODEProblem(f, u0, tspan)
sol = solve(prob, RandomEM(), dt = 1 / 100)
plot(sol)
По умолчанию размер процесса шума совпадает с размером u0
. Однако для явного задания размера случайного процесса можно использовать ключевое слово rand_prototype
:
using DifferentialEquations
using Plots
function f(du, u, p, t, W)
du[1] = -2W[3] * u[1] * sin(W[1] - W[2])
du[2] = -2u[2] * cos(W[1] + W[2])
end
u0 = [1.00; 1.00]
tspan = (0.0, 5.0)
prob = RODEProblem(f, u0, tspan, rand_prototype = zeros(3))
sol = solve(prob, RandomEM(), dt = 1 / 100)
plot(sol)