我试图将解决方案近似为:
等式两边的位置和位置。
我的左侧代码是:
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);
但我根本无法弄清楚右侧,这要困难得多。任何人都可以帮忙吗?
我试图将解决方案近似为:
等式两边的位置和位置。
我的左侧代码是:
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);
但我根本无法弄清楚右侧,这要困难得多。任何人都可以帮忙吗?
这看起来更像是部分积分公式,或者等效于乘积规则
(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)
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
第 th 个元素,f.*b-cumsum(fp.*b)*dt
最后一行是离散化的误差项,幅度为dt
和(t(n)-t(1))*dt
。