Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

dsolve

微分方程式系の求解

文字ベクトルまたは string 入力に対するサポートは将来のリリースで削除される予定です。代わりに、symsを使用して変数を宣言し、dsolve('Dy = -3*y')などの入力をsyms y(t); dsolve(diff(y,t) == -3*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 階微分方程式 dy dt = ay を解きます。

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

symsy(t)aeqn = diff(y,t) == a*y; S = dsolve(eqn)
S =
                       
                        
                         
                          
                           
                            
                             
                              C
                            
                            
                             
                              1
                            
                           
                           
                           
                           
                            
                             
                              e
                            
                            
                             
                              
                               
                                a
                               
                               
                               
                                t
                              
                             
                            
                           
                          
                         
                         
                          C1*exp((a*t))
                        
                       

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

2 階微分方程式 d 2 y dt 2 = ay を解きます。

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

symsy(t)aeqn = diff(y,t,2) == a*y; ySol(t) = dsolve(eqn)
ySol(t) =
                       
                        
                         
                          
                           
                            
                             
                              
                               
                                C
                              
                              
                               
                                1
                              
                             
                             
                             
                             
                              
                               
                                e
                              
                              
                               
                                
                                 
                                  -
                                 
                                  
                                   
                                    
                                     
                                      a
                                    
                                   
                                   
                                   
                                   
                                    t
                                  
                                 
                                
                               
                              
                             
                            
                           
                           
                            +
                           
                            
                             
                              
                               
                                C
                              
                              
                               
                                2
                              
                             
                             
                             
                             
                              
                               
                                e
                              
                              
                               
                                
                                 
                                  
                                   
                                    a
                                  
                                 
                                 
                                 
                                 
                                  t
                                
                               
                              
                             
                            
                           
                          
                         
                         
                          c1*exp(( -  sqrt(a)*t)) + c2*exp((sqrt(a)*t))
                        
                       

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

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

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

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

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

symsy(t)abeqn = 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) =

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

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

微分方程式系の求解

dy dt = z dz dt = - y .

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

symsy(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) =
                       
                        
                         
                          
                           
                            
                             
                              
                               
                                C
                              
                              
                               
                                1
                              
                             
                             
                             
                             
                              
                               
                                cos
                              
                              
                               
                                (
                               
                                
                                 
                                  t
                                
                               
                               
                                )
                              
                             
                            
                           
                           
                            +
                           
                            
                             
                              
                               
                                C
                              
                              
                               
                                2
                              
                             
                             
                             
                             
                              
                               
                                sin
                              
                              
                               
                                (
                               
                                
                                 
                                  t
                                
                               
                               
                                )
                              
                             
                            
                           
                          
                         
                         
                          C1*cos(t) + C2*sin(t)
                        
                       
zSol(t) = S.z
zSol(t) =
                       
                        
                         
                          
                           
                            
                             
                              
                               
                                C
                              
                              
                               
                                2
                              
                             
                             
                             
                             
                              
                               
                                cos
                              
                              
                               
                                (
                               
                                
                                 
                                  t
                                
                               
                               
                                )
                              
                             
                            
                           
                           
                            -
                           
                            
                             
                              
                               
                                C
                              
                              
                               
                                1
                              
                             
                             
                             
                             
                              
                               
                                sin
                              
                              
                               
                                (
                               
                                
                                 
                                  t
                                
                               
                               
                                )
                              
                             
                            
                           
                          
                         
                         
                          C2*cos(t) - C1*sin(t)
                        
                       

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

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

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

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

symsy(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 =
                       
                        
                         
                          
                           
                            
                             
                              
                               
                                W
                              
                              
                               
                                lambertw
                               
                              
                             
                            
                            
                             
                              0
                            
                           
                           
                            
                             (
                            
                             
                              
                               
                                -
                               
                                1
                              
                             
                            
                            
                             )
                           
                          
                         
                         
                          lambertw(sym(0), -1)
                        
                       

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

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

( e y y e y + 1 d y | y = y ( t ) = C 1 + t e - y ( t ) e y ( 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は空のシンボリック配列を返します。数值など、MATLAB® 数値ソルバーを使用して微分方程式を解くことができます。詳細については、2 階微分方程式の数値的な求解を参照してください。

symsy(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 =

e y ( x ) + y ( x ) 2 2 = C 1 + e - x + x 2 2 exp(y(x)) + y(x)^2/2 == C1 + exp((-x)) + x^2/2

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

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

e 3 t 2 - 3 a 2 + log ( a + 1 ) - a 2 / 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 + e 3 t 2 - 3 a 2 + log ( a + - 1 2 + σ 3 3 / 2 ) + 2 π C 2 i 2 / 3 1 2 + σ 3 } if σ 2 - π 2 if C 2 Z if C 2 Z where σ 1 = - a + e 3 t 2 - 3 a 2 + log ( a + 1 ) + 2 π C 2 i 2 / 3 σ 2 = angle ( e 3 C 1 2 + 3 t 2 - a ) σ 3 = 3 i 2

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

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

C 2 x + 1 + C 1 x + 1 e 1 2 x - 1 1 - x 1 / 4 x + 1 9 / 4 d x C2*(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 + 1 1 x + 1 1 / 4 - 5 x + 1 3 / 4 4 + 5 x + 1 7 / 4 48 + 5 x + 1 11 / 4 336 + 115 x + 1 15 / 4 33792 + 169 x + 1 19 / 4 184320 ) [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 - 1 6 x 2 - 1 8 x 4 1 6 x 2 + 1 8 x 4 + 1 90 x 5 + 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 - 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 ) [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]

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

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

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

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

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

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

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

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

入力引数

すべて折りたたむ

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

方程式では,diffを使用して、微分を表現します。たとえば、diff(y,x)はシンボリック関数y(x)xで微分します。symsを使用してシンボリック関数y(x)を作成し、dsolveを使用して方程式d2y(x)/dx2* y = x (x)を解きます。

symsy(x)S = dsolve(diff(y,x,2) == x*y)

信谊y (t) z (t);S = dsolve ([diff (y, t) == z, diff(z,t) == -y])のように方程式のベクトルを使用して微分方程式系を指定します。ここで、yzは、シンボリック変数 (この場合はt) に依存するシンボリック関数でなければなりません。右辺は、ty、およびzに依存するシンボリック式でなければなりません。Symbolic Math Toolbox™ は現在、合成シンボリック関数、つまり別のシンボリック関数に依存するシンボリック関数をサポートしていないことに注意してください。

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

条件に導関数が含まれる場合、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は、O項 ( O ( var n ) または O ( var n ) ) の指数です。

出力引数

すべて折りたたむ

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

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

ヒント

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

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

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

アルゴリズム

'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

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

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

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

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

すべて展開する

R2019b 以降は警告

R2006a より前に導入