Metoda Eulera-Maruyamy: Różnice pomiędzy wersjami

Z Wikipedii, wolnej encyklopedii
Usunięta treść Dodana treść
start
(Brak różnic)

Wersja z 19:08, 15 sty 2018

Metoda Eulera-Maruyamy – w analizie stochastycznej, metoda numerycznego (przybliżonego) rozwiązywania stochastycznych równań różniczkowych, będąca rozwinięciem klasycznej metody Eulera z teorii równwań różniczkowych zwyczajnych. Jest jedną z niewielu metod, które dają się rozszerzyć z teorii deterministycznej do stochastycznej teorii równań różniczkowych[1].

Metoda

Niech dane będzie stochastyczne równanie różniczkowe postaci

z warunkiem początkowym X0 = x0, gdzie Wt oznacza proces Wienera. Poszukiwane jest rozwiązanie tego równania na przedziale [0, T]. Przybliżeniem Eulera–Maruyamy (prawdziwego) rozwiązania X rzeczonego równania jest łańcuch Markowa Y zdefiniowany jak następuje:

  • przedział zapisywany jest w postaci N przedziałów o długości :
,
przy czym
  • Y0 = x0;
  • Zmienna Yn jest dla 1 ≤ n ≤ N zdefiniowana rekursywnie wzorem
gdzie

Z niezależności przyrostów procesu Wienera wynika, że zmienne losowe ΔWnniezależne oraz mają rozkład normalny o wartości oczekiwanej zero oraz wariancji .

Symulacja komputerowa przybliżeń

Niech dane będzie stochastyczne równanie rózniczkowe

którego rozwiązaniem jest proces Ornsteina-Uhlenbecka

Można posłużyć się pakietem numpy środowiska Python by symulować

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

num_sims = 5 ### liczba symulacji

t_init = 3
t_end  = 7
N      = 1000 ### liczba punktów na które dzielimy przedział
dt     = float(t_end - t_init) / N 
y_init = 0

c_theta = 0.7
c_mu    = 1.5
c_sigma = 0.06

def mu(y, t): 
    """Implement the Ornstein–Uhlenbeck mu.""" ## = \theta (\mu-Y_t)
    return c_theta * (c_mu - y)

def sigma(y, t): 
    """Implement the Ornstein–Uhlenbeck sigma.""" ## = \sigma
    return c_sigma
    
def dW(delta_t): 
    """Sample a random number at each call."""
    return np.random.normal(loc = 0.0, scale = np.sqrt(delta_t))

ts    = np.arange(t_init, t_end, dt)
ys    = np.zeros(N)

ys[0] = y_init

for _ in range(num_sims):
    for i in range(1, ts.size):
        t = (i-1) * dt
        y = ys[i-1]
        ys[i] = y + mu(y, t) * dt + sigma(y, t) * dW(dt)
    plt.plot(ts, ys)

plt.show()
  1. P.E. Kloeden,, E. Platen: Numerical Solution of Stochastic Differential Equations. Berlin: Springer, 1992. ISBN 3-540-54062-8.

Bibliografia