# Euler-Maruyama yöntemi
Matematiğin bir alt dalı olan stokastik analizde Euler-Maruyama yöntemi stokastik diferansiyel denklemlere yaklaşık sayısal çözümler üretmek için geliştirilmiş yöntemlerden biridir. Adi diferansiyel denklemler için geliştirilmiş olan Euler yönteminin stokastik diferansiyel denklemlere uyarlanmasıyla oluşmuştur. Yöntem adını, Leonhard Euler ve Gishiro Maruyama'dan almaktadır.


## Yöntemin açıklaması.
"W""t", Wiener süreci olsun. Başlangıç koşulu "X"0 = "x"0 olan ve 
d X_t = a(X_t, t) d t + b(X_t, t) d W_t,
hâlindeki stokastik bir diferansiyel denklemi [0, "T"] aralığında sayısal olarak çözmek istediğimizi varsayalım. Stokasitk diferansiyel denklemin teorik çözümü X ile gösterilsin. X'in Euler-Maruyama yaklaşıklığı aşağıdaki gibi kurulup tanımlanan ve bir Markov zinciri olan Ydir.
  - [0, "T"] aralığını "N" tane eşit altaralığa bölelim. Her altaralığın uzunluğu Δt gt 0 ile gösterilsin. O zaman,
0 = τ_0 lt; τ_1 lt; ⋯ lt; τ_N = T ve Δt = T/N
olacaktır.
  - "Y"0 = "x"0 tanımlansın.
  - 0 ≤ "n" ≤ "N-1" için ΔW_n = W_τ_n + 1 - W_τ_n olmak üzere, "Y""n" terimleri yinelemeli olarak 
 Y_n + 1 = Y_n + a(Y_n, τ_n) Δt + b(Y_n, τ_n) ΔW_n
olarak tanımlansın. Bahsi geçen Δ"W""n" rasgele değişkenleri bağımsız ve özdeş dağılmış normal rastgele değişkenlerdir. Her birinin beklenen değeri sıfırdır ve her biri Δ"t" varyansına sahiptir.


## Yakınsaklık.
Stokastik diferansiyel denklemlerin yaklaşık çözümlerine bakılırken doğruluğu ölçmenin iki yaygın yöntemi vardır. Bunlar zayıf yakınsaklık ve güçlü yakınsaklık kavramlarıdır. Zayıf yakınsaklıkta ortalamaların hatasına bakılırken, güçlü yakınsaklıkta ise hataların ortalamalarına bakılır.
Euler-Maruyama yaklaşıklık yönteminde, eğer a(X_t, t) ve b(X_t, t) fonksiyonları Lipschitz ise, yani, L bir sabit olmak üzere her t∈[0,T] ve tüm x, y∈^n için
sağlanıyorsa, o zaman
  - zayıf yakınsaklık mertebesi 1 olur:
sup_0≤τ_n≤T(𝔼[X_τ_n]-𝔼[Y_τ_n])= O(Δt)
  - güçlü yakınsaklık mertebesi ise 1/2 olur:
𝔼[sup_0≤τ_n≤T|X_τ_n-Y_τ_n|]= O(Δt^1/2).


## Örnekler.
### Simülasyon örneği.
Kısmi diferansiyel denklemlerden önemli ölçüde faydalanan alanlardan biri matematiksel biyolojidir. Birçok biyolojik süreç hem stokastik hem de doğası gereği sürekli olduğundan, kısmi diferansiyel denklemleri çözmenin sayısal yöntemleri bu alanda oldukça değerlidir.
Grafik, Euler-Maruyama yöntemi kullanılarak çözülen stokastik bir diferansiyel denklemi göstermektedir. Deterministik karşılığı mavi renk ile, sayısal yaklaşım ise yeşil renk ile gösterilmiştir.


### Programlama uygulaması.
 dY_t=θ·(μ-Y_t) dt + σ dW_t
 Y_0=Y_ilk
biçiminde verilmiş olan bir Ornstein-Uhlenbeck sürecini sayısal olarak çözmek için Euler-Maruyama yöntemi kullanılabilir.
Rastgele sayıların NumPy tarafından verildiği bir Python programlama kodu aşağıdaki gibi verilebilir:
import numpy as np
import matplotlib.pyplot as plt
from textwrap import wrap
class Model:
 """Stokastik modelin sabitleri."""
 THETA = 0.5
 MU = 1.5
 SIGMA = 0.1
def mu(y: float, _t: float) -> float:
 """Ornstein–Uhlenbeck sürecinin sürüklenme sabiti"""
 return Model.THETA * (Model.MU - y)
def sigma(_y: float, _t: float) -> float:
 """Ornstein–Uhlenbeck sürecinin difüzyon sabiti"""
 return Model.SIGMA
def dW(delta_t: float) -> float:
 """Normal rastgele değişken çekilişi"""
 return np.random.normal(loc=0.0, scale=np.sqrt(delta_t))
def simulasyon(t_i:int, t_s:int, adim_sayisi:int):
 """bir simülasyon yolağı"""
 T_ILK = t_i
 T_SON = t_s
 N = adim_sayisi 
 DT = float(T_SON - T_ILK) / N
 Tler = np.arange(T_ILK, T_SON + DT, DT)
 assert Tler.size == N + 1
 Y_ILK = 0
 yler = np.zeros(Tler.size)
 yler[0] = Y_ILK
 for i in range(1, Tler.size):
 t = T_ILK + (i - 1) * DT
 y = yler[i - 1]
 yler[i] = y + mu(y, t) * DT + sigma(y, t) * dW(DT)
 return Tler, yler
 - Birkaç simülasyonun aynı grafikte çizimi
sim_sayisi=5
 # [2, 20] aralığında 5000 zaman adımında hesaplıyoruz
t_i=2#
t_s=20
adim_sayisi=5000
for _ in range(sim_sayisi):
 plt.plot(*simulasyon(t_i, t_s, adim_sayisi))
plt.xlabel("zaman (s)")
plt.ylabel("y")
plt.title("\n".join(wrap(
r"$\theta=$ {}, $\mu=$ {} ve $\sigma=$ {} parametreleri verilen bir Ornstein–Uhlenbeck sürecine [{},{}] aralığında {} zaman adımlı Euler-Maruyama yöntemiyle yapılan yaklaşıklamalarının {} yolaklı simülasyonu".format(Model.THETA, Model.MU, Model.SIGMA, t_i, t_s, adim_sayisi, SIM_SAYISI))), fontsize='small')
plt.savefig('EulerMaruyama.png', format="png")
plt.show()