ドキュメンテーション

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

odeToVectorField

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

文字ベクトル入力は将来のリリースで削除される予定です。代わりに、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 を得る際に行われた代入を示します。

高階数方程式の 1 階方程式系への変換

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

d2ydt2+y2t=3t.

syms y(t)
eqn = diff(y,2) + y^2*t == 3*t;
V = odeToVectorField(eqn)
V =
           Y[2]
 3*t - t*Y[1]^2

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

  • diff(Y[1],t) = Y[2]

  • diff(Y[2],t) = 3*t - t*Y[1]^2

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

次数を簡約した際の代入を返す

微分方程式の次数を簡約するときは、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 =
        Y[2]
 Y[1] + Y[3]
 Y[3] - Y[1]

S =
  f
 Df
  g

S から、S[1] = Y[1] = fS[2] = Y[2] = diff(f)、およびS[3] = Y[3] = g が得られます。

高階数微分方程式の数値的な求解

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

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

dy2dx2=(1y2)dydxy.

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

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

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

関数 ode45 を使用して、区間 [0 20] および初期条件 y’(0) = 2 および y’’(0) = 0 でこの系を解きます。

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

関数 linspace を使用して当該区間での t の値を生成します。これらの値について、ySol の最初のインデックスである y の解を、関数 deval をインデックス 1 で呼び出して評価します。解をプロットします。

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 =
 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 として返します。

R2012a で導入