Аппроксимирующее решение стохастического интеграла
Я пытаюсь приблизить решение к:
где а также для обеих сторон этого уравнения.
Мой код для левой стороны:
N = 2000; Tend = 2*pi; dt = Tend/N; t = 0:dt:Tend;
f = sin(t)*sqrt(dt);
f = [0 ff(1:end-1)];
[fL,junk] = meshgrid(f,1);
dW = cumsum([0 randn(1,N)].*fL,2);
но я не могу понять правую сторону, что намного сложнее. Кто-нибудь может помочь?
1 ответ
Это больше похоже на формулу частичной интеграции или эквивалент продукта правилу
(f*b)'=f'*b+f*b' or
d(f*b)=df*b+f*db = f'*b*dt+f*db
дифференцирования, чем любое стохастическое дифференциальное уравнение. В этом смысле там нечего решать, кроме случаев, когда вы хотите численно проверить действительность правила с помощью b
Быть винерским процессом.
Или вы хотите проверить ошибку численных методов. Но тогда первым шагом должно стать определение численного метода, который представляется методом Эйлера или Эйлера-Маруямы.
См. Википедию: метод Эйлера-Маруямы, википедию: метод Мильштейна и очень удобочитаемый П. Форсайт: введение в вычислительные финансы без мучительной боли.
Для процесса Винера b
вам нужно будет сохранить массив приращений db=randn(1,N)*sqrt(dt)
(и держать корень вне f=sin(t)
). Тогда левая часть является суммой f.*db
и для правой стороны вам понадобится массив частичных сумм по db
который в теории должен быть вычислен как
b(i+1)=b(i)+db(i)
Использование более целесообразной функции Matlab
b = cumsum(db)
даст вам сдвинутую версию, где b(i)=b(i-1)+db(i)
, В общей сложности картина, это смещение может привести к ошибке величины sqrt(dt)
что было бы важно, только если вы хотите ограничить ошибку величиной dt
,
После этой операции условия справа f(N)*b(N)-f(0)*b(0)
и сумма более cos(t(i))*b(t(i))*dt(i)
, i=0,...,N-1
,
Таким образом вы сравниваете слева
cumsum(sin(t).*db)
и справа
sin(t).*b - cumsum(cos(t).*b).*dt
и это должно дать почти идентичные значения.
В двоюродном брате matlab следующий скрипт дает совершенно совпадающие результаты:
N=6000; dt=2*%pi/N;
t=0:1:N; t=t*dt;
dW=rand(t,"normal")*sqrt(dt);
W = cumsum(dW);
f=sin(t); fp=cos(t);
ex1=cumsum(f.*dW);
ex2=f.*W;
ex3=cumsum(fp.*W).*dt;
clf;
subplot(211);
plot(t+5*dt,ex1,t,ex2-ex3)
subplot(212);
plot(t,ex2-ex1-ex3)
Идентичность можно увидеть также непосредственно в дискретизации путем применения сдвигов индекса. настройка b=cumsum(db)
, f=sin(t)
а также fp(t)=cos(t)
производная, элемент n
из cumsum(f.*db)
является и преобразуется как:
sum(i=1..n) f(i)*db(i) = sum(i=1..n) f(i)*(b(i)-b(i-1))
= -f(1)*b(0)+sum(i=1..n) (f(i)-f(i+1))*b(i) + f(n+1)*b(n)
= f(n)*b(n) - sum(i=1..n) fp(i)*b(i)*dt
+ (f(n+1)-f(n))*b(n) - sum(i=1..n) (f(i+1)-f(i)-fp(i)*dt)*b(i)
с виртуальным значением b(0)=0
, Следующая за последней строкой содержит n
й элемент f.*b-cumsum(fp.*b)*dt
и последняя строка ошибки условия дискретизации, с величинами dt
а также (t(n)-t(1))*dt
,