我试图将解决方案近似为:
此等式两边的和。
我的左侧代码是:
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);
但我根本无法找到正确的方面,这要困难得多。有人可以帮忙吗?
答案 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 method,wikipedia: 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)*dt
和dt
。