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

solve

方程式と方程式系のソルバー

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

説明

S = solve(eqn,var) は、変数 var について方程式 eqn を解きます。var を指定しない場合、求める変数は関数 symvar によって決定されます。たとえば、solve(x + 1 == 2, x) は方程式 x + 1 = 2 を解いて x を求めます。

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

Y = solve(eqns,vars) は、変数 vars について方程式系 eqns を解き、その解を含む構造体を返します。vars を指定しない場合、solvesymvar を使用して求める変数を見つけます。この場合、symvar が求める変数の数は、方程式の数 eqns の数に等しくなります。

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

[y1,...,yN] = solve(eqns,vars) は、変数 vars について方程式系 eqns を求めます。解は変数 y1,...,yN に代入されます。変数を指定しない場合、solvesymvar を使用して求める変数を見つけます。この場合、symvar が求める変数の数は、出力引数 N の数に等しくなります。

[y1,...,yN] = solve(eqns,vars,Name,Value) は、1 つ以上の Name,Value の引数ペアによって指定された追加オプションを使用します。

[y1,...,yN,parameters,conditions] = solve(eqns,vars,'ReturnConditions',true) は、解のパラメーターと条件を指定する追加の引数 parameters および conditions を返します。

すべて折りたたむ

変数を指定せずに 2 次方程式を解きます。solve は、x を選択して解を返します。

syms a b c x
eqn = a*x^2 + b*x + c == 0
eqn = ax2+bx+c=0a*x^2 + b*x + c == 0
S = solve(eqn)
S = 

(-b+b2-4ac2a-b-b2-4ac2a)[-(b + sqrt(b^2 - 4*a*c))/(2*a); -(b - sqrt(b^2 - 4*a*c))/(2*a)]

解を求める変数を指定し、a の二次方程式を解きます。

Sa = solve(eqn,a)
Sa = 

-c+bxx2-(c + b*x)/x^2

5 次多項式を解きます。5 つの解があります。

syms x
eqn = x^5 == 3125;
S = solve(eqn,x)
S = 

(5-σ1-54-525-5i4-σ1-54+525-5i4σ1-54-525+5i4σ1-54+525+5i4)where  σ1=554[sym(5); - (5*sqrt(sym(5)))/4 - sym(5/4) - (5*sqrt(sym(2))*sqrt(5 - sqrt(sym(5)))*sym(1i))/4; - (5*sqrt(sym(5)))/4 - sym(5/4) + (5*sqrt(sym(2))*sqrt(5 - sqrt(sym(5)))*sym(1i))/4; (5*sqrt(sym(5)))/4 - sym(5/4) - (5*sqrt(sym(2))*sqrt(sqrt(sym(5)) + 5)*sym(1i))/4; (5*sqrt(sym(5)))/4 - sym(5/4) + (5*sqrt(sym(2))*sqrt(sqrt(sym(5)) + 5)*sym(1i))/4]

'Real' オプションを true に設定して実数解のみを返します。この方程式の唯一の実数解は 5 です。

S = solve(eqn,x,'Real',true)
S = 5sym(5)

方程式をシンボリックに解くことができない場合、solvevpasolve を使用して数値解を求めようとします。関数 vpasolve は求められた最初の解を返します。

次の方程式を解いてみます。solve は、シンボリック解を求めることができないため、数値解を返します。

syms x
eqn = sin(x) == x^2 - 1;
S = solve(eqn,x)
Warning: Unable to solve symbolically. Returning a numeric solution using <a href="matlab:web(fullfile(docroot, 'symbolic/vpasolve.html'))">vpasolve</a>.
S = -0.63673265080528201088799090383828-vpa('0.63673265080528201088799090383828')

方程式の左辺と右辺をプロットします。方程式が 1 つの正の解を持つことも確認します。

fplot([lhs(eqn) rhs(eqn)], [-2 2])

数値ソルバー vpasolve を直接呼び出して、区間を指定して別の解を求めます。

V = vpasolve(eqn,x,[0 2])
V = 1.4096240040025962492355939705895vpa('1.4096240040025962492355939705895')

複数の変数について解を求めるとき、その出力を個々の変数に保存するより、構造体配列に保存するほうがより便利な場合があります。単一の出力引数を指定し、複数の出力が存在する場合、関数 solve は構造体を返します。

方程式系の解を求め、構造体配列として解を返します。

syms u v
eqns = [2*u + v == 0, u - v == 1];
S = solve(eqns,[u v])
S = struct with fields:
    u: [1x1 sym]
    v: [1x1 sym]

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

S.u
ans = 

13sym(1/3)

S.v
ans = 

-23-sym(2/3)

構造体配列を使用することで、他の式への解の代入が簡単になります。

関数 subs を使用して解 S を他の式に代入します。

expr1 = u^2;
e1 = subs(expr1,S)
e1 = 

19sym(1/9)

expr2 = 3*v + u;
e2 = subs(expr2,S)
e2 = 

-53-sym(5/3)

solve が空のオブジェクトを返した場合、解は存在しません。

eqns = [3*u+2, 3*u+1];
S = solve(eqns,u)
 
S =
 
Empty sym: 0-by-1
 

関数 solve は、不等式を解き、その不等式を満たす解を返すことができます。次の不等式を解きます。

x>0

y>0

x2+y2+xy<1

'ReturnConditions'true に設定して、解のパラメーターおよび条件をすべて返します。

syms x y
eqn1 = x > 0;
eqn2 = y > 0;
eqn3 = x^2 + y^2 + x*y < 1;
eqns = [eqn1 eqn2 eqn3];

S = solve(eqns,[x y],'ReturnConditions',true);
S.x
ans = 

u-3v22-v2sqrt(u - 3*v^2)/2 - v/2

S.y
ans = vv
S.parameters
ans = (uv)[u, v]
S.conditions
ans = 4v2<uu<40<v4*v^2 < u&u < 4&0 < v

パラメーター u および v は MATLAB® ワークスペースには存在しないため、S.parameters を使用してアクセスしなければなりません。

subsisAlways を使用して、値 u = 7/2 および v = 1/2 が条件を満たしているかチェックします。

condWithValues = subs(S.conditions, S.parameters, [7/2,1/2]);
isAlways(condWithValues)
ans = logical
   1

isAlways は logical 1 (true) を返し、これらの値が条件を満たすことを示します。これらのパラメーター値を S.x および S.y に代入して、x および y の解を求めます。

xSol = subs(S.x, S.parameters, [7/2,1/2])
xSol = 

114-14sqrt(sym(11))/4 - sym(1/4)

ySol = subs(S.y, S.parameters, [7/2,1/2])
ySol = 

12sym(1/2)

方程式系を解きます。

2u2+v2=0

u-v=1

複数の変数を求解する場合、変数が指定される順序によって、ソルバーが解を返す順序が決まります。変数を明示的に指定して、解を変数 solv および solu に代入します。ソルバーは、それぞれの変数の解の配列を返します。

syms u v
eqns = [2*u^2 + v^2 == 0, u - v == 1];
vars = [v u];
[solv, solu] = solve(eqns,vars)
solv = 

(-23-2i3-23+2i3)[- sym(2/3) - (sqrt(sym(2))*sym(1i))/3; - sym(2/3) + (sqrt(sym(2))*sym(1i))/3]

solu = 

(13-2i313+2i3)[sym(1/3) - (sqrt(sym(2))*sym(1i))/3; sym(1/3) + (sqrt(sym(2))*sym(1i))/3]

解のペアは、同じインデックス番号の要素として構成されます。

solutions = [solv solu]
solutions = 

(-23-2i313-2i3-23+2i313+2i3)[- sym(2/3) - (sqrt(sym(2))*sym(1i))/3, sym(1/3) - (sqrt(sym(2))*sym(1i))/3; - sym(2/3) + (sqrt(sym(2))*sym(1i))/3, sym(1/3) + (sqrt(sym(2))*sym(1i))/3]

'ReturnConditions'true に指定して、方程式の完全な解を、解のパラメーターと条件を含めて返します。

方程式 sin(x)=0 を解きます。出力引数 parameters および conditions 用に 2 つの追加の出力変数を指定します。

syms x
eqn = sin(x) == 0;
[solx,parameters,conditions] = solve(eqn,x,'ReturnConditions',true)
solx = πksym(pi)*k
parameters = kk
conditions = kZin(k, 'integer')

πk にはパラメーター k が含まれています。ここで、k は整数でなければなりません。変数 k は MATLAB® ワークスペースには存在しないため、parameters を使用してアクセスしなければなりません。

解を 0<x<2π に制限します。この制限に対して有効な k の値を求めます。条件 conditions を仮定し、solve を使用して k を求めます。求められた k の値を x の解に代入します。

assume(conditions)
restriction = [solx > 0, solx < 2*pi];
solk = solve(restriction,parameters)
solk = 1sym(1)
valx = subs(solx,parameters,solk)
valx = πsym(pi)

または、k の値を選択することによって x の解を決定します。isAlways を使用して、選択した値が k の条件を満たしているかチェックします。

k=4k の条件を満たしているかチェックします。

condk4 = subs(conditions,parameters,4);
isAlways(condk4)
ans = logical
   1

isAlways は logical 1 (true) を返し、4 が k の有効な値であることを示します。4 を k に代入して x の解を求めます。vpa を使用して数値近似を取得します。

valx = subs(solx,parameters,4)
valx = 4π4*sym(pi)
vpa(valx)
ans = 12.566370614359172953850573533118vpa('12.566370614359172953850573533118')

方程式 exp(log(x)log(3x))=4 を解いてみます。既定では、solve は数学的に正しくない可能性のある単純化を適用しません。そのため、solve はこの方程式をシンボリックに解くことができません。

syms x
eqn = exp(log(x)*log(3*x)) == 4;
S = solve(eqn,x)
Warning: Unable to solve symbolically. Returning a numeric solution using <a href="matlab:web(fullfile(docroot, 'symbolic/vpasolve.html'))">vpasolve</a>.
S = -14.009379055223370038369334703094-2.9255310052111119036668717988769i- vpa('14.009379055223370038369334703094') - vpa('2.9255310052111119036668717988769i')

'IgnoreAnalyticConstraints'true に設定して、solve で求解できる可能性のある単純化ルールを適用します。詳細については、アルゴリズムを参照してください。

S = solve(eqn,x,'IgnoreAnalyticConstraints',true)
S = 

(3e-log(256)+log(3)2233elog(256)+log(3)223)[(sqrt(sym(3))*exp((-sqrt(log(sym(256)) + log(sym(3))^2)/2)))/3; (sqrt(sym(3))*exp((sqrt(log(sym(256)) + log(sym(3))^2)/2)))/3]

solve は、ソルバーの求解を可能にする単純化を適用します。単純化を行う場合に適用される数学的ルールは必ずしも一般的に有効であるとは限りません。したがって、このモードにおける解は正しくなかったり完全ではなかったりする可能性があるため、検証する必要があります。

関数 sym および関数 syms では、シンボリック変数の仮定を設定できます。

変数 x が正の数であると仮定します。

syms x positive

仮定をもつ変数について方程式を解く場合、ソルバーは仮定と矛盾のない解のみを返します。x について、次の方程式を解きます。

eqn = x^2 + 5*x - 6 == 0;
S = solve(eqn,x)
S = 1sym(1)

'IgnoreProperties'true に設定して、仮定を満たさない解を可とします。

S = solve(eqn,x,'IgnoreProperties',true)
S = 

(-61)[-sym(6); sym(1)]

計算を続けるため、syms を使用して仮定を再作成することで、変数 x に設定された仮定を消去します。

syms x

多項方程式を解く場合、解を返すためにソルバーで root が使用される場合があります。3 次多項式を解きます。

syms x a
eqn = x^3 + x^2 + a == 0;
solve(eqn, x)
ans = 

(root(z3+z2+a,z,1)root(z3+z2+a,z,2)root(z3+z2+a,z,3))[root(z^3 + z^2 + a, z, 1); root(z^3 + z^2 + a, z, 2); root(z^3 + z^2 + a, z, 3)]

'MaxDegree' をもつソルバーの呼び出しにより、このような方程式について陽的な解の取得を試みます。このオプションでは、ソルバーで陽的な解が返されるように、多項式の最大次数が指定されます。既定値は、2 です。この値を増やすと、より高階数の多項式の陽的な解を得ることができます。

'MaxDegree' の値を 3 に増やすことで、同じ方程式を陽的な解について解きます。

S = solve(eqn, x, 'MaxDegree', 3)
S = 

(19σ1+σ1-13-118σ1-σ12-13-319σ1-σ1i2-118σ1-σ12-13+319σ1-σ1i2)where  σ1=a2+1272-1729-a2-1271/3[1/(9*(sqrt((a/2 + sym(1/27))^2 - sym(1/729)) - a/2 - sym(1/27))^sym(1/3)) + (sqrt((a/2 + sym(1/27))^2 - sym(1/729)) - a/2 - sym(1/27))^sym(1/3) - sym(1/3); - 1/(18*(sqrt((a/2 + sym(1/27))^2 - sym(1/729)) - a/2 - sym(1/27))^sym(1/3)) - (sqrt((a/2 + sym(1/27))^2 - sym(1/729)) - a/2 - sym(1/27))^sym(1/3)/2 - sym(1/3) - (sqrt(sym(3))*(1/(9*(sqrt((a/2 + sym(1/27))^2 - sym(1/729)) - a/2 - sym(1/27))^sym(1/3)) - (sqrt((a/2 + sym(1/27))^2 - sym(1/729)) - a/2 - sym(1/27))^sym(1/3))*sym(1i))/2; - 1/(18*(sqrt((a/2 + sym(1/27))^2 - sym(1/729)) - a/2 - sym(1/27))^sym(1/3)) - (sqrt((a/2 + sym(1/27))^2 - sym(1/729)) - a/2 - sym(1/27))^sym(1/3)/2 - sym(1/3) + (sqrt(sym(3))*(1/(9*(sqrt((a/2 + sym(1/27))^2 - sym(1/729)) - a/2 - sym(1/27))^sym(1/3)) - (sqrt((a/2 + sym(1/27))^2 - sym(1/729)) - a/2 - sym(1/27))^sym(1/3))*sym(1i))/2]

方程式 sin(x)+cos(2x)=1 を解きます。

周期解の無限集合を返す代わりに、ソルバーでは最も実用的と見なされる 3 つの解が選択されます。

syms x
eqn = sin(x) + cos(2*x) == 1;
S = solve(eqn,x)
S = 

(0π65π6)[sym(0); sym(pi)/6; (5*sym(pi))/6]

'PrincipalValue'true に設定して唯一の解を選択します。

S1 = solve(eqn,x,'PrincipalValue',true)
S1 = 0sym(0)

入力引数

すべて折りたたむ

求解する方程式。シンボリック式またはシンボリック方程式として指定します。関係演算子 == によって、シンボリック方程式を定義します。eqn がシンボリック式 (右辺なし) の場合、ソルバーは右辺が 0 であると仮定し、方程式 eqn == 0 の解を求めます。

方程式で求解される変数。シンボリック変数として指定します。既定では、solvesymvar によって決定された変数を使用します。

方程式系。シンボリック式またはシンボリック方程式として指定します。eqns の要素が 1 つでもシンボリック式 (右辺をもたない) であれば、solve は要素を 0 に等しいとします。

方程式または方程式系で求解される変数。シンボリック変数として指定します。既定では、solvesymvar によって決定された変数を使用します。

これらの変数が指定される順序によって、ソルバーが解を返す順序が決まります。

名前と値のペアの引数

例: 'Real',true を指定するとソルバーは実数解を返します。

このフラグは 'Real' および以下の値のいずれかで構成され、コンマ区切りペアとして指定すると、実数解のみを返します。

falseすべての解を返します。
true元の方程式の部分式がすべて実数を表すような解のみを返します。また、このオプションでは、方程式のシンボリック パラメーターはすべて実数を表すことが仮定されます。

多項式を解き実数解を返すを参照してください。

解のパラメーターおよび解が成立するために必要な条件を返す際のフラグ。'ReturnConditions' とこれらの値のいずれかから成るコンマ区切りのペアとして指定します。

falseパラメーター化された解およびその解の成立条件を返しません。関数 solve は適切な値でパラメーターを置き換えます。
true解のパラメーターと解の成立条件を返します。単一の出力変数をもつ呼び出しに対して、solveparameters および conditions のフィールドをもつ構造体を返します。複数出力の変数に対しては、solve はパラメーターおよび条件を最後の 2 つの出力変数に割り当てます。これは、出力変数の数は求める変数の数に 2 を足したものと等しくなければならないことを意味します。

不等式の求解を参照してください。

例: [v1, v2, params, conditions] = solve(sin(x) +y == 0,y^2 == 3,'ReturnConditions',true) はパラメーターを params に、条件を conditions に返します。

式および方程式に適用される単純化ルール。'IgnoreAnalyticConstraints' およびこれらの値のいずれかにより成るコンマ区切りペアとして指定します。

false厳格な単純化ルールを使用します。
true純粋に代数的な単純化を式および方程式に適用します。IgnoreAnalyticConstraintstrue に設定すると、ソルバーを直接使用する場合に複雑な結果が返されるような方程式に対して、単純な解が得られます。場合によっては、他の方法では解けない方程式や方程式系の解を solve で求められるようにもなります。ただし、IgnoreAnalyticConstraintstrue に設定すると、結果が誤りがあったり、不完全になったりすることがあります。

単純化ルールによる結果の効率化を参照してください。

変数のプロパティと不整合な解を返すためのフラグ。'IgnoreProperties' およびこれらの値のいずれかから成るコンマ区切りのペアで指定します。

false変数のプロパティと不整合な解を含めません。
true変数のプロパティと不整合な解を含めます。

変数についての仮定の無視を参照してください。

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

高階数多項方程式の求解を参照してください。

1 つの解を返すフラグ。'PrincipalValue' およびこれらの値のいずれかから成るコンマ区切りのペアとして指定します。

falseすべての解を返します。
true1 つの解のみを返します。方程式または方程式系に解がない場合は、ソルバーによって空のシンボリック オブジェクトが返されます。

1 つの解を返すを参照してください。

出力引数

すべて折りたたむ

シンボリック配列として返される方程式の解。シンボリックな配列のサイズは、解の数と一致します。

構造体として返される方程式系の解。構造体のフィールド数は、方程式系の独立変数の数と一致します。'ReturnConditions'true に設定されている場合、関数 solve は解のパラメーターおよび解の成立条件を含む、2 つの追加フィールドを返します。

シンボリック変数として返される方程式系の解。出力変数またはシンボリックな配列の数は、方程式系の独立変数の数と等しくなければなりません。複数の独立変数 vars を陽的に指定すると、ソルバーは同じ順序で解を返します。vars を指定しない場合、ツールボックスは独立変数をアルファベット順に並べ替えてから、それらの変数の解を出力変数に代入します。

生成されたパラメーターのベクトルとして返される解のパラメーター。この出力引数は、ReturnConditionstrue の場合にのみ返されます。与えられた出力引数が 1 つの場合、parameters は構造体のフィールドとして返されます。複数の出力引数が与えられた場合、parameters は最後から 2 番目の出力引数として返されます。生成されたパラメーターは MATLAB® ワークスペースに表示されません。parameters を使用してアクセスする必要があります。

例: [solx, params, conditions] = solve(sin(x) == 0, 'ReturnConditions', true) は、パラメーター k を引数 params に返します。

解の成立条件。シンボリック式のベクトルとして返されます。この出力引数は、ReturnConditionstrue の場合にのみ返されます。与えられた出力引数が 1 つの場合、conditions は構造体のフィールドとして返されます。複数の出力引数が与えられた場合、conditions は最後の出力引数として返されます。

例: [solx, params, conditions] = solve(sin(x) == 0, 'ReturnConditions', true) は条件 in(k, 'integer')conditions に返します。solx の解はこの条件下でのみ有効です。

ヒント

  • solve で解を求められず ReturnConditionsfalse である場合、関数 solve は内部で数値ソルバー vpasolve を呼び出して数値解を求めようとします。シンボリック パラメーターを使用しない多項方程式や多項方程式系では、数値ソルバーによってすべての解が返されます。シンボリック パラメーターを使用しない非多項方程式や非多項方程式系の場合、数値ソルバーによって 1 つの解だけが返されます (解が存在する場合)。

  • solve で解を求められず ReturnConditionstrue である場合、solve は警告と共に空の解を返します。解が存在しない場合、solve は警告なしで空の解を返します。

  • 解にパラメーターが含まれており ReturnConditionstrue である場合、solve は解のパラメーターと解の成立条件を返します。ReturnConditionsfalse の場合、関数 solve はパラメーターの値を選択して対応する値を返すか、特定の値を選択せずにパラメーター化された解を返すかします。後者の場合、solve は警告を表示すると共に、返された解に含まれるパラメーターの値も示します。

  • いずれの条件にもパラメーターが含まれない場合、パラメーターは任意の複素値を取り得ることを意味します。

  • solve の出力には、solve によって生成されたパラメーターに加えて、入力方程式からのパラメーターが含まれる場合があります。

  • solve によって導入されたパラメーターは MATLAB ワークスペースに表示されません。パラメーターを含む出力引数を使用してアクセスする必要があります。または、MATLAB ワークスペースでパラメーターを使用するため、syms を使用してパラメーターを初期化します。たとえば、パラメーターが k の場合は、syms k を使用します。

  • 変数名 parameters および conditionssolve の入力として許可されていません。

  • 微分方程式の解を求めるには、dsolve 関数を使用します。

  • 方程式系の解を求めるときには、常に結果は出力引数に代入されます。出力引数を使用すれば、方程式系の解の値にアクセスできます。

  • MaxDegree では 5 より小さい正の整数のみを受け入れます。これは、一般的に、次数が 4 を超える多項式の根には陽的表現が存在しないからです。

  • 出力変数 y1,...,yN は、solve で方程式または方程式系を解く対象となる変数を指定しません。y1,...,yNeqns に含まれる変数であっても、solve(eqns) が正しい順序で y1,...,yN に解を代入する保証はありません。したがって、[b,a] = solve(eqns) を実行する際、a の解が b に代入されたり、その逆になる可能性もあります。

    返される解の順序を確定するには、変数 vars を指定します。たとえば、呼び出し [b,a] = solve(eqns,b,a) は、a の解を a に、b の解を b に代入します。

アルゴリズム

IgnoreAnalyticConstraints を使用する際は、ソルバーによって以下のルールが方程式の両辺に適用されます。

  • 任意の 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 を除く任意の式で方程式の両辺を乗算できる。

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

R2006a より前に導入