Metoda Eulera-Maruyamy
Metoda Eulera-Maruyamy – metoda numerycznego rozwiązywania stochastycznych równań różniczkowych. Nazwa metody pochodzi od nazwiska japońskiego matematyka Gisiro Maruyamy (1916-1986), który rozszerzył metodę Eulera z 1768, stosowaną do numerycznego rozwiązywania równań różniczkowych zwyczajnych. Metoda ta jest jedną z niewielu metod numerycznych, które pozwalają metody numeryczne stosowane do równań deterministycznych rozszerzyć do równań stochastycznych[1].
Opis metody
Równanie stochastyczne
Niech dane będzie stochastyczne równanie różniczkowe postaci
oraz
- – zadany warunek początkowy (położenie cząstki w chwili początkowej ),
gdzie:
- – proces Wienera,
- – zadane funkcje procesu losowego
Poszukiwane jest rozwiązanie tego równania na przedziale
Analiza równania stochastycznego
O stochastycznym charakterze powyższego równania decyduje różniczka procesu losowego Wienera: gdyby była równa zeru, to proces byłby deterministyczny. Funkcja stojąca przed tą różniczka, pełni zaś rolę wzmacniania lub osłabiania efektu fluktuacji losowych.
Z drugiej strony, funkcja stojąca przed różniczką decyduje, na ile proces deterministyczny dominuje nad procesem losowym – gdyby funkcja ta była zerowa, to proces byłby czysto losowy.
Powyższe własności łatwo sprawdzić, rozwiązując podane dalej przykładowe równanie stochastyczne, zmieniając odpowiednio jego parametry.
Przybliżenie Eulera-Maruyamy
Przybliżeniem Eulera-Maruyamy dokładnego rozwiązania powyższego równania jest łańcuch Markowa taki że:
- zdarzenia losowe łańcucha zachodzą w dyskretnych chwilach czasu
odległych od siebie o wartość skokową
- – zadane zdarzenie początkowe,
- – zdarzenia obliczane wzorem rekurencyjnym:
przy czym:
- – zadane funkcje
Cechą procesu Wienera jest, że różnica zmiennych losowych dla dowolnych chwil czasu takich że , ma rozkład normalny o średniej równej zeru i wariancji równej odległości czasowej rozważanych chwil . Wynika stąd, że zmienna losowa ma rozkład normalny o średniej równej zeru i wariancji
Przykład: Równanie Ornsteina-Uhlenbecka

niebieska: położenie początkowe a = 10, μ = 0
pomarańczowa: położenie początkowe a = 0, μ = 0
zielona: położenie początkowe a = −10, μ = 0
czerwona: położenie początkowe a = 0, μ = −10
E(X) określa trajektorię, po której poruszałby się układ, gdyby czynniki losowe były zerowe (σ = 0).
Równanie stochastyczne
Niech dane będzie stochastyczne równanie różniczkowe jednej zmiennej
o warunku początkowym
gdzie – stałe parametry; różniczka odpowiada za proces losowy Wienera.
Powyższe równanie opisuje tzw. proces Ornsteina-Uhlenbecka.
Zamiana na postać dyskretna
Zgodnie z metodą Eulera-Maruyamy zamienia się to równanie na postać dyskretną
Ponieważ to otrzymuje się równania rekurencyjne
gdzie – zmienne losowe o rozkładzie normalnym i wariancji
Warunek początkowy przyjmie postać:
Analiza zależność ruchu układu od parametrów równania
Zmieniając parametry równania stochastycznego, można otrzymać ruch układu w zależności od różnych warunków otoczenia, z jakim układ oddziałuje. Np.
- przyjmując wartość parametru otrzyma się ruch czysto deterministyczny,
- przyjmując wartość parametru otrzyma się ruch czysto losowy,
- parametr określa położenie, do którego zmierza układ po dłuższym czasie, jeżeli czynniki losowe nie są zbyt duże, tj. dla odpowiednio małej wartości na rysunku pokazano cztery trajektorie układu w takich warunkach; mimo różnych wartości położeń początkowych układu (na rys. oznaczonych literą a), układ zmierza po pewnym czasie do położenia Przykładem jest ruch wahadła poddanego działaniu losowego oddziaływania od otoczenia i jednocześnie tłumionego – niezależnie od położenia początkowego wahadło przyjmie ostatecznie najniższe położenie.
Kod programu
Poniżej podano przykład kodu w języku Python służącego do całkowania równania Ornsteina-Uhlenbecka.
Na ilustracji pokazano wynik symulacji komputerowej dla przyjętych w programie wartości parametrów.

import numpy as np
import matplotlib.pyplot as plt
#Dane:
liczba_symulacji = 5
t_0 = 0 # chwila początkowa
t_1 = 7 # chwila końcowa
N = 200 # liczba punktów podziału przedziału
theta = 0.7
mu = 1.4
sigma = 0.06
# Definicja funkcji generującej liczbę losową z rozkładu normalnego o wariancji Dt
def DW(Dt):
return np.random.normal(loc=0.0,scale=np.sqrt(Dt))
# Część główna programu
Dt = (t_1 - t_0) / N
# Tablica dyskretnych chwil czasu
t = np.arange(t_0, t_1, Dt)
# Inicjalizacja tablicy na kolejne położenia cząstki
Y = np.zeros(N)
for _ in range(liczba_symulacji):
Y[0] = 0
for i in range(0, N-1):
Y[i+1]=Y[i] + theta*(mu -Y[i])*Dt +sigma * DW(Dt)
plt.plot(t, Y) # tworzenie wykresu
plt.grid(True) # Dodanie siatki do wykresu
plt.show()