Main Content

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

odeToVectorField

微分方程式の次元を 1 次に簡約する

文字ベクトルまたは string 入力に対するサポートは将来のリリースで削除される予定です。代わりに、syms を使用して変数を宣言し、odeToVectorField('D2y = x') などの入力を syms y(x), odeToVectorField(diff(y,x,2) == x) で置き換えます。

説明

V = odeToVectorField(eqn1,...,eqnN) は、高階数微分方程式 eqn1,...,eqnN を 1 階微分方程式系に変換し、シンボリック ベクトルとして返します。

[V,S] = odeToVectorField(eqn1,...,eqnN)eqn1,...,eqnN を変換して 2 つのシンボリック ベクトルを返します。1 番目のベクトル V は前の構文の出力と同じになります。2 番目のベクトル S は、V を得る際に行われた代入を示します。

すべて折りたたむ

2 階微分方程式を定義します。

d2ydt2+y2t=3t.

この 2 階微分方程式系を 1 階微分方程式系に変換します。

syms y(t)
eqn = diff(y,2) + y^2*t == 3*t;
V = odeToVectorField(eqn)
V = 

(Y23t-tY12)[Y(2); 3*t - t*Y(1)^2]

V[i] = Yi および Y1=y のため、V の要素は 1 階微分方程式系を表します。ここで、出力 V は以下の方程式を表します。

dY1dt=Y2

dY2dt=3t-tY12.

入力と出力間の関係の詳細については、アルゴリズムを参照してください。

微分方程式の次数を簡約するときは、2 番目の出力引数を指定することで odeToVectorField が行った代入が返されます。

syms f(t) g(t)
eqn1 = diff(g) == g-f;
eqn2 = diff(f,2) == g+f;
eqns = [eqn1 eqn2];
[V,S] = odeToVectorField(eqns)
V = 

(Y2Y1+Y3Y3-Y1)[Y(2); Y(1) + Y(3); Y(3) - Y(1)]

S = 

(fDfg)[f; Df; g]

V[i] = Yi のため、V の要素は 1 階微分方程式系を表します。出力 S は、S[1] = Y1=f、S[2] = Y2 = diff(f)、および S[3] = Y3=g の実行された代入を示します。

方程式の次数を簡約し、MATLAB® 関数ハンドルを生成し、関数 ode45 を使用して数値解を求めることで、高階数微分方程式を数値的に求解します。

odeToVectorField を使用して、次の 2 階微分方程式系を 1 階微分方程式系に変換します。

d2ydt2=(1-y2)dydt-y.

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

(Y2-Y12-1Y2-Y1)[Y(2); - (Y(1)^2 - 1)*Y(2) - Y(1)]

matlabFunction を使用して V から MATLAB 関数ハンドルを生成します。

M = matlabFunction(V,'vars',{'t','Y'})
M = function_handle with value:
    @(t,Y)[Y(2);-(Y(1).^2-1.0).*Y(2)-Y(1)]

解の間隔を [0 20]、初期条件を y(0)=2 および y(0)=0 となるよう指定します。ode45 を使用して 1 階微分方程式系を解きます。

interval = [0 20];
yInit = [2 0];
ySol = ode45(M,interval,yInit);

次に、区間 t = [0 20] 内で解 y(t) をプロットします。linspace を使用して t の値を生成します。ySol の最初のインデックスである y(t) の解を、関数 deval をインデックス 1 で呼び出して評価します。plot を使用して解をプロットします。

tValues = linspace(0,20,100);
yValues = deval(ySol,tValues,1);
plot(tValues,yValues)

2 階微分方程式 y(x)=x (初期条件 y(0)=a) を 1 次の系に変換します。

syms y(x) a
eqn = diff(y,x,2) == x;
cond = y(0) == a;
V = odeToVectorField(eqn,cond)
V = 

(Y2x)[Y(2); x]

入力引数

すべて折りたたむ

高階数微分方程式。シンボリック微分方程式、またはシンボリック微分方程式の配列として指定します。== 演算子を使用して方程式を作成します。関数 diff を使用して、微分であることを示します。たとえば、次のコマンドを入力して d2y(t)/dt2 = t y(t) を表します。

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

出力引数

すべて折りたたむ

1 階微分方程式。シンボリック式またはシンボリック式のベクトルとして返されます。このベクトルの各要素は、1 階微分方程式 Y[i]′ = V[i] の右辺です。

1 次方程式での代入。シンボリック式の列ベクトルとして返されます。ベクトルの要素は S(1) = Y[1]S(2) = Y[2] などのように代入を表します。

ヒント

  • 結果の 1 階微分方程式の系を解くには、V を入力 matlabFunction で使用して関数ハンドル MATLAB® を生成します。次に、作成した MATLAB 関数ハンドルを MATLAB 数値ソルバー ode23 または ode45 の入力として使用します。

  • odeToVectorField は準線形微分方程式のみ変換できます。つまり、次数の最も高い導関数は線形である必要があります。たとえば、y*y″(t) = –t2y″(t) = –t2/y と書き換えられるため、odeToVectorField で変換できます。しかし、y″(t)2 = –t2sin(y″(t)) = –t2 は変換できません。

アルゴリズム

n 階微分方程式

an(t)y(n)+an1(t)y(n1)++a1(t)y+a0(t)y+r(t)=0

を 1 階微分方程式系に変換するします。odetovectorfield がこの代入を行います。

Y1=yY2=yY3=yYn1=y(n2)Yn=y(n1)

新しい変数を使用して、方程式を n 階微分方程式系として書き換えます。

Y1=y=Y2Y2=y=Y3Yn1=y(n1)=YnYn=an1(t)an(t)Ynan2(t)an(t)Yn1...a1(t)an(t)Y2a0(t)an(t)Y1+r(t)an(t)

odeToVectorField は、これらの方程式の右辺をベクトル V の要素として、行われた代入を 2 番目の出力 S として返します。

互換性についての考慮事項

すべて展開する

R2019b 以降は警告

R2012a で導入