これは部分積分の式に似ているか、積則に相当します。
(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)
すると、 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
最後の行から 2 番目の行には の番目の要素が含まれ、f.*b-cumsum(fp.*b)*dt
最後の行には離散化の誤差項が含まれ、大きさはdt
および(t(n)-t(1))*dt
です。