メインコンテンツ

odeFunction

ODE ソルバー用関数ハンドルへのシンボリック式の変換

説明

f = odeFunction(expr,vars) は、連立シンボリック代数式を MATLAB® 関数ハンドルに変換します。この関数ハンドルは、ode15i を除く数値 MATLAB ODE ソルバーの入力引数として使用できます。引数 vars は方程式の状態変数を指定します。

f = odeFunction(expr,vars,p1,...,pN) では、方程式のシンボリック パラメーターを p1,...,pN に指定します。

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

すべて折りたたむ

シンボリックな連立微分代数方程式を MATLAB ODE ソルバーに適した関数ハンドルに変換します。次に ode15s ソルバーを使用して、この方程式の解を求めます。

次の 2 階微分代数方程式を作成します。

syms y(t);
eqn = diff(y(t),t,2) == (1-y(t)^2)*diff(y(t),t) - y(t);

reduceDifferentialOrder を使用して、この方程式を 2 つの連立 1 階微分方程式として書き換えます。ここで、vars は方程式の状態変数ベクトルです。新規の変数 Dy(t) は、t に対する y(t) の 1 次導関数を表します。

[eqs,vars] = reduceDifferentialOrder(eqn,y(t))
eqs = 

(t Dyt(t)+y(t)+Dyt(t)y(t)2-1Dyt(t)-t y(t))

vars = 

(y(t)Dyt(t))

y(t) およびその導関数 Dy(t) の初期条件を 2 および 0 にそれぞれ設定します。

initConditions = [2 0];

方程式の質量行列 M および方程式 F の右辺を含むベクトルを求めます。

[M,F] = massMatrixForm(eqs,vars)
M = 

(01-10)

F = 

(-y(t)-Dyt(t)y(t)2-1-Dyt(t))

M および F は次の形で表されます。M(t,x(t)) x˙(t)=F(t,x(t))。後の計算を単純化するために、方程式を次の形に書き換えます。x˙(t)=f(t,x(t))

f = M\F
f = 

(Dyt(t)-Dyt(t)y(t)2-y(t)+Dyt(t))

odeFunction を使用して、f を MATLAB 関数ハンドルに変換します。結果の関数ハンドルは MATLAB ODE ソルバー ode15s の入力になります。

odefun = odeFunction(f,vars);
ode15s(odefun,[0 10],initConditions)

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

状態変数とシンボリック パラメーターの両方が含まれているシンボリック連立微分方程式を MATLAB ODE ソルバーに適した関数ハンドルに変換します。

連立微分代数方程式を作成します。ここで、シンボリック関数 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)];

質量行列 M と、この方程式の右辺から成るベクトル F を求めます。M および F は次の形で表されます。M(t,x(t))˙x(t)=F(t,x(t))。

[M,F] = massMatrixForm(eqs,vars)
M = 

(1000)

F = 

(bx2(t)2+ax1(t)r(t)2-x1(t)2-x2(t)2)

odeFunction を使用して、M および F から MATLAB 関数ハンドルを生成します。関数ハンドル F にはシンボリック パラメーターが含まれています。

M = odeFunction(M,vars)
M = function_handle with value:
    @(t,in2)reshape([1.0,0.0,0.0,0.0],[2,2])

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

パラメーター値を指定します。

aVal = -0.6;
bVal = -0.1;
rFunc = @(t) cos(t)/(1+t^2);

簡約された関数ハンドル F を作成します。

F = @(t,Y) F(t,Y,aVal,bVal,rFunc(t));

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

t0 = 0;
y0 = [-rFunc(t0)*sin(0.1); rFunc(t0)*cos(0.1)];
yp0 = [aVal*y0(1) + bVal*y0(2)^2; 1.234];

方程式の質量行列 M および、導関数の初期条件のベクトル yp0 を含むオプション セットを作成します。

opt = odeset(mass=M,InitialSlope=yp0);

次に、ode15s を使用して連立方程式の解を求めます。

ode15s(F,[t0 1],y0,opt)

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

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

連立微分方程式の定義質量行列 M とその右辺 F を求めます。

syms x(t) y(t)
eqs = [diff(x(t),t)+2*diff(y(t),t) == 0.1*y(t), ...
      x(t)-y(t) == cos(t)-0.2*t*sin(x(t))];
vars = [x(t) y(t)];
[M,F] = massMatrixForm(eqs,vars);

MF の MATLAB コードをファイル myfileMmyfileF に書き込みます。odeFunction は既存のファイルを上書きします。ファイル内にコメント Version: 1.1 を含めます。出力ファイルは開くことと編集することができます。

M = odeFunction(M,vars,File="myfileM",Comments="Version: 1.1");
type myfileM
function expr = myfileM(t,in2)
%myfileM
%    EXPR = myfileM(T,IN2)

%    This function was generated by the Symbolic Math Toolbox version 25.2.
%    11-Aug-2025 08:29:52

%Version: 1.1
expr = reshape([1.0,0.0,2.0,0.0],[2,2]);
end
F = odeFunction(F,vars,File="myfileF",Comments="Version: 1.1");
type myfileF
function expr = myfileF(t,in2)
%myfileF
%    EXPR = myfileF(T,IN2)

%    This function was generated by the Symbolic Math Toolbox version 25.2.
%    11-Aug-2025 08:29:53

%Version: 1.1
x = in2(1,:);
y = in2(2,:);
expr = [y./1.0e+1;-x+y+cos(t)-(t.*sin(x))./5.0];
end

x(t)y(t) およびそれらの 1 次導関数に矛盾のない初期値を指定します。

xy0 = [2; 1];             % x(t) and y(t)
xyp0 = [0; 0.05*xy0(2)];  % derivatives of x(t) and y(t)

質量行列 M、初期条件 xyp0、および数値検索の数値許容誤差を服務オプション セットを作成します。

opt = odeset(mass=M,RelTol=1e-6,AbsTol=1e-6,InitialSlope=xyp0);

ode15s を使用して連立方程式を解きます。

ode15s(F,[0 7],xy0,opt)

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

シンボリック微分方程式をスパース行列をもつ MATLAB 関数ハンドルに変換する場合は、名前と値の引数 Sparsetrue として指定します。

連立微分代数方程式を作成します。ここで、シンボリック関数 x1(t) および x2(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)];

質量行列 M と、この方程式の右辺から成るベクトル F を求めます。M および F は次の形で表されます。M(t,x(t))˙x(t)=F(t,x(t))。

[M,F] = massMatrixForm(eqs,vars)
M = 

(1000)

F = 

(bx2(t)2+ax1(t)r(t)2-x1(t)2-x2(t)2)

M および F から MATLAB 関数ハンドルを生成します。質量行列 M の要素のほとんどはゼロのため、M を変換するときには引数 Sparse を使用します。

M = odeFunction(M,vars,Sparse=true)
M = function_handle with value:
    @(t,in2)sparse([1],[1],[1.0],2,2)

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

パラメーター値を指定します。

aVal = -0.6;
bVal = -0.1;
rFunc = @(t) cos(t)/(1 + t^2);

簡約された関数ハンドル F を作成します。

F = @(t,Y) F(t,Y,aVal,bVal,rFunc(t));

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

t0 = 0;
y0 = [-rFunc(t0)*sin(0.1); rFunc(t0)*cos(0.1)];
yp0 = [aVal*y0(1) + bVal*y0(2)^2; 1.234];

方程式の質量行列 M および、導関数の初期条件のベクトル yp0 を含むオプション セットを作成します。

opt = odeset(mass=M,InitialSlope=yp0);

ode15s を使用して連立方程式を解きます。

ode15s(F,[t0 1],y0,opt)

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

入力引数

すべて折りたたむ

連立代数式の系。シンボリック式のベクトルとして指定します。

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

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

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

名前と値の引数

すべて折りたたむ

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

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

例: odeFunction(expr,vars,File="myfile")

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

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

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

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

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

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

スパース行列と密行列の生成を切り替えるフラグ。true または false で指定します。Sparse=true を指定すると、生成された関数では、スパース数値行列でシンボリック行列を表します。ゼロの要素を多く含むシンボリック行列を変換する場合、Sparse=true を指定します。多くの場合、スパース行列での演算は、密行列での同じ演算よりも効率的です。スパース行列をもつ関数ハンドルへの微分方程式の変換を参照してください。

出力引数

すべて折りたたむ

ode15i を除くすべての数値 MATLAB ODE ソルバー入力引数として機能する関数ハンドル。MATLAB 関数ハンドルとして返されます。

odeFunction は、ode45ode15sode23t などの ODE ソルバーに適した関数ハンドルを返します。この関数ハンドルを受け付けない唯一の ODE ソルバーは、完全な陰的微分方程式向けのソルバーである ode15i です。連立方程式を ode15i に適した関数ハンドルに変換するには、daeFunction を使用します。

バージョン履歴

R2015a で導入