Main Content

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

代数方程式の求解

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

変数を指定しない場合、solvesymvar を使用して求める変数を選択します。たとえば、solve(eqn) では eqn を解いて x を求めます。

方程式の完全解を返す

solve は自動的には方程式のすべての解を返しません。方程式 cos(x) == -sin(x) を解きます。関数 solve はいくつもある解のうちの 1 つを返します。

syms x
solx = solve(cos(x) == -sin(x), x)
solx =
-pi/4

すべての解を解のパラメーターおよび条件と共に返すには、オプション ReturnConditionstrue に設定します。同じ方程式を解いて完全解を求めます。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 が整数でなければならないことを指定します。したがって、solvepi/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 を使用して solxk に代入します。

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) を求解しました。この方程式に対する解は fplotscatter などのプロット関数を使用して可視化することができます。

方程式 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')

Figure contains an axes object. The axes object with title Both sides of equation cos(x) = -sin(x) contains 2 objects of type functionline. These objects represent cos(x), -sin(x).

値が x であるときの関数の値を計算し、scatter を使ってその解を点として重ね合わせます。

yvalues = cos(xvalues)
yvalues = 

(-0.707106781186547524400844362104850.70710678118654752440084436210485-0.707106781186547524400844362104850.70710678118654752440084436210485)

scatter(xvalues, yvalues)

Figure contains an axes object. The axes object with title Both sides of equation cos(x) = -sin(x) contains 3 objects of type functionline, scatter. These objects represent cos(x), -sin(x).

予想どおり、解は 2 つのプロットの交点で現われます。

複雑な結果の単純化によるパフォーマンスの改善

結果が複雑で solve が止まった場合、またはパフォーマンスを改善したい場合は、関数 solve で求めた方程式の解のトラブルシューティングを参照してください。

関連するトピック