メインコンテンツ

dde23

一定の遅れを含む差分方程式 (DDE) を解く

    説明

    sol = dde23(ddefun,delays,history,tspan) (tspan = [t0 tf]) は、tspan で指定された区間において連立遅延微分方程式 y(t)=f(t,y(t),y(tτ1),...,y(tτk)) を積分します。ここで、τ1τk は、delays で指定された定数の正の遅延です。

    sol = dde23(ddefun,delays,history,tspan,options) は、ddeset 関数で作成された構造体である options で定義された積分設定を使用します。たとえば、AbsTol オプションおよび RelTol オプションを使用して絶対許容誤差と相対許容誤差を指定したり、Jumps オプションを使用して不連続点の位置を指定したりできます。

    すべて折りたたむ

    次の連立遅延微分方程式を求解します。

    y1(t)=-2y1(t-2)+y2(t)y2(t)=y1(t)-2y2(t-1),

    ここで、y1(t) には定数の解の履歴 y1(t)=0.1 が含まれ、y2(t) には定数の解の履歴 y2(t)=0.5 (t0) が含まれます。y1(t) に適用される時間遅延は 2、y2(t) に適用される時間遅延は 1 です。

    連立 DDE を ddefun というローカル関数として定義します。

    function dydt = ddefun(t,y,Z)
    ydelay1 = Z(:,1);
    ydelay2 = Z(:,2);
    dydt = [-2*ydelay1(1) + y(2);
            y(1) - 2*ydelay2(2)];
    end

    積分区間を [0 10] として指定し、時間遅延をベクトル [2; 1] として指定し、解の履歴をベクトル [0.1; 0.5] として指定します。dde23 を使用して DDE を解きます。

    tspan = [0 10];
    delays = [2; 1];
    history = [0.1; 0.5];
    sol = dde23(@ddefun,delays,history,tspan);

    結果をプロットします。

    plot(sol.x,sol.y)

    Figure contains an axes object. The axes object contains 2 objects of type line.

    次の DDE を解きます。

    y(t)=-2y(t-1)(1+y(t)),

    ここで、t0 に対して y(t)=t です。

    DDE を ddefun というローカル関数として定義します。

    function dydt = ddefun(t,y,ydelay)          
    dydt = -2*ydelay*(1+y);
    end

    解の履歴を history というローカル関数として定義します。

    function h = history(t)
    h = t;
    end

    ddeset 関数を使用して積分器のオプション構造体の Events フィールドを指定することにより、積分を終了せずに方程式の零点を特定します。

    function [position,isterminal,direction] = zeroEventsFcn(t,y,ydelay)
    position = y(1);
    isterminal = 0;
    direction = 0;
    end
    
    opts = ddeset(Events=@zeroEventsFcn);

    積分区間を [0 10] として指定し、時間遅延を 1 として指定します。次に、dde23 を使用して DDE を解きます。

    tspan = [0 10];
    delays = 1;
    sol = dde23(@ddefun,delays,@history,tspan,opts);

    結果とゼロクロッシングの位置をプロットします。

    plot(sol.x,sol.y,sol.xe,sol.ye,"o")

    Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

    入力引数

    すべて折りたたむ

    求解する連立遅延微分方程式。関数ハンドルとして指定します。

    スカラー t および列ベクトル y の関数 dydt = ddefun(t,y,Z) は、データ型が single または doubley(t)=f(t,y(t),y(tτ1),...,y(tτk)) に対応する列ベクトル dydt を返さなければなりません。スカラー t は現在の t に対応し、列ベクトル yy(t) を近似し、Z(:,j)τj = delays(j) における y(t-τj) を近似します。

    例: @myFcn

    データ型: function_handle

    時間遅延。正のベクトルとして指定します。delays ベクトルは、定数の正の遅延 τ1τk を表します。

    例: [1 0.2]

    データ型: single | double

    tt0 における解の履歴。次の値のいずれかとして指定します。

    • y = history(t) がスカラー t に対する列ベクトルを返すような関数ハンドル

    • 定数のベクトル y(t)

    • 前の積分の解の構造体 sol (現在の dde23 関数呼び出しが積分を継続する場合)

    例: @ddeHist

    例: [1; 0.4; 0.2]

    データ型: function_handle | single | double | struct

    積分区間。開始時点と終了時点を表す 2 要素ベクトル [t0 tf] として指定します。t0tf の間の特定時点における解を取得するには、deval を使用します。

    例: [1 10]

    データ型: single | double

    積分器のオプション。構造体配列として指定します。options 構造体の作成または変更には、ddeset 関数を使用します。

    例: options = ddeset(RelTol=1e-5,Stats="on") は相対許容誤差 1e-5 を指定し、ソルバー統計の表示を有効にします。

    データ型: struct

    出力引数

    すべて折りたたむ

    評価対象の解。構造体配列として返されます。この構造体を deval 関数と共に使用して、tspan で指定された区間の任意の点で解を評価します。

    sol 構造体は、以下のフィールドを含みます。

    構造体フィールド説明

    sol.x

    dde23 で選択されたメッシュ

    sol.y

    sol.x のメッシュ点における y'(x) の近似

    sol.yp

    sol.x のメッシュ点における y'(x) の近似

    sol.solver

    ソルバー名 'dde23'

    さらに、options 構造体の Events オプションを指定してイベントが検出された場合、sol は以下のフィールドも含みます。

    構造体フィールド説明

    sol.xe

    イベントが発生した点。sol.xe(end) には、終了イベントの厳密な点 (存在する場合) が含まれます。

    sol.ye

    sol.xe のイベント時間に対応する解

    sol.ie

    Events オプションに指定された関数により返されるベクトルのインデックス。値は、どのイベントをソルバーが検出したかを示します。

    アルゴリズム

    関数 dde23 は、陽的 Runge-Kutta (2,3) と ode23 の内挿を使って、不連続点を追跡し、積分します。反復を利用して、時間遅延より長いステップを使用します。

    参照

    [1] Shampine, Lawrence F., and S. Thompson. "Solving DDEs in MATLAB." Applied Numerical Mathematics 37, no. 4 (June 2001): 441–458. https://doi.org/10.1016/S0168-9274(00)00055-6.

    [2] Kierzenka, Jacek. "Tutorial on Solving DDEs with DDE23." MATLAB Central File Exchange. Updated September 1, 2016. https://www.mathworks.com/matlabcentral/fileexchange/3899-tutorial-on-solving-ddes-with-dde23.

    [3] Willé, David R., and Christopher T. H. Baker. "DELSOL—a Numerical Code for the Solution of Systems of Delay-Differential Equations." Applied Numerical Mathematics 9, no. 3 (April 1992): 223–234. https://doi.org/10.1016/0168-9274(92)90017-8.

    バージョン履歴

    R2006a より前に導入