ドキュメンテーション

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

dsolve

微分方程式および方程式系のソルバー

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

説明

S = dsolve(eqn) は、微分方程式 eqn を解きます。ここで、eqn はシンボリック方程式です。diff== を使用して微分方程式を表します。たとえば、diff(y,x) == y は方程式 dy/dx=y を表します。微分方程式系を解くには、eqn をこれらの方程式のベクトルとして指定します。

S = dsolve(eqn,cond) は、初期条件または境界条件が cond である eqn の解を求めます。

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

[y1,...,yN] = dsolve(___) は、解を変数 y1,...,yN に代入します。

微分方程式の求解

== を使用して微分方程式を指定し、関数 diff を使用して微分を表します。次に、dsolve を使用して方程式を解きます。

方程式 dydt=ay を解きます。

syms a y(t)
eqn = diff(y,t) == a*y;
dsolve(eqn)
ans =
C2*exp(a*t)

C2 は定数です。定数を消去するには、条件付き微分方程式の求解を参照してください。ワークフロー全体については、偏微分方程式の求解を参照してください。他の例は、微分方程式の求解を参照してください。

高階数微分方程式の求解

diff(y,t,2) または diff(y,t,t) を使用して、関数 y の 2 階微分を指定します。同様に、diff(y,t,n) を使用して n 階微分を指定します。

方程式 d2ydt2=ay を解きます。

syms y(t) a
eqn = diff(y,t,2) == a*y;
ySol(t) = dsolve(eqn)
ySol(t) =
C2*exp(-a^(1/2)*t) + C3*exp(a^(1/2)*t)

条件付き微分方程式の求解

== を使用し、条件を dsolve の 2 番目の入力として指定します。条件を指定することで、C1C2... などの任意定数が解から消去されます。

y(0)=5 の条件で方程式 dydt=ay を解きます。

syms y(t) a
eqn = diff(y,t) == a*y;
cond = y(0) == 5;
ySol(t) = dsolve(eqn,cond)
ySol(t) =
5*exp(a*t)

y(0)=by'(0)=1 の 2 つの条件を使用して、2 階微分方程式 d2ydt2=a2y を解きます。2 番目の条件は、diff(y,t)Dy に代入した後、Dy(0) == 1 を使用して作成します。

syms y(t) a b
eqn = diff(y,t,2) == a^2*y;
Dy = diff(y,t);
cond = [y(0)==b, Dy(0)==1];
ySol(t) = dsolve(eqn,cond)
ySol(t) =
(exp(a*t)*(a*b + 1))/(2*a) + (exp(-a*t)*(a*b - 1))/(2*a)

2 つの条件をここで指定したので、2 階方程式の解から定数が消去されています。一般に、解から定数を消去するには、条件の数を方程式の階数と等しくしなければなりません。

微分方程式系の求解

微分方程式系を解くには、方程式をベクトルとして指定します。解を含む構造体が dsolve によって返されます。

方程式系を解きます。

dydt=zdzdt=y.

syms y(t) z(t)
eqns = [diff(y,t) == z, diff(z,t) == -y];
sol = dsolve(eqns)
sol = 
  struct with fields:

    z: [1×1 sym]
    y: [1×1 sym]

構造体の要素を指定して解にアクセスします。

soly(t) = sol.y
soly(t) =
C2*cos(t) + C1*sin(t)
solz(t) = sol.z
solz(t) =
C1*cos(t) - C2*sin(t)

関数または変数への出力の代入

複数の関数を解く場合、dsolve は既定では構造体を返します。または、出力をベクトルとして明示的に指定し、関数や変数に解を直接代入することもできます。dsolvesymvar を使用して出力をアルファベット順に並べ替えます。

微分方程式系を解き、出力を関数に代入します。

syms y(t) z(t)
eqns = [diff(y,t)==z, diff(z,t)==-y];
[ySol(t) zSol(t)] = dsolve(eqns)
ySol(t) =
C2*cos(t) + C1*sin(t)
zSol(t) =
C1*cos(t) - C2*sin(t)

解が見つからない場合

dsolve を使用して方程式を解くことができない場合、方程式を数値的に解いてみてください。2 階微分方程式の数値的な求解を参照してください。

syms y(x)
eqn = diff(y, 2) == (1 - y^2)*diff(y) - y;
dsolve(eqn)
 Warning: Unable to find explicit solution. 
> In dsolve (line 201) 
ans =
[ empty sym ]

内部単純化を無効にして特殊なケースを含める

既定の設定では、dsolve は単純化を適用します。これは、一般的に正確ではありませんが、より単純な解を生成します。詳細は、アルゴリズムを参照してください。そうせずに、これらの単純化を無効にすることによりこれらの特殊なケースを含めます。

dydt=ay+y の解を求めます。ここで、単純化を使用するかどうかに関係なく、y(a)=1 になります。'IgnoreAnalyticConstraints' を false に設定して単純化を無効にします。

syms a y(t)
eqn = diff(y) == a/sqrt(y) + y;
cond = y(a) == 1;
withSimplifications = dsolve(eqn, cond)
withSimplifications =
(exp((3*t)/2 - (3*a)/2 + log(a + 1)) - a)^(2/3)
withoutSimplifications = dsolve(eqn, cond, 'IgnoreAnalyticConstraints', false)
withoutSimplifications =
piecewise(pi/2 < angle(-a), {piecewise(in(C11, 'integer'),...
 (- a + exp((3*t)/2 - (3*a)/2 + log(a + 1) + pi*C11*2i))^(2/3))},...
 angle(-a) <= -pi/2, {piecewise(in(C12, 'integer'),...
 (- a + exp((3*t)/2 - (3*a)/2 + log(a + 1) + pi*C12*2i))^(2/3))},...
 angle(-a) in Dom::Interval(-pi/2, [pi/2]), {piecewise(in(C13, 'integer'),...
 (- a + exp((3*t)/2 - (3*a)/2 + log(a + 1) + pi*C13*2i))^(2/3))})

withSimplifications は使いやすい反面、不完全です。一方、withoutSimplifications は特殊なケースを含みますが、使いやすくありません。

また、特定の方程式で 'IgnoreAnalyticConstraints' を false に設定すると、dsolve は陽的な解を求めることができません。

入力引数

すべて折りたたむ

微分方程式または方程式系。シンボリック方程式またはシンボリック方程式のベクトルとして指定します。

== 演算子を使用して、微分方程式を指定します。方程式では、diff を使用して、微分を表現します。たとえば、diff(y,x) はシンボリック関数 y(x)x で微分します。シンボリック関数 y(x) は、syms を使用して syms y(x) として作成します。したがって、d2y(x)/dx2 = x*y(x) の解を求めるには、次のように入力します。

syms y(x)
dsolve(diff(y,x,2) == x*y)

微分方程式系の指定は、dsolve([diff(y,t) == z, diff(z,t) == -y]) のように方程式のベクトルを使用します。

初期条件または境界条件。シンボリック方程式またはシンボリック方程式のベクトルとして指定します。

条件に導関数が含まれる場合、diff で導関数を表し、diff の呼び出しを変数に代入します。次に、その変数を使用して条件を作成します。例については、条件付き微分方程式の求解を参照してください。

複数の条件を指定するには、方程式のベクトルを使用します。条件の数が従属変数の数より少ない場合、解には任意定数 C1C2... が含まれます。

名前と値のペアの引数

オプションの引数 Name,Value のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: 'IgnoreAnalyticConstraints',false は内部単純化を適用しません。

内部単純化の使用。true または false として指定します。

既定の設定では、ソルバーは微分方程式を解きながら単純化を適用します。この単純化は、常に効果があるとは限りません。したがって、既定の設定では、ソルバーは結果の完全性を保証しません。詳細は、アルゴリズムを参照してください。これらの単純化を使用せずに常微分方程式を解くには、IgnoreAnalyticConstraintsfalse に設定します。'IgnoreAnalyticConstraints' を false に設定して得られた結果は、引数のすべての値に対して正確です。

'IgnoreAnalyticConstraints' を false に設定しない場合は、dsolve コマンドで返される結果を必ず検証してください。

ソルバーが陽的な式を使用する多項方程式の最大次数。5 より小さい正の整数で指定します。dsolve は、MaxDegree より高次の多項方程式の解を求める場合は、陽的な式を使用しません。

出力引数

すべて折りたたむ

微分方程式の解。シンボリック式またはシンボリック式のベクトルとして返されます。S のサイズは解の数です。

微分方程式の解を格納する変数。シンボリック変数のベクトルとして返されます。出力変数の数は系の従属変数の数と等しくなければなりません。dsolve は従属変数をアルファベット順に並べ替えてから、それらの変数の解を出力変数またはシンボリック配列に代入します。

ヒント

  • dsolve で陽的な解または陰的な解を求めることができない場合は、警告を表示し、空の sym を返します。この場合、MATLAB® 関数 ode23ode45 を使用して数値解を求めてください。出力は同等の低階微分方程式、または積分になる場合があります。

  • dsolve は、閉じた形の (明示的な) 解を求められない場合、暗黙的な解を求めようとします。dsolve によって陰的な解が返される際に、次の警告が表示されます。

    Warning: Explicit solution could not be found;
    implicit solution returned.
  • 'IgnoreAnalyticConstraints’ が false の場合であっても、dsolve は完全な解を返しません。

アルゴリズム

'IgnoreAnalyticConstraints' を false に設定しない場合、dsolve は、方程式を解く際に以下のルールを適用します。

  • 任意の a および b について、log(a) + log(b) = log(a·b) が成り立つ。特に、次の等式は任意の a、b、c の値に当てはまる。

      (a·b)c = ac·bc.

  • 任意の a および b について、log(ab) = b·log(a) が成り立つ。特に、次の等式は任意の a、b、c の値に当てはまる。

      (ab)c = ab·c.

  • f および g が標準的な数学関数、かつ任意の微小な正数について f(g(x)) = x である場合、すべての複素数 x に対して f(g(x)) = x が有効であるものとする。以下に例を示します。

    • log(ex) = x

    • asin(sin(x)) = x, acos(cos(x)) = x, atan(tan(x)) = x

    • asinh(sinh(x)) = x, acosh(cosh(x)) = x, atanh(tanh(x)) = x

    • 任意の k の値について Wk(x·ex) = x

  • ソルバーは、0 を除く任意の式で方程式の両辺を乗算できる。

  • 多項方程式の解は完全でなければならない。

R2006a より前に導入