随机积分的逼近解

时间:2015-03-26 04:33:00

标签: matlab probability differential-equations stochastic

我试图将解决方案近似为:

此等式两边的

我的左侧代码是:

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 个答案:

答案 0 :(得分:0)

这看起来更像是部分整合公式,或等同于产品规则

(f*b)'=f'*b+f*b' or
d(f*b)=df*b+f*db = f'*b*dt+f*db

的微分,比任何随机微分方程。从那个意义上来说,没有什么可以解决的,除非你想在数字上验证规则的有效性,b是维纳过程。

或者您想测试数值方法的错误。但接下来的第一步是确定数值方法,这似乎是欧拉或欧拉 - 丸山方法。

请参阅wikipedia: Euler-Maruyama methodwikipedia: Milstein method和非常易读的P. Forsyth: An introduction to Computational Finance without Agonizing Pain.


对于维纳进程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的堂兄scilab中,以下脚本给出了完全重叠的结果:

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的{​​{1}}元素,以及离散化误差项的最后一行,幅度为f.*b-cumsum(fp.*b)*dtdt