Метод Эйлера-Маруямы
В исчислении Ито метод Эйлера -Маруямы (также называемый просто методом Эйлера ) — это метод приближенного численного решения стохастического дифференциального уравнения (СДУ). Это расширение метода Эйлера для обыкновенных дифференциальных уравнений на стохастические дифференциальные уравнения, названные в честь Леонарда Эйлера и Гисиро Маруямы . То же самое обобщение невозможно сделать для любого произвольного детерминированного метода. [ 1 ]
Рассмотрим стохастическое дифференциальное уравнение (см. исчисление Ито )
с начальным условием X 0 = x 0 , где W t обозначает винеровский процесс , и предположим, что мы хотим решить это СДУ на некотором интервале времени [0, T ]. Тогда приближением Эйлера–Маруямы к истинному решению X является цепь Маркова Y , определенная следующим образом:
- Разобьем интервал [0, T ] на N равных подинтервалов шириной :
- Установить Y 0 = х 0
- Рекурсивно определите Y n для 0 ≤ n ≤ N-1 по формуле
- где
Случайные величины Δ W n являются независимыми и одинаково распределенными нормальными случайными величинами с нулевым математическим ожиданием и дисперсией Δ t .
Пример
[ редактировать ]Численное моделирование
[ редактировать ]
Областью, которая получила значительную выгоду от СДУ, является математическая биология . Поскольку многие биологические процессы носят как стохастический, так и непрерывный характер, численные методы решения СДУ очень ценны в этой области.
На рисунке изображено стохастическое дифференциальное уравнение, решенное с использованием метода Эйлера-Маруямы. Детерминированный аналог показан синим цветом.
Компьютерная реализация
[ редактировать ]Следующий код Python реализует метод Эйлера-Маруямы и использует его для решения процесса Орнштейна-Уленбека, определенного формулой
Случайные числа для генерируются с использованием математического пакета NumPy .
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
class Model:
"""Stochastic model constants."""
THETA = 0.7
MU = 1.5
SIGMA = 0.06
def mu(y: float, _t: float) -> float:
"""Implement the Ornstein–Uhlenbeck mu."""
return Model.THETA * (Model.MU - y)
def sigma(_y: float, _t: float) -> float:
"""Implement the Ornstein–Uhlenbeck sigma."""
return Model.SIGMA
def dW(delta_t: float) -> float:
"""Sample a random number at each call."""
return np.random.normal(loc=0.0, scale=np.sqrt(delta_t))
def run_simulation():
""" Return the result of one full simulation."""
T_INIT = 3
T_END = 7
N = 1000 # Compute at 1000 grid points
DT = float(T_END - T_INIT) / N
TS = np.arange(T_INIT, T_END + DT, DT)
assert TS.size == N + 1
Y_INIT = 0
ys = np.zeros(TS.size)
ys[0] = Y_INIT
for i in range(1, TS.size):
t = T_INIT + (i - 1) * DT
y = ys[i - 1]
ys[i] = y + mu(y, t) * DT + sigma(y, t) * dW(DT)
return TS, ys
def plot_simulations(num_sims: int):
""" Plot several simulations in one image."""
for _ in range(num_sims):
plt.plot(*run_simulation())
plt.xlabel("time")
plt.ylabel("y")
plt.show()
if __name__ == "__main__":
NUM_SIMS = 5
plot_simulations(NUM_SIMS)
Ниже приведен просто перевод приведенного выше кода на язык программирования MATLAB (R2019b) :
%% Initialization and Utility
close all;
clear all;
numSims = 5; % display five runs
tBounds = [3 7]; % The bounds of t
N = 1000; % Compute at 1000 grid points
dt = (tBounds(2) - tBounds(1)) / N ;
y_init = 0; % Initial y condition
% Initialize the probability distribution for our
% random variable with mean 0 and stdev of sqrt(dt)
pd = makedist('Normal',0,sqrt(dt));
c = [0.7, 1.5, 0.06]; % Theta, Mu, and Sigma, respectively
ts = linspace(tBounds(1), tBounds(2), N); % From t0-->t1 with N points
ys = zeros(1,N); % 1xN Matrix of zeros
ys(1) = y_init;
%% Computing the Process
for j = 1:numSims
for i = 2:numel(ts)
t = tBounds(1) + (i-1) .* dt;
y = ys(i-1);
mu = c(1) .* (c(2) - y);
sigma = c(3);
dW = random(pd);
ys(i) = y + mu .* dt + sigma .* dW;
end
figure;
hold on;
plot(ts, ys, 'o')
end
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Клоден, П.Е. и Платен, Э. (1992). Численное решение стохастических дифференциальных уравнений . Шпрингер, Берлин. ISBN 3-540-54062-8 .