3

初めて確率微分方程式に取り組んでいます。二次元の確率微分方程式をシミュレートして解こうとしています。

モデルは次のとおりです。

dp=F(t,p)dt+G(t,p)dW(t)

どこ:

  • p は 2 行 1 列のベクトルです: p=(theta(t); phi(t))
  • F は列ベクトルです: F=(sin(theta)+Psi* cos(phi); Psi* cot(theta)*sin(phi))
  • G は 2 行 2 列の行列です: G=(D 0;0 D/sin(theta))
  • Psi はパラメータで、D は拡散定数です。

次のようにコードを書きました。

function MDL=gyro_2dim(Psi,D)
% want to solve for 2-by-1 vector:
%p=[theta;phi];
%drift function
F=@(t,theta,phi)  [sinth(theta)+Psi.*cos(phi)-D.*cot(theta);Psi.*cot(theta).*sin(phi)];
%diffusion function
G=@(t,theta,phi) [D 0;0 D./sin(theta)];
MDL=sde(F,G)
end

次に、次のスクリプトで関数を呼び出します。

params.t0   = 0;               % start time of simulation
params.tend = 20;              % end time
params.dt =0.1;                % time increment
D=0.1;
nPeriods=10; % # of simulated observations
Psi=1;
MDL=gyro_2dim(Psi,D);
[S,T,Z]=simulate(MDL, nPeriods,'DeltaTime',params.dt);
plot(T,S)

コードを実行すると、次のエラー メッセージが表示されます。

初期条件または一貫性のないモデル次元でドリフト率が無効です。

このエラーを修正する方法はありますか?

4

1 に答える 1

3

のドキュメントからsde

で示されるユーザー定義のドリフト率関数F。は、次の2 つの入力を指定して呼び出されたときに 1 行 1 列のドリフト率ベクトルDriftRateを返す関数です。 - 実数値のスカラー観測時間。 - 1 行 1 列の状態ベクトル。NVARS
t
NVARSXt

関数についても同様の仕様が用意されていDiffusionます。ただし、状態ベクトルの要素をスカラーとして渡しているため、2 つではなく 3 つの入力があります。モデル作成関数を次のように変更してみてください。

function MDL=gyro_2dim(Psi,D)
% State vector: p = [theta;phi];
F = @(t,p)[sin(p(1))+Psi.*cos(p(2))-D.*cot(p(1));
           Psi.*cot(p(1)).*sin(p(2))];            % Drift
G = @(t,p)[D 0;
           0 D./sin(p(1))];                       % Diffusion
MDL = sde(F,G);
MDL.StartTime = 0;   % Set initial time
MDL.StartState = ... % Set initial conditions

私も機能がないので変えsinth(theta)ました。私は金融ツールボックスを持っていないので、これをテストすることはできません (ほとんどありません)。sin(p(1))sinth

于 2016-02-08T17:26:58.397 に答える