5.18 方程式を解く (ちょっとだけ不等式)

方程式を解くために、 Solve[], NSolve[] という二つの手続きがあります。

Solve[左辺==右辺,未知数] は式変形で解きます (等式を表すために = を二つ続けた == を 使うのが大事なところ)。
 Solve[x^2+3x+2==0, x]

この結果は {x->1} のような、 置き換え規則のリストの形で得られますが、 x /. % とすれば (置き換えを実行するわけです)、 解のリストが得られます (5.14 参照)。

次のような連立方程式も解けます。
 Solve[{x+y+z==6, 2x-y+z==5,-3x+y+2z==0},{x,y,z}]

Mathematica は $ 2$ 次方程式だけでなく、$ 3$ 次方程式、 $ 4$ 次方程式の根の公式も覚えていて解くことが出来ますが、 やってみれば分かるように、結果は分かりにくくなることが多いです。 複素数について、C.2 を見ておいて下さい (特に ComplexExpand[] を使うなど)。

どの程度の値なのか知りたい場合、 つまり近似値でよければ、 直後に % // N あるいは N[%, 50] のように入力すれば求められます。
  Solve[x^3+2x^2+3x+4==0, x]
  % // N                              直前の結果を小数で
  N[%%, 50]                           二つ前の結果を 50 桁の小数で

文字を係数に含む方程式も解くことが出来ます。
Solve[a x + b ==0, x]  
Reduce[a x + b ==0, x] ちゃんと場合わけをする

もっとも、特別簡単なものを除けば、 方程式は式変形のみで解くことは難しく、 できないことの方が多いです。 そういう場合は、近似値を求めることで我慢することにすれば、 NSolve[], FindRoot[] などの関数が利用できます。
NSolve[x^3+2x^2+3x+4==0, x, 40] 精度 $ 40$ 桁で解く
FindRoot[x^3+2x^2+3x+4==0, {x, 0}] Newton 法で 0 の近くの解を探す。
FindRoot[x^3+2x^2+3x+4==0, {x, 0},  
        WorkingPrecision->100,AccuracyGoal->50]  

実数解だけが欲しい場合は、Reals を指定する。
f[x_, y_] := x^4 - x y + y^4
sol = Solve[{D[f[x, y], x], D[f[x, y], y]} == {0, 0}, {x, y}, Reals]
(, Reals を指定しないと虚数解も表示される。)


なお、未知数の消去は Eliminate[]


不等式を解くには Reduce[] が使えます。

Reduce[x^2 - 5 x + 6 > 0, x]
Reduce[x^2 - 5 x + 6 <= 0, x]
Reduce[(x - 1) (x + 1) x > 0, x]

軽い応用問題 「実数 $ x$, $ y$ $ 2x^2+4xy+3y^2+4x+5y-4=0$ を満たすとするとき、 $ x$ の最大値を求めよ。」 これは $ 2x^2+4xy+3y^2+4x+5y-4$$ y$ についての2次式と考えたときの判別式が 0以上となる条件を調べれば分かります。
f[x_, y_] := 2 x^2 + 4 x y + 3 y^2 + 4 x + 5 y - 4
Reduce[Discriminant[f[x, y], y] >= 0, x]
とすると

$\displaystyle \frac{1}{4}\left(-2-5\sqrt{6}\right)\le x
\le \frac{1}{4}\left(-2+5\sqrt{6}\right)
$

となるので、$ x$ の最大値は $ \frac{1}{4}\left(-2+5\sqrt{6}\right)$. 以上は可視化すると状況がわかりやすいかもしれません。
gf = ContourPlot[f[x, y] == 0, {x, -4, 3}, {y, -4, 3}]
図 9: $ 2x^2+4xy+3y^2+4x+5y-4=0$
Image curve



桂田 祐史