1

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

等式两边的位置和位置。

我的左侧代码是:

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);

但我根本无法弄清楚右侧,这要困难得多。任何人都可以帮忙吗?

4

1 回答 1

0

这看起来更像是部分积分公式,或者等效于乘积规则

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

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

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

请参阅维基百科:Euler-Maruyama 方法维基百科:Milstein 方法和非常易读的P. Forsyth:无痛苦的计算金融简介。


对于 Wiener 过程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)和导数,is 的元素和f=sin(t)变换 为:fp(t)=cos(t)ncumsum(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第 th 个元素,f.*b-cumsum(fp.*b)*dt最后一行是离散化的误差项,幅度为dt(t(n)-t(1))*dt

于 2015-03-26T07:42:00.073 回答