طريقة أويلر-ماروياما

في حساب التفاضل والتكامل، تعد طريقة أويلر-ماروياما (وتسمى أيضًا طريقة أويلر) طريقة للتحليل العددي التقريبي لمعادلة تفاضلية عشوائية (SDE). إنه تعميم بسيط لطريقة أويلر للمعادلات التفاضلية العادية إلى المعادلات التفاضلية العشوائية. سميت بعد ليونارد أويلر وجيزيرو ماروياما . لسوء الحظ، لا يمكن إجراء نفس التعميم لأي طريقة حتمية اعتباطية.

خذ المعادلة التفاضلية العشوائية (انظر حساب التفاضل والتكامل )

 

مع الحالة الأولية X 0   =   x 0 ، حيث تشير W t إلى عملية فينر ، ونفترض أننا نرغب في حل المعادلة التفاضلية العشوائية هذه في فترة زمنية معينة [0 ،   T ]. ثم تقريب أويلر-ماروياما للحل الحقيقي X هو سلسلة ماركوف Y المحددة على النحو التالي:

 تقسيم الفاصل الزمني [0 ،   T ] إلى N فترات زمنية فرعية متساوية للعرض  :

 

 ضع Y 0   =   × 0 ؛
 حدد بشكل متكرر Y n لـ  بواسطة

 

 حيث

 

المتغيرات العشوائية Δ W n مستقلة ومتوزعة بشكل عشوائي مع القيمة المتوقعة صفر والتباين  .

مثال

محاكاة رقمية 

المجال الذي استفاد بشكل كبير من المعادلات التفاضلية العشوائية هو علم الأحياء أو علم الأحياء الرياضي بشكل أكثر دقة. هنا نما عدد المنشورات حول استخدام النموذج العشوائي ، حيث أن معظم النماذج غير خطية ، تتطلب مخططات عددية.

يصور الرسم معادلة تفاضلية عشوائية يتم حلها باستخدام مخطط أويلر. يتم عرض النظير الحتمية كذلك.

تطبيق الكمبيوتر 
يطبق كود بايثون التالي طريقة أويلر-ماروياما ويستخدمها لحل عملية أورنستين-أولينبيك المحددة بواسطة

 

 

الأرقام العشوائية لـ  يتم إنشاؤها باستخدام حزمة الرياضيات نمباي. # -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

num_sims = 5 # Display five runs

t_init = 3
t_end = 7
N = 1000 # Compute 1000 grid points
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() ما يلي هو ببساطة ترجمة الرمز أعلاه إلى لغة برمجة ماتلاب: %% Initialization and Utility
close all;
clear all;

numSims = 5; % display five runs
tBounds = [3 7]; % The bounds of t
N = 1000; % Compute 1000 grid points
dt = (tBounds(2) - tBounds(1)) / N ;
y_init = 1; % Initial y condition

pd = makedist('Normal',0,sqrt(dt)); % Initialize the probability distribution for our
                         % random variable with mean 0 and 
                         % stdev of sqrt(dt)

c = [0.7, 1.5, 0.06]; % the initial Theta, Mu, and Sigma, respectively

ts = linspace(tBounds(1), tBounds(2), N); % From t0-->t1 with N points
ys = zeros(1,N); % 1xN Matrix of zeros

ys(1) = y_init;
%% Computing the Process
for j = 1:numSims
    for i = 2:numel(ts)
        t = (i-1) .* dt;
        y = ys(i-1);
        mu      = c(1) .* (c(2) - y);
        sigma   = c(3);
        dW      = random(pd);
        
        ys(i) = y + mu .* dt + sigma .* dW;
    end
    figure(69)
    hold on;
    plot(ts, ys, 'o')
end

انظر أيضًا 

 طريقة ميلستين
 طريقة Runge – Kutta (SDE)

المراجع 

معادلات تفاضلية تصادفية
ليونهارت أويلر
معادلات تفاضلية عددية