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その意味では、ウィーナー過程であるというルールの妥当性を数値的に検証したい場合を除いて、そこで解決するものは何もありません。

または、数値法のエラーをテストしたい。しかし、最初のステップは、オイラー法またはオイラー・マルヤマ法のように見える数値法を特定することです。

wikipedia: Euler-Maruyama methodwikipedia: 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)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)=0n最後の行から 2 番目の行には の番目の要素が含まれ、f.*b-cumsum(fp.*b)*dt最後の行には離散化の誤差項が含まれ、大きさはdtおよび(t(n)-t(1))*dtです。

于 2015-03-26T07:42:00.073 に答える