这看起来更像是部分积分公式,或者相当于乘积规则
(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.
对于 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)、f=sin(t)和fp(t)=cos(t)的导数,cumsum(f.*db)的元素n是并变换为:
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。最后一行包含f.*b-cumsum(fp.*b)*dt 的nth 元素,最后一行是离散化的误差项,大小为dt 和(t(n)-t(1))*dt。