Main Content

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

dsolve

微分方程式系の求解

文字ベクトルまたは string 入力に対するサポートは将来のリリースで削除される予定です。代わりに、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(___,Name,Value) は 1 つ以上の Name,Value のペアの引数によって指定された追加オプションを使用します。

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

すべて折りたたむ

1 階微分方程式 dydt=ay. を解きます。

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

syms y(t) a
eqn = diff(y,t) == a*y;
S = dsolve(eqn)
S = C1eatC1*exp((a*t))

解には定数が含まれます。定数を除去するには、条件付き微分方程式の求解を参照してください。ワークフロー全体については、偏微分方程式の求解を参照してください。

2 階微分方程式 d2ydt2=ay. を解きます。

diff(y,t,2) を使用して 2 階微分方程式を指定し、== を使用して方程式を指定します。次に、dsolve を使用して方程式を解きます。

syms y(t) a
eqn = diff(y,t,2) == a*y;
ySol(t) = dsolve(eqn)
ySol(t) = C1e-at+C2eatC1*exp((-sqrt(a)*t)) + C2*exp((sqrt(a)*t))

初期条件 y(0)=5 の 1 階微分方程式 dydt=ay を解きます。

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

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

次に、d2ydt2=a2yy(0)=b の初期条件を使用して、2 階微分方程式 y(0)=1 を解きます。

diff(y,t)Dy に代入した後、Dy(0) == 1 を使用して 2 番目の初期条件を作成します。

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) = 

eatab+12a+e-atab-12a(exp((a*t))*(a*b + 1))/(2*a) + (exp((-a*t))*(a*b - 1))/(2*a)

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

微分方程式系の求解

dydt=zdzdt=-y.

方程式系をベクトルとして指定します。dsolve は解を含む構造体を返します。

syms y(t) z(t)
eqns = [diff(y,t) == z, diff(z,t) == -y];
S = dsolve(eqns)
S = struct with fields:
    z: [1x1 sym]
    y: [1x1 sym]

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

ySol(t) = S.y
ySol(t) = C1cos(t)+C2sin(t)C1*cos(t) + C2*sin(t)
zSol(t) = S.z
zSol(t) = C2cos(t)-C1sin(t)C2*cos(t) - C1*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) = C1cos(t)+C2sin(t)C1*cos(t) + C2*sin(t)
zSol(t) = C2cos(t)-C1sin(t)C2*cos(t) - C1*sin(t)

微分方程式 ty(t)=e-y(t)+y(t) の解を求めます。dsolve は定数値をもつランベルトの W 関数で陽的な解を返します。

syms y(t)
eqn = diff(y) == y+exp(-y)
eqn(t) = 

t y(t)=e-y(t)+y(t)diff(y(t), t) == exp((-y(t))) + y(t)

sol = dsolve(eqn)
sol = Wlambertw0(-1)lambertw(sym(0), -1)

微分方程式の陰的な解を返すには、'Implicit' オプションを true に設定します。陰的な解は F(y(t))=g(t) の形式をとります。

sol = dsolve(eqn,'Implicit',true)
sol = 

(eyyey+1dy|y=y(t)=C1+te-y(t)ey(t)y(t)+1=0)[(subs(int(exp(y)/(y*exp(y) + 1), y, 'IgnoreSpecialCases', true, 'IgnoreAnalyticConstraints', true), y, y(t))) == C1 + t; exp((-y(t)))*(exp(y(t))*y(t) + 1) == 0]

微分方程式の陽的な解を解析的に求めることができない場合、dsolve は空のシンボリック配列を返します。ode45 など、MATLAB® 数値ソルバーを使用して微分方程式を解くことができます。詳細については、2 階微分方程式の数値的な求解を参照してください。

syms y(x)
eqn = diff(y) == (x-exp(-x))/(y(x)+exp(y(x)));
S = dsolve(eqn)
Warning: Unable to find symbolic solution.
 
S =
 
[ empty sym ]
 

'Implicit' オプションを true に指定して、微分方程式の陰的な解を調べることもできます。陰的な解は F(y(x))=g(x) の形式をとります。

S = dsolve(eqn,'Implicit',true)
S = 

ey(x)+y(x)22=C1+e-x+x22exp(y(x)) + y(x)^2/2 == C1 + exp((-x)) + x^2/2

条件 y(a)=1 を使用して微分方程式 dydt=ay+y を解きます。既定では、dsolve は一般的に正確ではない単純化を適用しますが、より単純な解を生成します。詳細については、アルゴリズムを参照してください。

syms a y(t)
eqn = diff(y) == a/sqrt(y) + y;
cond = y(a) == 1;
ySimplified = dsolve(eqn, cond)
ySimplified = 

e3t2-3a2+log(a+1)-a2/3(exp(((3*t)/2 - (3*a)/2 + log(a + 1))) - a)^sym(2/3)

パラメーター a の可能な値がすべて含まれる解を返すには、'IgnoreAnalyticConstraints'false に設定して単純化を無効にします。

yNotSimplified = dsolve(eqn,cond,'IgnoreAnalyticConstraints',false)
yNotSimplified = 

{{{σ1} if  -π2<σ2{σ1,--a+e3t2-3a2+log(a+-12+σ33/2)+2πC2i2/312+σ3} if  σ2-π2 if  C2Z if  C2Zwhere  σ1=-a+e3t2-3a2+log(a+1)+2πC2i2/3  σ2=angle(e3C12+3t2-a)  σ3=3i2

2 階微分方程式 (x2-1)22x2y(x)+(x+1)xy(x)-y(x)=0 を解きます。dsolve は未評価の積分の項を含む解を返します。

syms y(x)
eqn = (x^2-1)^2*diff(y,2) + (x+1)*diff(y) - y == 0;
S = dsolve(eqn)
S = 

C2x+1+C1x+1e12x-11-x1/4x+19/4dxC2*(x + 1) + C1*(x + 1)*int(((exp((1/(2*(x - 1))))*(1 - x)^sym(1/4))/(x + 1)^sym(9/4)), x, 'IgnoreSpecialCases', true, 'IgnoreAnalyticConstraints', true)

x=-1 の場合の微分方程式の級数解を返すには、'ExpansionPoint'-1 に設定します。dsolve はピュイズー級数で 2 つの線形独立解を返します。

S = dsolve(eqn,'ExpansionPoint',-1)
S = 

(x+11x+11/4-5x+13/44+5x+17/448+5x+111/4336+115x+115/433792+169x+119/4184320)[x + 1; 1/(x + 1)^sym(1/4) - (5*(x + 1)^sym(3/4))/4 + (5*(x + 1)^sym(7/4))/48 + (5*(x + 1)^sym(11/4))/336 + (115*(x + 1)^sym(15/4))/33792 + (169*(x + 1)^sym(19/4))/184320]

'ExpansionPoint'Inf に設定して、展開点 の場合の他の級数解を求めます。

S = dsolve(eqn,'ExpansionPoint',Inf)
S = 

(x-16x2-18x416x2+18x4+190x5+1)[x - 1/(6*x^2) - 1/(8*x^4); 1/(6*x^2) + 1/(8*x^4) + 1/(90*x^5) + 1]

級数展開の既定の打ち切り階数は 6 です。ピュイズー級数解の項をさらに取得するには、'Order' を 8 に設定します。

S = dsolve(eqn,'ExpansionPoint',Inf,'Order',8)
S = 

(x-16x2-18x4-190x5-37336x616x2+18x4+190x5+37336x6+371680x7+1)[x - 1/(6*x^2) - 1/(8*x^4) - 1/(90*x^5) - 37/(336*x^6); 1/(6*x^2) + 1/(8*x^4) + 1/(90*x^5) + 37/(336*x^6) + 37/(1680*x^7) + 1]

初期条件を指定せずに微分方程式 dydx=1x2e-1x を解きます。

syms y(x)
eqn = diff(y) == exp(-1/x)/x^2;
ySol(x) = dsolve(eqn)
ySol(x) = 

C1+e-1xC1 + exp((-1/x))

解から定数を消去するには、初期条件 y(0)=1. を指定します。

cond = y(0) == 1;
S = dsolve(eqn,cond)
S = 

e-1x+1exp((-1/x)) + 1

ySol(x) 内の関数 e-1x には x=0 で異なる一方向の極限があります。この関数には右側に極限 limx0+e-1x=0 がありますが、左側に未定義の極限 limx0-e-1x= があります。

x0 で異なる一方向の極限をもつ関数に条件 y(x0) を指定すると、dsolve はこの条件を右側の limxx0+ からの極限として扱います。

入力引数

すべて折りたたむ

微分方程式または方程式系。シンボリック方程式またはシンボリック方程式のベクトルとして指定します。== 演算子を使用して、微分方程式を指定します。eqn がシンボリック式 (右辺なし) の場合、ソルバーは右辺が 0 であると仮定し、方程式 eqn == 0 の解を求めます。

方程式では、diff を使用して、微分を表現します。たとえば、diff(y,x) はシンボリック関数 y(x)x で微分します。syms を使用してシンボリック関数 y(x) を作成し、dsolve を使用して方程式 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 は内部単純化を適用しません。

ピュイズー級数の解の展開点。数値あるいはシンボリック数、変数、関数または式として指定します。このオプションを指定すると、ピュイズー級数で微分方程式の解が返されます (負および非整数の指数を許容するべき級数)。展開点は級数変数では変更できません。例については、微分方程式の級数解の求解を参照してください。

データ型: single | double | sym
複素数のサポート: あり

内部単純化を使用するオプション。true または false として指定します。

既定の設定では、ソルバーは微分方程式を解きながら単純化を適用します。この単純化は、常に効果があるとは限りません。したがって、既定の設定では、ソルバーは結果の完全性を保証しません。'IgnoreAnalyticConstraints'true の場合は、関数 dsolve で返される結果を必ず検証してください。詳細については、アルゴリズムを参照してください。

これらの単純化を使用せずに常微分方程式を解くには、'IgnoreAnalyticConstraints'false に設定します。'IgnoreAnalyticConstraints'false に設定して得られた結果は、引数のすべての値に対して正確です。特定の方程式の場合、'IgnoreAnalyticConstraints'false に設定すると、dsolve は陽的な解を返さない可能性があります。

陰的な解を返すオプション。false または true として指定します。変数 x および y(x) をもつ微分方程式に対して、陰的な解は F(y(x)) = g(x) の形式をとります。

既定では、微分方程式の解を求めるときにソルバーは陽的な解 y(x) = f(x) を解析的に求めようとします。dsolve が陽的な解を見つけられなかった場合、'Implicit' オプションを true に指定して、陰的な形式で解を調べることができます。

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

ピュイズー級数解の打ち切り階数。正の整数またはシンボリックな正の整数として指定します。このオプションを指定すると、ピュイズー級数で微分方程式の解が返されます (負および非整数の指数を許容するべき級数)。打ち切り階数 n は、OO(varn) or O(varn) の指数です。

出力引数

すべて折りたたむ

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

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

ヒント

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

  • 'IgnoreAnalyticConstraints'false の場合であっても、dsolve が完全な解を返すとは限りません。

  • dsolvex0 で異なる一方向の極限をもつ関数を返し、条件 y(x0) を指定する場合、dsolve はこの条件を右側の limxx0+  からの極限として扱います。

アルゴリズム

'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)) = xacos(cos(x)) = xatan(tan(x)) = x

    • asinh(sinh(x)) = xacosh(cosh(x)) = xatanh(tanh(x)) = x

    • ランベルトのW関数のすべての分岐指標 k に対して、Wk(x·ex) = x

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

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

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

すべて展開する

R2019b 以降は警告

R2006a より前に導入