Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

daeFunction

ode15i に適合する MATLAB 関数ハンドルへの微分代数方程式系の変換

説明

f = daeFunction(eqs,vars) は、シンボリックな 1 階微分代数方程式 (DAE) 系を MATLAB® の数値 DAE ソルバー ode15i の入力引数として受け入れられる MATLAB 関数ハンドルに変換します。

f = daeFunction(eqs,vars,p1,...,pN) では、系のシンボリック パラメーターを p1,...,pN に指定できます。

f = daeFunction(___,Name,Value) は、1 つ以上の Name,Value 引数のペアによって指定された追加オプションを使用します。

すべて折りたたむ

微分代数方程式系を作成します。ここで、シンボリック関数 x1(t) および x2(t) は系の状態変数を表しています。また、系には定数シンボリック パラメーター ab、およびパラメーター関数 r(t) が含まれます。これらのパラメーターは状態変数を表していません。方程式と状態変数を 2 つのシンボリック ベクトル (方程式をシンボリック方程式のベクトル、変数をシンボリック関数呼び出しのベクトル) として指定します。

syms x1(t) x2(t) a b r(t)
eqs = [diff(x1(t),t) == a*x1(t) + b*x2(t)^2,...
       x1(t)^2 + x2(t)^2 == r(t)^2];
vars = [x1(t),x2(t)];

daeFunction を使用し、変数 x1(t)x2(t)、およびパラメーター abr(t) にかかわる MATLAB® 関数ハンドル f を生成します。

f = daeFunction(eqs,vars,a,b,r(t))
f = function_handle with value:
    @(t,in2,in3,param1,param2,param3)[in3(1,:)-param1.*in2(1,:)-param2.*in2(2,:).^2;-param3.^2+in2(1,:).^2+in2(2,:).^2]

パラメーター値を指定し、次のような簡約化された関数ハンドル F を作成します。

a = -0.6;
b = -0.1;
r = @(t) cos(t)/(1 + t^2);
F = @(t,Y,YP) f(t,Y,YP,a,b,r(t));

DAE 系に対し整合性のある初期条件を指定します。

t0 = 0;
y0 = [-r(t0)*sin(0.1); r(t0)*cos(0.1)];
yp0= [a*y0(1) + b*y0(2)^2; 1.234];

次に、ode15i を使用して方程式系の解を求めます。

ode15i(F,[t0,1],y0,yp0)

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

File オプションを指定して、生成した関数ハンドルをファイルに書き込みます。ファイルへの書き込みの際に、daeFunction は、t0t1 といった名前の中間変数を使用してコードを最適化します。Comments オプションを使用してファイルにコメントを含めます。

生成した関数ハンドルをファイル myfile に書き込みます。

syms x1(t) x2(t) a b r(t)
eqs = [diff(x1(t),t) == a*x1(t) + b*x2(t)^2,...
       x1(t)^2 + x2(t)^2 == r(t)^2];
vars = [x1(t), x2(t)];
daeFunction(eqs, vars, a, b, r(t), 'File', 'myfile')
function eqs = myfile(t,in2,in3,param1,param2,param3)
%MYFILE
%    EQS = MYFILE(T,IN2,IN3,PARAM1,PARAM2,PARAM3)

%    This function was generated by the Symbolic Math Toolbox version 7.3.
%    01-Jan-2017 00:00:00

YP1 = in3(1,:);
x1 = in2(1,:);
x2 = in2(2,:);
t2 = x2.^2;
eqs = [YP1-param2.*t2-param1.*x1;t2-param3.^2+x1.^2];

コメント Version: 1.1 を含めます。

daeFunction(eqs, vars, a, b, r(t), 'File', 'myfile',...
                    'Comments','Version: 1.1');
function eqs = myfile(t,in2,in3,param4,param5,param6)
...
%Version: 1.1
YP3 = in3(1,:);
...

入力引数

すべて折りたたむ

1 階 DAE 系。シンボリック方程式または式のベクトルとして指定します。この式は右辺がゼロの方程式を表します。

状態変数。x(t) など、シンボリックな関数または関数呼び出しのベクトルとして指定します。

例: [x(t),y(t)] または [x(t);y(t)]

系のパラメーター。f(t) などのシンボリック変数、シンボリック関数またはシンボリック関数呼び出しで指定します。また、系のパラメーターをシンボリックな変数、関数または関数呼び出しのベクトルまたは行列として指定することもできます。eqsvars で指定されている変数以外のシンボリック パラメーターが含まれる場合は、それらの追加パラメーターを p1,...,pN として指定しなければなりません。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は関係ありません。

R2021a より前では、コンマを使用して名前と値の各ペアを区切り、Name を引用符で囲みます。

例: daeFunction(eqns,vars,'File','myfile')

ファイル ヘッダーに含めるコメント。文字ベクトル、文字ベクトルの cell 配列、または string ベクトルとして指定します。

生成されたコードを含むファイルへのパス。文字ベクトルとして指定します。生成されたファイルは double 型の引数を受け入れます。また、Symbolic Math Toolbox™ なしで使用できます。値が空の文字ベクトルの場合、odeFunction は無名関数を生成します。文字ベクトルが .m で終わっていない場合は、関数は .m を追加します。

既定では、引数 File をもつ daeFunction は、最適化されたコードを含むファイルを生成します。"最適化された" とは、コードを単純化または高速化するために中間変数が自動的に生成されていることを意味します。MATLAB によって生成される中間変数は、小文字の t に自動生成される番号を付けたもの (t32 など) です。コードの最適化を無効にするには、引数 Optimize を使用します。

関数ファイルに書き込まれたコードの最適化を回避するフラグ。false または true で指定します。

既定では、引数 File をもつ daeFunction は、最適化されたコードを含むファイルを生成します。"最適化された" とは、コードを単純化または高速化するために中間変数が自動的に生成されていることを意味します。MATLAB によって生成される中間変数は、小文字の t に自動生成される番号を付けたもの (t32 など) です。

引数 File を持たない (または空の文字ベクトルによって指定されたファイル パスを持つ) daeFunction は、関数ハンドルを作成します。この場合、コードは最適化されません。Optimizetrue に設定して強制的にコードの最適化を行おうとすると、daeFunction はエラーをスローします。

スパース行列と密行列の生成を切り替えるフラグ。true または false で指定します。'Sparse',true を指定すると、生成された関数では、スパース数値行列でシンボリック行列を表します。ゼロの要素を多く含むシンボリック行列を変換する場合、'Sparse',true を指定します。多くの場合、スパース行列での演算は、密行列での同じ演算よりも効率的です。

出力引数

すべて折りたたむ

ode15i への入力引数として機能する関数ハンドル。MATLAB 関数ハンドルとして返されます。

バージョン履歴

R2014b で導入