Main Content

中立型初期値 DDE

この例では、ddensd を使用して、時間依存の遅延を伴う初期値 DDE (遅延微分方程式) 系を解く方法を説明します。この例は、元々 Jackiewicz [1] により提示されました。

この方程式は次のとおりです。

y(t)=2cos(2t)y(t2)2cos(t)+log(y(t2))-log(2cos(t))-sin(t).

この方程式は、t0 における時間遅延が 0 のため、"初期値" DDE になります。したがって、解の履歴は解の計算には必要ありません。必要なのは次の初期値のみです。

y(0)=1,

y(0)=s.

s2+log(s)-log(2)=0 の解です。この方程式を満たす s の値は s1=2s2=0.4063757399599599 です。

方程式の時間遅延は y の項に存在しているため、この方程式は "中立型 DDE" と呼ばれます。

MATLAB® でこの方程式を解くには、遅延微分方程式ソルバー ddensd (中立型方程式のソルバー) を呼び出す前に、方程式と遅延をコード化する必要があります。(ここで行ったように) 必要な関数をファイルの最後にローカル関数として含めることも、あるいは個別のファイルとして MATLAB パスのディレクトリに保存することもできます。

遅延のコード化

最初に、方程式の遅延を定義する無名関数を作成します。yy のどちらにも形式 t2 の遅延があるため、必要な関数定義は 1 つのみです。この遅延関数は後でソルバーに 2 回渡されます。1 回は y の遅延を示すため、もう 1 回は y の遅延を示すためです。

delay = @(t,y) t/2; 

方程式のコード化

ここで、方程式をコード化する関数を作成します。この関数にはシグネチャ yp = ddefun(t,y,ydel,ypdel) がなければなりません。ここでは以下のようになります。

  • t は時間 (独立変数) です。

  • y は解 (従属変数) です。

  • ydel には y の遅延が含まれます。

  • ypdel には y=dydt の遅延が含まれます。

これらの入力はソルバーによって自動的に関数に渡されますが、変数名によって方程式のコード化方法が決まります。この場合、

  • ydely(t2)

  • ypdel y(t2)

function yp = ddefun(t,y,ydel,ypdel) 
   yp = 2*cos(2*t)*ydel^(2*cos(t)) + log(ypdel) - log(2*cos(t)) - sin(t);
end

メモ: 関数はすべて例の最後にローカル関数として含まれます。

方程式の求解

最後に、積分区間 [t0 tf] と初期値を定義してから、ddensd ソルバーを使用して DDE を解きます。4 番目の入力引数の cell 配列内に指定することで、初期値をソルバーに渡します。

tspan = [0 0.1];
y0 = 1;
s1 = 2;
sol1 = ddensd(@ddefun, delay, delay, {y0,s1}, tspan);

方程式を再度解きます。今回は初期条件に対して s の代替値を使用します。

s2 = 0.4063757399599599;
sol2 = ddensd(@ddefun, delay, delay, {y0,s2}, tspan);

解のプロット

解の構造体 sol1 および sol2 には x フィールドと y フィールドがあり、ソルバーが受け入れる内部タイム ステップと、その時の対応する解が含まれます。ただし、deval を使用して特定の点における解を計算することができます。

結果を比較するために 2 つの解をプロットします。

plot(sol1.x,sol1.y,sol2.x,sol2.y);
legend('y''(0) = 2','y''(0) = .40637..','Location','NorthWest');
xlabel('Time t');
ylabel('Solution y');
title('Two Solutions of Jackiewicz''s Initial-Value NDDE');

ローカル関数

ここでは、DDE ソルバー ddensd が解を計算するために呼び出すローカル補助関数を紹介しています。あるいは、これらの関数を独自のファイルとして MATLAB パスのディレクトリに保存することもできます。

function yp = ddefun(t,y,ydel,ypdel) 
   yp = 2*cos(2*t)*ydel^(2*cos(t)) + log(ypdel) - log(2*cos(t)) - sin(t);
end

参照

[1] Jackiewicz, Z."One step Methods of any Order for Neutral Functional Differential Equations."SIAM Journal on Numerical Analysis.Vol. 21, Number 3. 1984. pp. 486–511.

参考

| | |

関連するトピック