Hiroshi TAKEMOTO ([email protected])

方程式の解法

数式処理システムで使いたい機能の一つに、方程式の解法があります。

方程式の解法にはsolve関数を使用します。solve関数の呼び出し形式は以下の通りです。

solve(解きたい方程式また方程式のリスト, 解を得る変数)         
        

一次方程式の解

以下の一次方程式をsolveを使って解いてみましょう。 $$ f(x)=2x+1 $$ solverの戻り値は、解のリストです。一次方程式では1個の解、$x = −\frac{1}{2}$ が得られます。

In [2]:
# 一次方程式の解法
var('x')
f = 2*x + 1
sol = solve(f, x)
show(sol)

一次方程式のグラフ表現

先のf(x)をyとすると、直線の式が得られます。 $$ y = 2x + 1 $$

この直線をプロットしてみると、以下のようになります。 直線とX軸が交わる点が、方程式の解になっていることがわかります。

In [3]:
# 一次方程式のグラフ
plot(f, [x, -2, 2], figsize=5)
Out[3]:

2次方程式

同様に、以下の2次方程式について見てみましょう。 $$ f(x) = x^2 + x - 1 $$

f(x)の定義と因数分解の結果を表示します。

In [4]:
f = x^2 + x - 1
show(factor(f))

2次方程式の解とグラフ表現

solve関数の解は、2個の実数が求まります。

この場合のグラフは、X軸で交わる点が2個存在します。

In [5]:
# 2次方程式の解
sol = solve(f, x)
show(sol)
In [6]:
# 2次方程式のグラフ
plot(f, [x, -2, 2], figsize=5)
Out[6]:

重根の場合

2次方程式の解が同じ値を持つ場合(重根)の場合には、X軸との交点が1個となります。

重根の場合、解をaとすると因数分解の形は、以下のようになります。 $$ f(x) = (x -a)^2 $$

In [7]:
# 重根の場合
f = x^2 - 2*x + 1
show(factor(f))
In [8]:
# 2次方程式の解(重根の場合)
sol = solve(f, x)
show(sol)
In [9]:
# 2次方程式のグラフ(重根の場合)
plot(f, [x, -2, 2], figsize=5)
Out[9]:

複素数の場合

2次方程式の解が複素数の場合には、グラフはX軸と交わりません。

In [10]:
# 複素数
f = x^2 + x + 1
show(factor(f))
In [11]:
# 2次方程式の解
sol = solve(f, x)
show(sol)
In [12]:
# 2次方程式のグラフ
plot(f, [x, -2, 2], figsize=5)
Out[12]:

多項式と数値解

多項式の例として、以下の3次多項式をみてみましょう。 $$ f(x) = x^3 - 2 x + 4 $$

solveの結果は、1個の実数と2個の複素数が求まります。ここから予想されるグラフの形は、X軸と交わる点が1個の3次曲線です。

このように関数の解を求めたり、グラフと解の関係を理解する上で、Sageはとても有効です。

In [13]:
# 3次方程式
var('x')
f = x^3-2*x+4
show(factor(f))
In [14]:
# 3次方程式の解
sol = solve(f, x)
show(sol)
In [15]:
# 3次方程式のグラフ
plot(f, -2.5, 2.5, figsize=5)
Out[15]:

数値解法

solveが解析的に解を求めたのに対し、与えられた範囲で解となる点を数値解法で求める 関数が、find_rootです。

find_rootの呼び出し形式は以下の通りです。fには1変数の関数を与えます。

    find_root(f, 計算開始点, 計算終了点)

先の関数f(x)をfind_rootで求めると、解析解(x = 2)に非常に近い値が求まります。 $$ f(x) = x^3 - 2 x + 4 $$

In [16]:
# グラフから-3から3の範囲で数値解を求める
find_root(f, -3, 3)
Out[16]:
-1.999999999999995

連立方程式

連立方程式の解とグラフの関係をSageを使ってみてみましょう。

先に解いた一次方程式と2次方程式を1つの連立方程式にして解いてみましょう。 $$ \left\{ \begin{eqnarray} y & = & 2 x + 1 \\ y & = & x^2 + x - 1 \end{eqnarray} \right. $$

方程式のリストをsolve関数に与えることで、連立方程式の解を得ることができます。

グラフから1次曲線と2次曲線の交点(-1, -1), (2, 5)が、連立方程式の解となっていることが分かります。

In [17]:
var('x y')
eq = [y == 2*x + 1, y == x^2 + x - 1]
# 解を求める
show(solve(eq, [x, y]))
# グラフから解を求める
p1 = plot(x^2 + x - 1, [x, -2, 3])
p2 = plot(2*x + 1, [x, -2, 3])
(p1+p2).show(ymin=-3, ymax=8, figsize=5)    # 不等号の例と描画範囲を合せた

不等式とグラフ

region_plot関数を使うことで不等式の範囲をグラフで表示することができます。

region_plotの引数には、xとy2変数の関係式または2変数を引数に持つ関数とx変数とy変数の 描画範囲を指定します。

以下に1次不等式の例を示します。 $$ y \le 2 x + 1 $$

In [18]:
(x, y) = var('x y')
f(x, y) = y <= 2*x + 1
region_plot(f(x, y), [x, -2, 3], [y, -3, 8])
Out[18]:

incol, outcolで領域内、領域外の色を指定したり、bordercolで境界線の色を指定することができます。

以下では、2次不等式にincolに薄い青、境界線に灰色を指定して表示した例を示します。 $$ y > x^2 + x -1 $$

In [19]:
g(x, y) = y > x^2 + x - 1
region_plot(g(x, y), [x, -2, 3], [y, -3, 8], incol='lightblue', bordercol='gray')
Out[19]:

連立不等式のグラフ

region_plotに複数の式または関数をリストで与えることによって、連立不等式の 範囲を表示することができます。

以下に、先の2つの不等式を組み合わせた連立不等式の例を示します。 $$ \left\{ \begin{eqnarray} y & \le & 2 x + 1 \\ y & > & x^2 + x - 1 \end{eqnarray} \right. $$

In [20]:
region_plot([f, g], [x, -2, 3], [y, -3, 8])
Out[20]:
In [ ]: