طريقة أويلر-ماروياما
في حساب التفاضل والتكامل، تعد طريقة أويلر-ماروياما (وتسمى أيضًا طريقة أويلر) طريقة للتحليل العددي التقريبي لمعادلة تفاضلية عشوائية (SDE). إنه تعميم بسيط لطريقة أويلر للمعادلات التفاضلية العادية إلى المعادلات التفاضلية العشوائية. سميت بعد ليونارد أويلر وجيزيرو ماروياما . لسوء الحظ، لا يمكن إجراء نفس التعميم لأي طريقة حتمية اعتباطية.[1]
خذ المعادلة التفاضلية العشوائية (انظر حساب التفاضل والتكامل )
مع الحالة الأولية 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)
المراجع
- ^ Kloeden, P.E.؛ Platen, E. (1992). Numerical Solution of Stochastic Differential Equations. Springer, Berlin. ISBN:3-540-54062-8.
{{استشهاد بكتاب}}
: الوسيط غير المعروف|last-author-amp=
تم تجاهله يقترح استخدام|name-list-style=
(مساعدة)