最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。
方程式と方程式系のソルバー
文字ベクトル入力は削除されました。代わりに、syms
を使用して変数を宣言し、solve('2*x == 1','x')
などの入力を solve(2*x == 1,x)
で置き換えます。
は、1 つ以上の S
= solve(eqn
,var
,Name,Value
)Name,Value
引数のペアによって指定された追加オプションを使用します。
は、1 つ以上の Y
= solve(eqns
,vars
,Name,Value
)Name,Value
の引数ペアによって指定された追加オプションを使用します。
[
は、1 つ以上の y1,...,yN
] = solve(eqns
,vars
,Name,Value
)Name,Value
の引数ペアによって指定された追加オプションを使用します。
[
は、解のパラメーターと条件を指定する追加の引数 y1,...,yN
,parameters
,conditions
]
= solve(eqns
,vars
,'ReturnConditions
',true)parameters
および conditions
を返します。
演算子 ==
を使用して、方程式 sin(x) == 1
を指定して求解します。
syms x eqn = sin(x) == 1; solx = solve(eqn,x)
solx = pi/2
オプション ReturnConditions
を true
に設定して同じ方程式の完全解を求めます。解、解のパラメーターおよび解の条件のための出力変数を指定します。
[solx, params, conds] = solve(eqn, x, 'ReturnConditions', true)
solx = pi/2 + 2*pi*k params = k conds = in(k, 'integer')
解 pi/2 + 2*pi*k
にはパラメーター k
が含まれ、in(k, 'integer')
の条件下において有効です。これの条件は、パラメーター k
が整数でなければならないことを意味します。
solve
が空のオブジェクトを返した場合、解は存在しません。solve
が空のオブジェクトを警告と共に返したときは、解が存在する可能性はありますが、solve
で解が 1 つも求まらなかった場合です。
eqns = [3*x+2, 3*x+1]; solve(eqns, x)
ans = Empty sym: 0-by-1
ReturnConditions
を true
に指定して、解のパラメーターと条件を含む方程式の完全な解を返します。
方程式 sin(x) = 0 を解きます。出力引数 parameters
と conditions
のための追加の出力変数を指定します。
syms x eqn = sin(x) == 0; [solx, param, cond] = solve(eqn, x, 'ReturnConditions', true)
solx = pi*k param = k cond = in(k, 'integer')
解 pi*k
にはパラメーター k
が含まれ、in(k,'integer')
の条件下において有効です。この条件は、パラメーター k
が整数でなければならないことを意味します。k
は MATLAB® ワークスペースには存在しないため、param
を使用してアクセスする必要があります。
条件 cond
を仮定し、solve
を使用して k
のこれらの条件を求めて、0 < x < 2*pi
における k
の有効な値を求めます。求められた k
の値を x
の解に代入します。
assume(cond) interval = [solx > 0, solx < 2*pi]; solk = solve(interval, param) valx = subs(solx, param, solk)
solk = 1 valx = pi
0 < x < 2*pi
における k
の有効な値は 1
です。これにより、値 x = pi
が求まります。
または、k
の値を選択することによって x
の解を求めます。isAlways
を使用して、選択した値が k
の条件を満たしているかチェックします。
k = 4
が k
の条件を満たしているかチェックします。
condk4 = subs(cond, param, 4); isAlways(condk4)
ans = logical 1
isAlways
は論理値 1
(true
) を返し、4
が k
の有効な値であることを示します。k
を 4
に代入して x
の解を求めます。vpa
を使用して数値近似を求めます。
valx = subs(solx, param, 4) vpa(valx)
valx = 4*pi ans = 12.566370614359172953850573533118
方程式の解を求める変数を指定して、シンボリック パラメーターを使用して方程式の解を求める際のあいまいさを防ぎます。変数を指定しない場合、solve
は symvar
を使用して変数を選択します。最初に、変数を指定せずに 2 次方程式を解きます。solve
は、x を選択して通常の解を返します。次に a
について 2 次方程式を解き、a
の解を返します。
syms a b c x eqn = a*x^2 + b*x + c == 0; sol = solve(eqn) sola = solve(eqn, a)
sol = -(b + (b^2 - 4*a*c)^(1/2))/(2*a) -(b - (b^2 - 4*a*c)^(1/2))/(2*a) sola = -(c + b*x)/x^2
複数の変数を求解する場合、変数が指定される順序によって、ソルバーが解を返す順序が決まります。
変数を明示的に指定して、次の方程式系の解を求め、その解を変数 solv
および solu
に代入します。ソルバーは、それぞれの変数の解の配列を返します。
syms u v eqns = [2*u^2 + v^2 == 0, u - v == 1]; vars = [v u]; [solv, solu] = solve(eqns, vars)
solv = - (2^(1/2)*1i)/3 - 2/3 (2^(1/2)*1i)/3 - 2/3 solu = 1/3 - (2^(1/2)*1i)/3 (2^(1/2)*1i)/3 + 1/3
方程式系の解は、同じインデックス番号の要素として構成されます。
solutions = [solv solu]
solutions = [ - (2^(1/2)*1i)/3 - 2/3, 1/3 - (2^(1/2)*1i)/3] [ (2^(1/2)*1i)/3 - 2/3, (2^(1/2)*1i)/3 + 1/3]
この系の解は v = - (2^(1/2)*1i)/3 - 2/3
および u = 1/3 - (2^(1/2)*1i)/3
です。
複数の変数について解を求めるとき、その出力を個々の変数に保存するより、構造体配列に保存するほうがより便利な場合があります。1 つの出力引数を指定したときに複数の出力が存在すると、関数 solve
は構造体を返します。
方程式系の解を求め、構造体配列として解を返します。
syms u v eqns = [2*u + v == 0, u - v == 1]; S = solve(eqns, [u v])
S = struct with fields: u: [1×1 sym] v: [1×1 sym]
構造体の要素を指定して解にアクセスします。
S.u S.v
ans = 1/3 ans = -2/3
構造体配列を使用することで、解の式への代入が簡単になります。関数 subs
は、代入先の変数がいずれでも、正しい値を代入します。
構造体 S
を使用して、解を式に代入します。
expr1 = u^2; subs(expr1, S) expr2 = 3*v+u; subs(expr2, S)
ans = 1/9 ans = -5/3
ReturnConditions
を true
に指定して、解のパラメーターと条件を含む方程式系の完全な解を返します。
syms x y eqns = [sin(x)^2 == cos(y), 2*x == y]; S = solve(eqns, [x y], 'ReturnConditions', true); S.x S.y S.conditions S.parameters
ans = pi*k - asin(3^(1/2)/3) asin(3^(1/2)/3) + pi*k ans = 2*pi*k - 2*asin(3^(1/2)/3) 2*asin(3^(1/2)/3) + 2*pi*k ans = in(k, 'integer') in(k, 'integer') ans = k
解は S.x
、S.y
および S.conditions
の同じインデックスの要素によって形成されます。S.parameters
のどの要素もすべての解に表れる可能性があります。たとえば、ある解は x = pi*k - asin(3^(1/2)/3)
および y = 2*pi*k - 2*asin(3^(1/2)/3)
で、パラメーター k
をもち、条件 in(k, 'integer')
の下で有効です。この条件は、解が有効であるためにはパラメーター k
が整数でなければならないことを意味します。k
は MATLAB ワークスペースには存在しないため、S.parameters
を使用してアクセスする必要があります。
1 番目の解を求めるために、条件 S.conditions(1)
を仮定し、solve
を使用して k
のこれらの条件を求めて 0 < x < pi
における k
の有効な値を求めます。求められた k
の値を x
の解に代入します。
assume(S.conditions(1)) interval = [S.x(1)>0, S.x(1)<pi]; solk = solve(interval, S.parameters) solx = subs(S.x(1), S.parameters, solk)
solk = 1 solx = pi - asin(3^(1/2)/3)
0 < x < pi
における k
の有効な値は 1
です。これにより、値 x = pi - asin(3^(1/2)/3)
が求まります。
または、k
の値を選択することによって x
の解を求めます。isAlways
を使用して、選択した値が k
の条件を満たしているかチェックします。
k = 4
が k
の条件を満たしているかチェックします。
condk4 = subs(S.conditions(1), S.parameters, 4); isAlways(condk4)
ans = logical 1
isAlways
は論理値 1
(true
) を返し、4
が k
の有効な値であることを示します。k
を 4
に代入して x
の解を求めます。vpa
を使用して数値近似を求めます。
valx = subs(S.x(1), S.parameters, 4) vpa(valx)
valx = 4*pi - asin(3^(1/2)/3) ans = 11.950890905688785612783108943994
solve
が方程式をシンボリックに解くことができない場合、vpasolve
を使用して数値解を求めようとします。関数 vpasolve
は最初に求められた解を返します。
次の方程式を解いてみます。solve
は、シンボリックな解を求めることができないため、数値解を返します。
syms x eqn = sin(x) == x^2 - 1; solve(eqn, x)
Warning: Unable to solve symbolically. Returning a numeric solution using vpasolve. > In solve (line 304) ans = -0.63673265080528201088799090383828
方程式の左辺と右辺をプロットします。方程式が 1 つの正の解を持つことも確認します。
fplot([lhs(eqn) rhs(eqn)], [-2 2])
数値ソルバー vpasolve
を直接呼び出して、区間を指定してこの解を求めます。
vpasolve(eqn, x, [0 2])
ans = 1.4096240040025962492355939705895
solve
は、不等式を解いて不等式を満たす解を求めることができます。
次の不等式を解きます。ReturnConditions
を true
に設定し、解のすべてのパラメーターおよび条件を返すようにします。
syms x y cond1 = x^2 + y^2 + x*y < 1; cond2 = x > 0; cond3 = y > 0; conds = [cond1 cond2 cond3]; sol = solve(conds, [x y], 'ReturnConditions', true); sol.x sol.y sol.parameters sol.conditions
ans = (- 3*v^2 + u)^(1/2)/2 - v/2 ans = v ans = [ u, v] ans = 4*v^2 < u & u < 4 & 0 < v
パラメーター u
および v
は MATLAB ワークスペースには存在しないため、sol.parameters
を使用してアクセスする必要があります。
subs
と isAlways
を使用して、値 u = 7/2
および v = 1/2
が条件を満たすことをチェックします。
condWithValues = subs(sol.conditions, sol.parameters, [7/2,1/2]); isAlways(condWithValues)
ans = logical 1
isAlways
は論理 1
(true
) を返し、これらの値が条件を満たすことを示します。これらのパラメーター値を sol.x
および sol.y
に代入して、x
および y
の解を求めます。
xSol = subs(sol.x, sol.parameters, [7/2,1/2]) ySol = subs(sol.y, sol.parameters, [7/2,1/2])
xSol = 11^(1/2)/4 - 1/4 ySol = 1/2
vpa
を使用して、解を数値形式に変換します。
vpa(xSol) vpa(ySol)
ans = 0.57915619758884996227873318416767 ans = 0.5
次の方程式を解きます。5 つの解があります。
syms x eqn = x^5 == 3125; solve(eqn, x)
ans = 5 - (2^(1/2)*(5 - 5^(1/2))^(1/2)*5i)/4 - (5*5^(1/2))/4 - 5/4 (2^(1/2)*(5 - 5^(1/2))^(1/2)*5i)/4 - (5*5^(1/2))/4 - 5/4 (5*5^(1/2))/4 - (2^(1/2)*(5^(1/2) + 5)^(1/2)*5i)/4 - 5/4 (5*5^(1/2))/4 + (2^(1/2)*(5^(1/2) + 5)^(1/2)*5i)/4 - 5/4
引数 Real
を true
に設定して実数解のみを返します。この方程式の唯一の実数解は 5
です。
solve(eqn, x, 'Real', true)
ans = 5
次の方程式を解きます。周期解の無限集合を返す代わりに、ソルバーでは最も実用的と見なされる次の 3 つの解が選択されます。
syms x eqn = sin(x) + cos(2*x) == 1; solve(eqn, x)
ans = 0 pi/6 (5*pi)/6
PrincipalValue
を使用して 1 つの解だけを選択します。
eqn = sin(x) + cos(2*x) == 1; solve(eqn, x, 'PrincipalValue', true)
ans = 0
次の方程式を解いてみます。既定では、solve
は数学的に正しくない可能性のある単純化を適用しません。そのため、solve
はこの方程式をシンボリックに解くことができません。
syms x eqn = exp(log(x)*log(3*x)) == 4; solve(eqn, x)
Warning: Unable to solve symbolically. Returning a numeric solution using vpasolve. > In solve (line 304) ans = - 14.009379055223370038369334703094 - 2.9255310052111119036668717988769i
IgnoreAnalyticConstraints
を true
に設定して、solve
で求解できる可能性のある単純化を適用します。詳細は、アルゴリズムを参照してください。
S = solve(eqn, x, 'IgnoreAnalyticConstraints', true)
S = (3^(1/2)*exp(-(log(256) + log(3)^2)^(1/2)/2))/3 (3^(1/2)*exp((log(256) + log(3)^2)^(1/2)/2))/3
solve
は、求解を可能にする単純化を適用します。適用される単純化が常に有効であるとは限りません。したがって、このモードにおける解は正しくなかったり完全ではなかったりする可能性があるため、検証する必要があります。
関数 sym
と関数 syms
を使用して、シンボリック変数の仮定を設定できます。
変数 x は正の値のみをもつと仮定します。
syms x positive
仮定をもつ変数について方程式または方程式系を解く場合、ソルバーは仮定と矛盾のない解のみを返します。x
について、次の方程式を解きます。
eqn = x^2 + 5*x - 6 == 0; solve(eqn, x)
ans = 1
IgnoreProperties
を true
に設定して、仮定を満たさない解を可とします。
solve(eqn, x, 'IgnoreProperties', true)
ans = -6 1
計算を続けるため、変数 x に設定された仮定を syms
を使用して再作成することで消去します。
syms x
root
を含むシンボリック解の数値的近似多項式を解く際、solve
が root
を含む解を返す場合があります。これらの解を数値的に近似するには vpa
を使用します。次の方程式と解を考えます。
syms x eqn = x^4 + x^3 + 1 == 0; s = solve(eqn, x)
s = root(z^4 + z^3 + 1, z, 1) root(z^4 + z^3 + 1, z, 2) root(z^4 + z^3 + 1, z, 3) root(z^4 + z^3 + 1, z, 4)
この解にはパラメーターがないため、vpa
を使用して数値的に近似します。
vpa(s)
ans = 0.5189127943851558447865795886366 - 0.666609844932018579153758800733i 0.5189127943851558447865795886366 + 0.666609844932018579153758800733i - 1.0189127943851558447865795886366 - 0.60256541999859902604398442197193i - 1.0189127943851558447865795886366 + 0.60256541999859902604398442197193i
より高階数の多項方程式を解く場合、結果を返すためにソルバーでroot
が使用される場合があります。3 次の方程式の解を求めます。
syms x a eqn = x^3 + x^2 + a == 0; solve(eqn, x)
ans =
MaxDegree
をもつソルバーを呼び出して、このような方程式の陽的な解を求めてみます。このオプションでは、ソルバーで陽的な解が返されるように、多項式の最大次数が指定されます。既定値は、2
です。この値を増やすと、より高階数の多項式の陽的な解を得ることができます。
MaxDegree
の値を 3
に増やすことで、同じ方程式を陽的解について解きます。
S = solve(eqn, x, 'MaxDegree', 3)
S =
solve
で解を求められず ReturnConditions
が false
である場合、関数 solve
は内部で数値ソルバー vpasolve
を呼び出して数値解を求めようとします。solve
で解を求められず ReturnConditions
が true
である場合、solve
は警告と共に空の解を返します。解が存在しない場合、solve
は警告なしで空の解を返します。シンボリック パラメーターを使用しない多項方程式や多項方程式系では、数値ソルバーによってすべての解が返されます。シンボリック パラメーターを使用しない非多項方程式や非多項方程式系の場合、数値ソルバーによって 1 つの解だけが返されます (解が存在する場合)。
解にパラメーターが含まれており ReturnConditions
が true
である場合、solve
は解のパラメーターと解の成立条件を返します。ReturnConditions
が false
の場合、関数 solve
はパラメーターの値を選択して対応する値を返すか、特定の値を選択せずにパラメーター化された解を返すかします。後者の場合、solve
は警告を表示すると共に、返された解に含まれるパラメーターの値も示します。
いずれの条件にもパラメーターが含まれない場合、パラメーターは任意の複素値を取り得ることを意味します。
solve
の出力には、solve
によって生成されたパラメーターに加えて、入力方程式からのパラメーターが含まれる場合があります。
solve
によって導入されたパラメーターは MATLAB ワークスペースに表示されません。パラメーターを含む出力引数を使用してアクセスする必要があります。または、MATLAB ワークスペースでパラメーターを使用するため、syms
を使用してパラメーターを初期化します。たとえば、パラメーターが k
の場合は、syms k
を使用します。
変数名 parameters
および conditions
は solve
の入力として許可されていません。
構文 S = solve(eqn,var,'ReturnConditions',true)
は S
をシンボリック配列ではなく構造体として返します。
微分方程式の解を求めるには、dsolve
関数を使用します。
方程式系の解を求めるときには、常に結果は出力引数に代入されます。出力引数を使用すれば、方程式系の解の値にアクセスできます。
MaxDegree
では 5 より小さい正の整数のみを受け入れます。これは、一般的に、次数が 4 を超える多項式の根には陽的表現が存在しないからです。
出力変数 y1,...,yN
は、solve
で方程式または方程式系を解く対象となる変数を指定しません。y1,...,yN
が eqns
に含まれる変数であっても、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)) = 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
を除く任意の式で方程式の両辺を乗算できる。
多項方程式の解は完全でなければならない。