Jump to content

Метод Эйлера-Маруямы

В исчислении Ито метод Эйлера -Маруямы (также называемый просто методом Эйлера ) — это метод приближенного численного решения стохастического дифференциального уравнения (СДУ). Это расширение метода Эйлера для обыкновенных дифференциальных уравнений на стохастические дифференциальные уравнения, названные в честь Леонарда Эйлера и Гисиро Маруямы . То же самое обобщение невозможно сделать для любого произвольного детерминированного метода. [ 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

См. также

[ редактировать ]
  1. ^ Клоден, П.Е. и Платен, Э. (1992). Численное решение стохастических дифференциальных уравнений . Шпрингер, Берлин. ISBN  3-540-54062-8 .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: ccc630c20bf8ff7b49c2a2db6595427e__1722867180
URL1:https://arc.ask3.ru/arc/aa/cc/7e/ccc630c20bf8ff7b49c2a2db6595427e.html
Заголовок, (Title) документа по адресу, URL1:
Euler–Maruyama method - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)