# Milşteyn yöntemi
Matematiğin bir alt dalı olan stokastik analizde Milşteyn yöntemi (ya da Milstein yöntemi) stokastik diferansiyel denklemlere yaklaşık sayısal çözümler üretmek için geliştirilmiş yöntemlerden biridir. Yöntem adını, bu yaklaşıklığı 1974'te yayınlayan Grigori Milşteyn'den (Мильштейн, Г. Н.) 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. Stokastik diferansiyel denklemin teorik çözümü X ile gösterilsin. X'in Milstein 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) Δt + b(Y_n) ΔW_n + 1/2 b(Y_n) b'(Y_n) ( (ΔW_n)^2 - Δt )
olarak tanımlansın. Burada, b' ile türev, yani, b(x) fonksiyonunun x'e göre türevi, kastedilmiştir. 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.


## Yöntemin arkasındaki fikir.
Yöntemin arkasındaki esas fikir b(X_t) terimine Ito formülünü uygulayıp daha Euler yaklaşımlığını iyileştirmektir. Elbette, burada, bu terimdeki b fonksiyonun Ito formülünün koşullarına uyması beklenmektedir. 
Ito formülü ile 
 d b(X_t) 
 amp;= b'(X_t)dX_t + 1/2 b”(X_t) b^2(X_t)dt
 amp;=[b'(X_t)a(X_t) + 1/2 b”(X_t) b^2(X_t)]dt+ b'(X_t) b(X_t)dW_t
 amp;=μ_b(X_t) dt + σ_b(X_t) dW_t
elde edilir.
t≤u≤t+Δt şartını sağlayan bir u sayısı için, Euler-Maruyama yöntemi kullanılarak, yukarıda elde edilen d b(X_t) ifadesine yaklaşım sağlanır. Diğer deyişle,
 b(X_u) amp;≈ b(X_t) μ_b(X_t) [u-t] + σ_b(X_t) [W_u-W_t]
 amp;= b(X_t)[b'(X_t)a(X_t) + 1/2 b”(X_t) b^2(X_t)][u-t] + b'(X_t) b(X_t) [W_u-W_t]
yazılabilir. W_u-W_t terimi olasılıkta O(√(u-t)) olduğundan ve bu yaklaşıklıktaki sürüklenme O(u-t) olduğundan, O(u-t) büyümesine sahip terimler düşürülüp
 b(X_u) amp;≈ b(X_t) + b'(X_t) b(X_t) [W_u-W_t], u∈[t, t+Δ t]
yazılır. Bu yüzden, 
 ∫_t^t+Δ tb(X_u)dW_u amp;≈∫_t^t+Δ t b(X_t) + b'(X_t) b(X_t) [W_u-W_t] dW(u)
 amp;=b(X_t)[W_t+Δ t-W_t]+ b'(X_t) b(X_t) ∫_t^t+Δ t [W_u-W_t] dW(u)
 amp;=b(X_t)[W_t+Δ t-W_t]+ 1/2 b'(X_t) b(X_t) [(W_t+Δ t-W_t)^2-Δ t].
elde edilir. O zaman, Euler yaklaşımlığını biraz daha düzelterek
 X_t + Δ t≈ X_t + a(X_t)Δ t + b(X_t)[W_t + Δ t-W_t]+ 1/2 b'(X_t) b(X_t) [(W_t+Δ t-W_t)^2-Δ t]
yazılır.


### Programlama uygulaması.
dY_t= μY dt + σY dW_t 
Y_0=Y_ilk
biçiminde verilmiş olan bir geometrik Brown hareketini sayısal olarak çözmek için Milşteyn yöntemi kullanılabilir.
Rastgele sayıların NumPy tarafından verildiği bir Python programlama kodu aşağıdaki gibi verilebilir:
  - - - coding: utf-8 - -
import numpy as np
import matplotlib.pyplot as plt
from textwrap import wrap
class Model:
 """Stokastik modelin sabitleri."""
 MU = 0.05
 SIGMA = 0.2
def dW(dt):
 """Normal rastgele değişken çekilişi"""
 return np.random.normal(loc=0.0, scale=np.sqrt(dt))
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 = 1
 yler = np.zeros(Tler.size)
 yler[0] = Y_ILK
 for i in range(1, Tler.size):
 t = (i - 1) * DT
 y = yler[i - 1]
 dw = dW(DT)
 #Milstein yontemindeki gibi terimleri topla
 yler[i] = y + \
 Model.MU * y * DT + \
 Model.SIGMA * y * dw + \
 (Model.SIGMA**2 / 2) * y * (dw**2 - DT)
 return Tler, yler
 - Birkaç simülasyonun aynı grafikte çizimi
sim_sayisi=100
  - [0, 1] aralığında 5000 zaman adımında hesaplıyoruz
t_i=0#
t_s=1
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"$\mu=$ {} ve $\sigma=$ {} parametreleri verilen bir geometrik Brown hareketinin [{},{}] aralığında {} zaman adımlı Milşteyn yöntemiyle yapılan yaklaşıklamalarının {} yolaklı simülasyonu".format(Model.MU, Model.SIGMA, t_i, t_s, adim_sayisi, sim_sayisi))), fontsize='small')
plt.savefig('Milstein.png', format="png")
plt.show()