ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ddensd

中立型の遅延微分方程式 (DDE) を解く

構文

  • sol = ddensd(ddefun,dely,delyp,history,tspan)
  • sol = ddensd(ddefun,dely,delyp,history,tspan,options)

説明

sol = ddensd(ddefun,dely,delyp,history,tspan) は、次の形式をもつ中立型の遅延微分方程式系を積分します。

y '(t) = f(t, y(t), y(dy1),..., y(dyp), y '(dyp1),..., y '(dypq))(1-1)

で、

  • t は、時間を表す独立変数です。

  • dyi は、解の遅延 p 個のいずれかです。

  • dypi は、導関数の遅延 q 個のいずれかです。

sol = ddensd(ddefun,dely,delyp,history,tspan,options) は、既定の積分パラメーターを、関数 ddeset で作成された構造体の options で指定されたもので置き換えます。

すべて折りたたむ

2 つの遅延をもつ中立 DDE

Paul によって提示される次の中立 DDE を 0 ≤ t ≤ π について解きます。

y '(t) = 1 + y(t) – 2y(t/2)2 – y '(t – π)

使用する履歴: t ≤ 0 について y(t) = cos (t)

新しいプログラム ファイルをエディターで作成します。このファイルには、1 つのメイン関数と 4 つのローカル関数が記述されます。

1 次 DDE をローカル関数として定義します。

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

解の遅延をローカル関数として定義します。

function dy = dely(t,y) 
    dy = t/2;
end

導関数の遅延をローカル関数として定義します。

function dyp = delyp(t,y) 
    dyp = t-pi;
end

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

function y = history(t)
    y = cos(t);
end

積分区間を定義し、関数 ddensd を使用して DDE を解きます。このコードをメイン関数に追加します。

tspan = [0 pi];
sol = ddensd(@ddefun,@dely,@delyp,@history,tspan);

0 から π の区間について 100 個の等間隔に分布する点で解を計算します。このコードをメイン関数に追加します。

tn = linspace(0,pi);
yn = deval(sol,tn);

結果をプロットします。このコードをメイン関数に追加します。

plot(tn,yn);
xlim([0 pi]);
ylim([-1.2 1.2]);
xlabel('time t');
ylabel('solution y');

プログラムを実行し、解を計算してプロットを表示します。

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

入力引数

すべて折りたたむ

ddefun — 導関数関数ハンドル

導関数を、yp = ddefun(t,y,ydel,ypdel) をその構文とする関数ハンドルとして指定します。次の表は、ddefun の引数をまとめています。

ddefun 引数説明
t時間 t の現在の値を表すスカラー値。
y式 1-1 での y(t) を表すベクトル。このベクトルのサイズは、n1 列であり、ここで n は、解を求めたいシステムにおける方程式の数です。
ydelydel(:,i) が y(dyi) を表す行列。この行列のサイズは np 列であり、ここで n は、解を求めたいシステムにおける方程式の数であり、p は、式 1-1 における y(dy) 項の数です。
ypdelypdel(:,j) が y '(dypj) を表す行列。この行列のサイズは nq 列であり、ここで n は、解を求めたいシステムにおける方程式の数であり、q は、式 1-1 における y '(dyp) 項の数です。
ypddefun で返される結果。要素が 式 1-1 の右辺を表す n 行 x 1 列のベクトルです。

dely — 解の遅延関数ハンドル | ベクトル

解の遅延を、式 1-1 において dy1,..., dyp を返す関数ハンドルとして指定します。あるいは、ベクトルの形式で定数の遅れを渡すこともできます。

dely を関数ハンドルとして指定する場合、構文は dy = dely(t,y) でなければなりません。次の表は、この関数の引数をまとめています。

dely 引数説明
t時間 t の現在の値を表すスカラー値。
y式 1-1 での y(t) を表すベクトル。このベクトルのサイズは、n1 列であり、ここで n は、解を求めたいシステムにおける方程式の数です。
dy関数 dely によって返されるベクトルであり、その値は、式 1-1 における解の遅延 dyi です。このベクトルのサイズは、p 行 x 1 列であり、ここで p は、方程式における解の遅延の数です。各要素は、t 以下でなければなりません。

形式 dyi = t – τi をもつ定数の解の遅延を指定する場合、dely は、dely(i) = τi となるベクトルでなければなりません。このベクトルの各値は、ゼロ以上でなければなりません。

dy が問題にない場合、dely[] に設定します。

データ型: function_handle | single | double

delyp — 導関数の遅延関数ハンドル | ベクトル

導関数の遅延を、式 1-1 において dyp1,..., dypq を返す関数ハンドルとして指定します。あるいは、ベクトルの形式で定数の遅れを渡すこともできます。

delyp が関数ハンドルである場合、その構文は dyp = delyp(t,y) でなければなりません。次の表は、この関数の引数をまとめています。

delyp 引数説明
t時間 t の現在の値を表すスカラー値。
y式 1-1 での y(t) を表すベクトル。このベクトルのサイズは、n1 列であり、ここで n は、解を求めたいシステムにおける方程式の数です。
dyp関数 delyp によって返されるベクトルであり、その値は、式 1-1 における導関数の遅延 dypj です。このベクトルのサイズは、q1 列でなければなりません。ここで q は、方程式における解の遅延 dypj の数です。dyp の各要素は、t 未満でなければなりません。この制限には、例外が 1 つあります。初期値 DDE を解く場合、dyp の値は、t = t0 において t に等しくなります。詳細は、初期値中立遅延微分方程式を参照してください。

形式 dypj = t – τj をもつ定数の導関数の遅延を指定する場合、delyp は、delyp(j) = τj となるベクトルでなければなりません。このベクトルの各値は、ゼロより大きくなければなりません。この制限への例外は、中立型の DDE について初期値問題を解く場合に発生します。このような場合、delyp の値は、t = t0 において 0 に等しくなります。詳細は、初期値中立遅延微分方程式を参照してください。

dyp が問題にない場合、delyp[] に設定します。

データ型: function_handle | single | double

history — 解の履歴関数ハンドル | 列ベクトル | 構造体 (sol、前の積分から) | 12 列のセル配列

解の履歴を、関数ハンドル、列ベクトル、sol 構造体 (前の積分から) またはセル配列として指定します。これは、t ≤ t0 における解です。

  • 履歴が時間と共に変化する場合、構文を y = history(t) とする関数ハンドルとして解の履歴を指定します。この関数は、解 y(t) を t <= t0 について近似する n1 列のベクトルを返します。このベクトルの長さは、n であり、これは、解を求めたいシステムにおける方程式の数です。

  • y(t) が定数である場合、history を定数値の n1 列のベクトルとして指定できます。

  • 前の積分を t0 まで継続するために ddensd を呼び出す場合、前の積分から出力 sol として履歴を指定できます。

  • 初期値 DDE を解く場合、セル配列 {y0, yp0} として履歴を指定します。最初の要素 y0 は、初期値 y(t0) の列ベクトルです。2 番目の要素 yp0 は、要素が初期導関数 y '(t0) である列ベクトルです。これらのベクトルには、矛盾がないようにしなければなりません。すなわち、いずれもが t0 において式 1-1 を満たします。詳細は、初期値中立遅延微分方程式を参照してください。

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

tspan — 積分区間12 列のベクトル

積分区間を、ベクトル [t0 tf] として指定します。最初の要素 t0 は、t の初期値です。2 番目の要素 tf は、t の最終値です。t0 の値は、 tf 未満でなければなりません。

データ型: single | double

options — オプションの積分パラメーターddeset によって返される構造体

オプションの積分パラメーターを、関数 ddeset によって作成されて返された構造体として指定します。一般に利用されるプロパティは、'RelTol''AbsTol' および 'Events' です。options の指定についての詳細は、ddeset のリファレンス ページを参照してください。

出力引数

すべて折りたたむ

sol — 解構造体

以下のフィールドを含む構造体として返される解。

sol.x関数 ddensd で選択されたメッシュ
sol.yメッシュ点での y(t) への近似。
sol.ypメッシュ点での y '(t) への近似。
sol.solverソルバー 'ddensd' を識別する文字列。

特定のポイントでの解を計算するため、sol を関数 deval に渡すことができます。たとえば、y = deval(sol, 0.5*(sol.x(1) + sol.x(end))) は、積分区間の中点で解を計算します。

詳細

すべて折りたたむ

初期値中立遅延微分方程式

初期値 DDE は、すべての i および j について dyi≥t0 および dypj≥t0 を満たします。t = t0 では、すべての遅延の項が、y(dyi) = y(t0) および y '(dypj) = y '(t0) に縮小し、次の式が成立します。

y '(t0) = f(t0, y(t0), y(t0),..., y(t0), y '(t0),..., y '(t0))(1-2)

t > t0 の場合、すべての導関数の遅延は、dyp < t を満たさなければなりません。

初期値中立 DDE を解く場合、y '(t0) を ddensd に与えなければなりません。これを行うには、history をセル配列 {Y0,YP0} として指定します。ここで、Y0 は、初期値 y(t0) の列ベクトルであり、YP0 は、初期導関数 y '(t0) の列ベクトルです。これらのベクトルには、矛盾がないようにしなければなりません。すなわち、いずれもが t0 において式 1-2 を満たします。

アルゴリズム

このソルバーで使用されるアルゴリズムの詳細は、Shampine [2] を参照してください。

参照

[1] Paul, C.A.H. “A Test Set of Functional Differential Equations.” Numerical Analysis Reports. No. 243. Manchester, UK: Math Department, University of Manchester, 1994.

[2] Shampine, L.F. “Dissipative Approximations to Neutral DDEs.” Applied Mathematics & Computation. Vol. 203, Number 2, 2008, pp. 641–648.

この情報は役に立ちましたか?