このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
代数方程式の求解
Symbolic Math Toolbox™ ではシンボリックと数値の両方の方程式ソルバーが提供されています。このトピックでは、シンボリック ソルバー solve
を使用して方程式をシンボリックに求解する方法を説明します。シンボリック ソルバーと数値ソルバーの比較については、数値ソルバーまたはシンボリック ソルバーの選択を参照してください。
方程式の求解
eqn
が方程式である場合、solve(eqn, x)
は eqn
を解いてシンボリック変数 x
を求めます。
==
演算子を使用して一般的な 2 次方程式を指定し、solve
を使用して求解します。
syms a b c x eqn = a*x^2 + b*x + c == 0; solx = solve(eqn, x)
solx = -(b + (b^2 - 4*a*c)^(1/2))/(2*a) -(b - (b^2 - 4*a*c)^(1/2))/(2*a)
solx
は、2 次方程式の 2 つの解をもつシンボリック ベクトルです。入力 eqn
が式であり、方程式ではない場合、solve
は方程式 eqn == 0
を求解します。
x
以外の変数を求めるには、代わりにその変数を指定します。たとえば、eqn
を解いて b
を求めるには次のようにします。
solb = solve(eqn, b)
solb = -(a*x^2 + c)/x
変数を指定しない場合、solve
は symvar
を使用して求める変数を選択します。たとえば、solve(eqn)
では eqn
を解いて x
を求めます。
方程式の完全解を返す
solve
は自動的には方程式のすべての解を返しません。方程式 cos(x) == -sin(x)
を解きます。関数 solve
はいくつもある解のうちの 1 つを返します。
syms x solx = solve(cos(x) == -sin(x), x)
solx = -pi/4
すべての解を解のパラメーターおよび条件と共に返すには、オプション ReturnConditions
を true
に設定します。同じ方程式を解いて完全解を求めます。x
の解、解のパラメーターおよび解の条件のために 3 つの出力変数を用意します。
syms x [solx, param, cond] = solve(cos(x) == -sin(x), x, 'ReturnConditions', true)
solx = pi*k - pi/4 param = k cond = in(k, 'integer')
solx
には x
の解、pi*k - pi/4
が含まれます。param
変数は解のパラメーターである k
を指定します。cond
変数は解の条件 in(k, 'integer')
、つまり k
が整数でなければならないことを指定します。したがって、solve
は pi/4
で始まり pi*k
の間隔で繰り返される周期解を返します (k
は整数)。
solve によって返される完全解、パラメーター、条件を使用する
solve
によって返される解、パラメーター、条件を使用して、ある区間内またはその他の条件下における解を求めることができます。
区間 -2*pi<x<2*pi
における x
の値を求めるには、条件 cond
の下、その区間における solx
を解いて k
を求めます。assume
を使用して条件 cond
を仮定します。
assume(cond) solk = solve(-2*pi<solx, solx<2*pi, param)
solk = -1 0 1 2
これらの k
の値に対応する x
の値を求めるため、subs
を使用して solx
の k
に代入します。
xvalues = subs(solx, solk)
xvalues = -(5*pi)/4 -pi/4 (3*pi)/4 (7*pi)/4
これらのシンボリック値を数値計算で使用する数値に変換するため、vpa
を使用します。
xvalues = vpa(xvalues)
xvalues = -3.9269908169872415480783042290994 -0.78539816339744830961566084581988 2.3561944901923449288469825374596 5.4977871437821381673096259207391
solve によって返された解の可視化およびプロット
前の節では、solve
を使用して方程式 cos(x) == -sin(x)
を求解しました。この方程式に対する解は fplot
や scatter
などのプロット関数を使用して可視化することができます。
方程式 cos(x) == -sin(x)
の両辺をプロットします。
fplot(cos(x)) hold on grid on fplot(-sin(x)) title('Both sides of equation cos(x) = -sin(x)') legend('cos(x)','-sin(x)','Location','best','AutoUpdate','off')
値が x
であるときの関数の値を計算し、scatter
を使ってその解を点として重ね合わせます。
yvalues = cos(xvalues)
yvalues =
scatter(xvalues, yvalues)
予想どおり、解は 2 つのプロットの交点で現われます。
複雑な結果の単純化によるパフォーマンスの改善
結果が複雑で solve
が止まった場合、またはパフォーマンスを改善したい場合は、関数 solve で求めた方程式の解のトラブルシューティングを参照してください。