stringtranslate.com

Метод Мильштейна

В математике метод Мильштейна — это метод приближенного численного решения стохастического дифференциального уравнения . Он назван в честь Григория Н. Мильштейна, который впервые опубликовал его в 1974 году. [1] [2]

Описание

Рассмотрим автономное стохастическое дифференциальное уравнение Ито : с начальным условием , где обозначает процесс Винера , и предположим, что мы хотим решить это СДУ на некотором интервале времени  . Тогда приближение Мильштейна к истинному решению представляет собой цепь Маркова, определяемую следующим образом:

Обратите внимание, что когда (т.е. диффузионный член не зависит от ), этот метод эквивалентен методу Эйлера–Маруямы .

Схема Мильштейна имеет как слабый, так и сильный порядок сходимости , что превосходит метод Эйлера–Маруямы , который в свою очередь имеет тот же слабый порядок сходимости , но худший сильный порядок сходимости . [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 Т_КОНЕЦ  =  1 N  =  1000  # Вычислить 1000 точек сетки DT  =  float ( T_END  -  T_INIT )  /  N TS  =  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  =  2 plot_simulations ( NUM_SIMS )

Смотрите также

Ссылки

  1. ^ Мильштейн, Г.Н. (1974). «Приближенное интегрирование стохастических дифференциальных уравнений». Теория вероятностей и ее применения . 19 (3): 583–588.
  2. ^ Мильштейн, ГН (1975). «Приближенное интегрирование стохастических дифференциальных уравнений». Теория вероятностей и ее приложения . 19 (3): 557–000. doi :10.1137/1119062.
  3. ^ В. Мацкявичюс, Введение в стохастический анализ , Wiley 2011
  4. ^ Умберто Пиккини, SDE Toolbox: моделирование и оценка стохастических дифференциальных уравнений с помощью Matlab. http://sdetoolbox.sourceforge.net/

Дальнейшее чтение