Рассмотрим автономное стохастическое дифференциальное уравнение Ито :
с начальным условием , где обозначает процесс Винера , и предположим, что мы хотим решить это СДУ на некотором интервале времени . Тогда приближение Мильштейна к истинному решению представляет собой цепь Маркова, определяемую следующим образом:
Разобьем интервал на равные подынтервалы шириной :
Обратите внимание, что когда (т.е. диффузионный член не зависит от ), этот метод эквивалентен методу Эйлера–Маруямы .
Схема Мильштейна имеет как слабый, так и сильный порядок сходимости , что превосходит метод Эйлера–Маруямы , который в свою очередь имеет тот же слабый порядок сходимости , но худший сильный порядок сходимости . [3]
Интуитивный вывод
Для этого вывода мы рассмотрим только геометрическое броуновское движение (ГБД), стохастическое дифференциальное уравнение которого имеет вид:
с действительными константами и . Используя лемму Ито, получаем:
Таким образом, решение GBM SDE имеет вид:
где
Численное решение представлено на графике для трех различных траекторий. [4]
Компьютерная реализация
Следующий код Python реализует метод Мильштейна и использует его для решения СДУ, описывающего геометрическое броуновское движение, определяемое формулой
# -*- кодировка: utf-8 -*-# Метод Мильштейнаимпортировать numpy как npимпортировать matplotlib.pyplot как pltМодель класса :"""Константы стохастической модели."""мю = 3сигма = 1def dW ( dt ):"""Случайная выборка нормального распределения."""вернуть np.random.normal ( loc = 0.0 , scale = np.sqrt ( dt ) )определение run_simulation ():""" Верните результат одной полной симуляции."""# Одна секунда и тысяча точек сеткиТ_ИНИТ = 0Т_КОНЕЦ = 1N = 1000 # Вычислить 1000 точек сеткиDT = float ( T_END - T_INIT ) / NTS = np.arange ( T_INIT , T_END + DT , DT )Y_INIT = 1# Векторы для заполненияys = np . нули ( N + 1 )ys [ 0 ] = Y_INITдля i в диапазоне ( 1 , TS . size ):т = ( я - 1 ) * ДТу = ys [ i - 1 ]dw = dW ( DT )# Суммируем члены, как в методе Мильштейнаys [ я ] = у + \ Модель . мю * у * DT + \ Модель . сигма * у * dw + \ ( Модель . сигма ** 2 / 2 ) * y * ( dw ** 2 - DT )возврат TS , ггdef plot_simulations ( num_sims : int ):"""Постройте несколько симуляций на одном изображении."""для _ в диапазоне ( num_sims ):plt . plot ( * run_simulation ())plt . xlabel ( "время (с)" )plt.ylabel ( " y " )plt.сетка ( )plt . показать ()если __name__ == "__main__" :NUM_SIMS = 2plot_simulations ( NUM_SIMS )
^ Мильштейн, Г.Н. (1974). «Приближенное интегрирование стохастических дифференциальных уравнений». Теория вероятностей и ее применения . 19 (3): 583–588.
^ Мильштейн, ГН (1975). «Приближенное интегрирование стохастических дифференциальных уравнений». Теория вероятностей и ее приложения . 19 (3): 557–000. doi :10.1137/1119062.
^ В. Мацкявичюс, Введение в стохастический анализ , Wiley 2011
^ Умберто Пиккини, SDE Toolbox: моделирование и оценка стохастических дифференциальных уравнений с помощью Matlab. http://sdetoolbox.sourceforge.net/
Дальнейшее чтение
Клоден, П.Е. и Платен, Э. (1999). Численное решение стохастических дифференциальных уравнений . Springer, Берлин. ISBN 3-540-54062-8.{{cite book}}: CS1 maint: multiple names: authors list (link)