Main Content

dde23

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

構文

sol = dde23(ddefun,lags,history,tspan)
sol = dde23(ddefun,lags,history,tspan,options)

引数

ddefun

微分方程式 y(t)=f(t,y(t),y(tτ1),...,y(tτk)) の右辺を評価する関数ハンドル。方程式は、以下の形式でなければなりません。

dydt = ddefun(t,y,Z)

ここで、t は、現在の t に対応します。y は、y(t) を近似する列ベクトルです。Z(:,j) は、遅延 τj = lags(j) の y(t – τj) を近似します。出力は、f(t,y(t),y(tτ1),...,y(tτk)) に対応する列ベクトルです。

lags

定数の正の遅延 τ1, ..., τk を要素とするベクトル。

history

以下の 3 つのいずれかの方法で、history を指定します。

  • t ≤ t0 の解 y(t) を列ベクトルとして返す y = history(t) のような t の関数

  • y(t) が定数の場合、定数列ベクトル

  • この呼び出しがその積分を続ける場合、前の積分からの解 sol

tspan

t0=tspan(1) から tf=tspan(end) までの積分区間。ここで、t0 < tf です。

options

オプションの積分引数。関数 ddeset を使用して作成する構造体。詳細については、ddeset を参照してください。

説明

sol = dde23(ddefun,lags,history,tspan) は、次の DDE 系を積分します。

y(t)=f(t,y(t),y(tτ1),...,y(tτk))

区間は [t0,tf] です。ここで τ1, ..., τk は定数で正の遅延、および t0,tf です。入力引数 ddefun は、関数ハンドルです。

関数のパラメーター化では、必要に応じて関数 ddefun にパラメーターを追加する方法について説明しています。

関数 dde23 は、構造体 sol として解を返します。補助関数 deval と出力 sol を使用して、区間 tspan = [t0,tf] 内の特定の点 tint で、解を計算することができます。

yint = deval(sol,tint)

関数 dde23 により返される構造体 sol には、以下のフィールドがあります。

sol.x

dde23 で選択されたメッシュ

sol.y

sol.x のメッシュ点での y(x) への近似

sol.yp

sol.x のメッシュ点での y′(x) への近似

sol.solver

ソルバー名 'dde23'

sol = dde23(ddefun,lags,history,tspan,options) は、関数 ddeset で作成された引数の options に設定された値で、既定の積分プロパティを置き換えて上記のように解きます。詳細については、ddeset および遅延微分方程式の求解を参照してください。

一般に使われるオプションは、スカラーの相対許容誤差 'RelTol' (既定の設定では 1e-3) と絶対許容誤差 'AbsTol' (既定の設定ではすべての要素に対して 1e-6) です。

'Jumps' オプションを使って、履歴または解に不連続点がある問題を解くことができます。このオプションをベクトルに設定します。このベクトルには、t0 (その履歴) に先立つ解、または t0 より後の既知の t の値での方程式の係数の、いずれかにある不連続点の位置が含まれます。

'Events' オプションを使用して、関数 g(t,y(t),y(tτ1),...,y(tτk)) がゼロになる位置を検出するために dde23 が呼び出す関数を指定します。この関数は、以下の形式でなければなりません。

[value,isterminal,direction] = events(t,y,Z)

この関数は、テストされる個々のイベントに関するイベント関数を含んでいます。eventsk 番目のイベント関数では、以下のようになります。

  • value(k) は、k 番目のイベント関数の値です。

  • このイベント関数のゼロの位置で積分を終了させたい場合は isterminal(k) = 1、その他の場合は 0 です。

  • このイベント関数のすべてのゼロを関数 dde23 で計算させる場合は direction(k) = 0、イベント関数が増加する部分のゼロのみの場合は +1、減少する部分のゼロのみの場合は -1 です。

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

sol.xe

すべてのイベントの位置、つまり、イベント関数がゼロになる時刻を要素とする行ベクトル

sol.ye

sol.xe の時刻に対応する解の値を列の要素とする行列

sol.ie

sol.xe の中の対応する時間で生じるイベントのどれかを指定するインデックスから構成されるベクトル

以下の例は、lags に 1 と 0.2 を使って、区間 [0,5] で DDE を解きます。関数 ddex1de は遅れを含む微分方程式を計算し、ddex1histt <= 0 の history を計算します。

メモ

ファイル ddex1.m には、この例のコードがすべて含まれています。エディターでコードを表示するには、コマンド ラインで edit ddex1 と入力します。実行するには、コマンド ラインで ddex1 と入力してください。

sol = dde23(@ddex1de,[1, 0.2],@ddex1hist,[0, 5]);

このコードは、区間 [0,5] の 100 点の等間隔点で解を評価し、結果をプロットします。

tint = linspace(0,5);
yint = deval(sol,tint);
plot(tint,yint);

ddex1 は、ローカル関数を使って、この問題をコード化する方法を示しています。他の例については、ddex2 を参照してください。

アルゴリズム

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

参照

[1] Shampine, L.F. and S. Thompson, “Solving DDEs in MATLAB,” Applied Numerical Mathematics, Vol. 37, 2001, pp. 441-458.

[2] Kierzenka, J., L.F. Shampine, and S. Thompson, “Solving Delay Differential Equations with dde23

バージョン履歴

R2006a より前に導入