Метод Эйлера – Маруямы - Euler–Maruyama method
В Исчисление Ито, то Метод Эйлера – Маруямы (также называемый Метод Эйлера) - метод приближенного численное решение из стохастическое дифференциальное уравнение (SDE). Это простое обобщение Метод Эйлера за обыкновенные дифференциальные уравнения к стохастическим дифференциальным уравнениям. Он назван в честь Леонард Эйлер и Гисиро Маруяма. К сожалению, такое же обобщение нельзя сделать ни для какого произвольного детерминированного метода.[1]
Рассмотрим стохастическое дифференциальное уравнение (см. Исчисление Ито )
с начальное состояние Икс0 = Икс0, куда Wт стоит за Винеровский процесс, и предположим, что мы хотим решить это СДУ на некотором интервале времени [0,Т]. Тогда Приближение Эйлера – Маруямы к истинному решению Икс это Цепь Маркова Y определяется следующим образом:
- разбить интервал [0,Т] в N равные подынтервалы ширины :
- набор Y0 = Икс0;
- рекурсивно определить Yп для 1 ≤п ≤ N к
- куда
В случайные переменные ΔWп находятся независимые и одинаково распределенные нормальные случайные величины с ожидаемое значение ноль и отклонение .
Пример
Численное моделирование
Область, которая получила значительную пользу от SDE, - это биология или, точнее, математическая биология. Здесь количество публикаций по использованию стохастической модели выросло, так как большинство моделей являются нелинейными, требующими численных схем.
На графике изображено стохастическое дифференциальное уравнение, решаемое с использованием схемы Эйлера. Также показан детерминированный аналог.
Компьютерная реализация
Следующее Python код реализует метод Эйлера – Маруямы и использует его для решения Процесс Орнштейна – Уленбека определяется
Случайные числа для генерируются с использованием NumPy пакет математики.
1 # - * - кодировка: utf-8 - * - 2 импорт тупой в качестве нп 3 импорт matplotlib.pyplot в качестве plt 4 5 num_sims = 5 # Показать пять прогонов 6 7 t_init = 3 8 иметь тенденцию = 7 9 N = 1000 # Вычислить 1000 точек сетки10 dt = плавать(иметь тенденцию - t_init) / N11 y_init = 012 13 c_theta = 0.714 c_mu = 1.515 c_sigma = 0.0616 17 def му(у, т):18 "" "Внедрить" му "Орнштейна – Уленбека" "" # = тета ( му-Y_t)19 возвращаться c_theta * (c_mu - у)20 21 def сигма(у, т):22 "" "Реализуйте сигму Орнштейна – Уленбека." "" # = sigma23 возвращаться c_sigma24 25 def dW(delta_t):26 "" "Выбор случайного числа при каждом вызове." ""27 возвращаться нп.случайный.нормальный(место=0.0, шкала=нп.sqrt(delta_t))28 29 ts = нп.апельсин(t_init, иметь тенденцию + dt, dt)30 ys = нп.нули(N + 1)31 32 ys[0] = y_init33 34 за _ в классифицировать(num_sims):35 за я в классифицировать(1, ts.размер):36 т = (я - 1) * dt37 у = ys[я - 1]38 ys[я] = у + му(у, т) * dt + сигма(у, т) * dW(dt)39 plt.участок(ts, ys)40 41 plt.xlabel("время (а)")42 час = plt.ярлык("у")43 час.set_rotation(0)44 plt.Показать()
Ниже приведен простой перевод приведенного выше кода в MATLAB (R2019b) язык программирования:
1 %% Инициализация и утилита 2 Закрыть все; 3 Чисто все; 4 5 numSims = 5; % отобразить пять прогонов 6 tBounds = [3 7]; % Границы t 7 N = 1000; % Вычислить 1000 точек сетки 8 dt = (tBounds (2) - tBounds (1)) / N ; 9 y_init = 1; % Начальное условие y 10 11 12 pd = македист('Нормальный',0,sqrt(dt)); % Инициализировать распределение вероятностей для нашего 13 % случайной величины со средним 0 и 14 % stdev из sqrt (dt)15 16 c = [0.7, 1.5, 0.06]; % начальные тета, му и сигма соответственно17 18 ts = linspace (tBounds (1), tBounds (2), N); % От t0 до t1 с N точками19 ys = нули (1, N); % 1xN Матрица нулей20 21 ys(1) = y_init;22 %% Расчет процесса23 за j = 1:numSims24 за я = 2: число (ts)25 т = (я-1) .* dt;26 у = ys(я-1);27 му = c (1). * (c (2) - y);28 сигма = c (3);29 dW = случайный (pd);30 31 ys(я) = у + му .* dt + сигма .* dW;32 конец33 фигура()34 держать на;35 участок(ts, ys, 'о')36 конец
Смотрите также
Рекомендации
- ^ Kloeden, P.E. И Платен, Э. (1992). Численное решение стохастических дифференциальных уравнений.. Спрингер, Берлин. ISBN 3-540-54062-8.