メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

solve

方程式と連立方程式のソルバー

説明

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=0
S = solve(eqn)
S = 

(-b+b2-4ac2a-b-b2-4ac2a)

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

Sa = solve(eqn,a)
Sa = 

-c+bxx2

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

Real 引数を true に設定して実数解のみを返します。この方程式の唯一の実数解は 5 です。

S = solve(eqn,x,Real=true)
S = 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

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

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

Figure contains an axes object. The axes object contains 2 objects of type functionline.

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

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

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

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

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

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

S.u
ans = 

13

S.v
ans = 

-23

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

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

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

19

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

-53

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

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

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-v2

S.y
ans = v
S.parameters
ans = (uv)
S.conditions
ans = 4v2<uu<40<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-14

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

12

連立方程式を解きます。

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)

solu = 

(13-2i313+2i3)

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

solutions = [solv solu]
solutions = 

(-23-2i313-2i3-23+2i313+2i3)

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

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

syms x
eqn = sin(x) == 0;
[solx,parameters,conditions] = solve(eqn,x,ReturnConditions=true)
solx = πk
parameters = k
conditions = kZ

π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 = 1
valx = subs(solx,parameters,solk)
valx = π

または、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π
vpa(valx)
ans = 12.5664

方程式 exp(log(x)log(3x))=4 を解きます。

シンボリック変数 x を定義する場合、この変数は既定で複素数値を表します。solve 関数は、x のすべての値に有効な数学的ルールまたは単純化のみを適用します。ソルバーは x が正の実数であると仮定しないため、対数恒等式 log(3x)=log(3)+log(x) は適用されません。そのため、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

solve でシンボリック解を求めることができる可能性のある数学的ルールを適用するには、名前と値の引数 IgnoreAnalyticConstraintstrue として指定します。詳細については、アルゴリズムを参照してください。

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

(3e-log(256)+log(3)2233elog(256)+log(3)223)

ここでは、solvex が正の実数であると仮定して、ソルバーの求解を可能にする対数恒等式を適用します。このような恒等式は必ずしも一般的に有効であるとは限らないため、ソルバーで制約が無視される場合は解を検証することをお勧めします。

解を検証するには、たとえば、元の方程式の x に 2 番目の解を代入します。isAlways を使用して、結果として得られた方程式が true となるかどうかをチェックします。

verifyeqn = subs(eqn,x,S(2))
verifyeqn = 

elog(3elog(256)+log(3)22)log(3elog(256)+log(3)223)=4

tf = isAlways(verifyeqn)
tf = logical
   1

solve 関数は、単純化した解を返さない場合があります。たとえば、方程式の解を求めます。

syms x
S = solve((sin(x) - 2*cos(x))/(sin(x) + 2*cos(x)) == 1/2, x)
S = 

(-log(--14037+4837i2)i-log(-14037+4837i2)i)

解を単純化するには simplify を使用します。

S = simplify(S)
S = 

(-log(37-137-637i)ilog(2)i-log(-14037+4837i)i2)

より多くのステップを指定した simplify を使用して、解をさらに単純化します。

S = simplify(S,Steps=50)
S = 

(atan(6)-ππ2-atan(1235)2)

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

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

syms x positive

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

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

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

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

(-61)

計算を続けるため、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))

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

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

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

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

(0π65π6)

PrincipalValuetrue に設定して唯一の解を選択します。

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

solve を使用して複数の変数をもつ方程式を解く場合、変数を指定する順序が解に影響する可能性があります。場合によっては、順序が異なると、解を求める方程式または連立方程式を満たす異なる解が得られる可能性があります。

2 つの未知数 a および b をもつ方程式の解を求めます。

syms a b
eqn = a*exp(1i*b) == 1
eqn = aebi=1

まず、解を求める変数を、a の後ろに b が続く順序で指定します。この解には、a を指数関数とし、b を任意の値とする 1 つの任意のパラメーターが含まれます。

[sola,solb,parameters,conditions] = solve(eqn,a,b,ReturnConditions=true)
sola = e-zi
solb = z
parameters = z
conditions = symtrue

次に、解を求める変数を、b の後ろに a が続く逆の順序で指定します。この解には、1 つの任意の非ゼロ パラメーターと 1 つの整数パラメーターが含まれます。b の解は対数関数に 2π の整数倍を加算したものであり、a は任意の非ゼロ値です。

[solb,sola,parameters,conditions] = solve(eqn,b,a,ReturnConditions=true)
solb = 

2πk-log(1z)i

sola = z
parameters = (kz)
conditions = kZz0

R2025a 以降

シンボリック関数またはその導関数が未知数であるシンボリック方程式を解くことができます。

たとえば、シンボリック関数 f(x) を含む 2 次方程式を作成します。solve を使用して f(x) を求めます。

syms f(x) b c
eq = f(x)*x^2 + b*x + c == 0;
fsol = solve(eq,f(x))
fsol = 

-c+bxx2

次に、シンボリック関数 θ(t) の三角関数を含む方程式を作成します。ReturnConditionstrue に設定されている solve を使用して θ(t) を求めます。

syms t theta(t)
eq = 3 == -9.8*sin(theta(t));
[thetasol,param,cond] = solve(eq,theta(t),ReturnConditions=true)
thetasol = 

(2πk-asin(1549)π+asin(1549)+2πk)

param = k
cond = 

(kZkZ)

次に、f(x) の導関数と変数 a について連立方程式を解きます。

syms f(x) a
eq1 = diff(f,x) == 3*a - 2*x;
eq2 = diff(f,x) == a + x^2;
[Df,asol] = solve([eq1 eq2],diff(f,x),a)
Df = 

3x22+x

asol = 

x22+x

出力 Dfdiff(f,x) の解を表します。この解から、dsolve を使用して f(x) の微分方程式を解くことができます。

fsol(x) = dsolve(diff(f,x) == Df)
fsol(x) = 

C1+x2x+12

入力引数

すべて折りたたむ

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

解を求める変数。シンボリック変数またはシンボリック関数 (R2025a 以降)として指定します。既定では、solvesymvar によって決定された変数を使用します。

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

解を求める変数。シンボリック ベクトル、シンボリック行列、または変数のコンマ区切りリストとして指定します。既定では、solvesymvar によって決定された変数を使用します。

これらの変数が指定される順序によって、ソルバーが解を返す順序が決まります。少数例ですが、順序が異なると、解を求める方程式または連立方程式を満たす異なる解が得られる可能性があります。

例: [x y z]

例: x,y,z

名前と値の引数

すべて折りたたむ

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

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

R2021a より前では、コンマを使用して名前と値の各ペアを区切り、Name を引用符で囲みます。

実数解のみを返すオプション。次の値のいずれかとして指定します。

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

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

解のパラメーターおよび解が成立するために必要な条件を返すオプション。次の値のいずれかとして指定します。

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

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

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

式および方程式に適用される単純化ルール。次の値のいずれかとして指定します。

false厳格な単純化ルールを使用します。
true純粋に代数的な単純化を式および方程式に適用します。IgnoreAnalyticConstraintstrue に設定することで解を単純化できますが、一般的に有効でない結果となる場合があります。つまり、このオプションは数学的恒等を適用します。便利ですが、変数が取り得るすべての値に対して結果が成り立つとは限りません。場合によっては、他の方法では解けない方程式や連立方程式の解を solve で求められるようにもなります。詳細については、アルゴリズムを参照してください。

数学的ルールの適用を参照してください。

変数のプロパティと整合しない解を返すオプション。次の値のいずれかとして指定します。

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

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

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

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

1 つの解を返すオプション。次の値のいずれかとして指定します。

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

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

出力引数

すべて折りたたむ

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

構造体として返される連立方程式の解。構造体のフィールド数は、方程式の独立変数の数と一致します。ReturnConditionstrue に設定されている場合、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 は最後の出力引数として返されます。

例: syms x; [solx, params, conditions] = solve(sin(x) == 0, ReturnConditions=true) は、条件 in(k, 'integer')conditions に返します。solx の解は、k が整数であるという条件下でのみ有効です。

ヒント

  • 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) が成り立つ。特に、abc のすべての値に対して、次の等式が有効である。

    (a·b)c = ac·bc.

  • 任意の a および b について、log(ab) = b·log(a) が成り立つ。特に、abc のすべての値に対して、次の等式が有効である。

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

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

バージョン履歴

R2006a より前に導入

すべて展開する