2022年度プログラミング演習A・B

第4回:非線形方程式の解の計算1

1. 概要

今回と次回の授業では、「非線形方程式 $f(x)=0$ の解を求める」という問題を扱います。

線形方程式(一次方程式)$ax+b=0$ に対しては、解 $x=-\frac{b}{a}$ が簡単に計算できます。一方で非線形方程式に対しては、二次方程式 $ax^2+bx+c=0$ の解 $x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}$ のように公式を用いて解を計算できる場合もありますが、一般の場合にはそれは困難です。

そこで、厳密解(厳密な意味で正しい解)ではなく、近似解(厳密解に近いある程度良い解)を求めることを考えます。

今回の授業では、方程式の近似解を求める有名なアルゴリズムの一つである二分法(bisection method)について説明し、プログラムとしての実装を行います。

2. 二分法

2.1. 二分法の考え方

連続な関数 $f:\mathbb{R}\to\mathbb{R}$ が与えられているとし、方程式 $f(x)=0$ の近似解を求めることを考えます。

$a<b$ を満たす実数 $a, b$ を取り、$f(a)$ と $f(b)$ が異符号、すなわち $f(a)\cdot f(b)<0$ と仮定します。

このとき、$f(a)>0$ かつ $f(b)<0$、または、$f(a)<0$ かつ $f(b)>0$ であり、関数 $f$ は連続ですので、中間値の定理によって $a$ と $b$ の間に $f(x)=0$ の解(厳密解)が少なくとも一つ存在することが保証されます。

(※実際には、関数 $f$ は区間 $[a,b]$ 上で定義されていて連続であれば十分です。)

ここで、$a$ と $b$ の中点 $p=\frac{a+b}{2}$ を考えます。もし $f(p)=0$ なら、方程式 $f(x)=0$ の厳密解 $p$ が見つかったことになります。そうでなければ、$f(p)>0$ または $f(p)<0$ です。

$f(a)$ と $f(p)$ が異符号、すなわち $f(a)\cdot f(p)<0$ の場合には、再び中間値の定理によって $a$ と $p$ の間に $f(x)=0$ の厳密解が存在することが保証されます。

$f(a)$ と $f(p)$ が同符号、すなわち $f(a)\cdot f(p)>0$ の場合には、$f(p)$ と $f(b)$ が異符号になりますので、同様に中間値の定理によって $p$ と $b$ の間に $f(x)=0$ の厳密解が存在することが保証されます。

いずれの場合も、厳密解が存在する区間の幅が半分になります。したがって、上の操作を繰り返すことにより、厳密解が存在する範囲をどんどんと狭めることができます。

最終的には、区間の幅がある一定の数値より小さくなった時点で繰り返しを終了し、区間の中点が近似解として得られます。

2.2. 手動でのアルゴリズムの確認

例として、関数 $f(x)=x^3-2$ に対して、方程式 $f(x)=0$ の区間 $[0,3]$における近似解を計算することを考えます。

まず、関数 $f$ をMATLABの関数として定義します。

続いて、区間 $[0,3]$ における関数 $f$ のグラフを描画してみます。

$a=0$、$b=3$ とすると、$f(a)<0$ かつ $f(b)>0$ ですので、二分法を使用することができます。

$a$ と $b$ の中点を $p=\frac{a+b}{2}$ として、$f(a)\cdot f(p)$ の値を計算します。

$f(a)\cdot f(p)<0$ ですので、$a$ と $p$ の間に厳密解が存在することが分かり、改めて $b=p$ とおきます。再び $p=\frac{a+b}{2}$ として、$f(a)\cdot f(p)$ の値を計算します。

$f(a)\cdot f(p)>0$ ですので、$p$ と $b$ の間に厳密解が存在することが分かり、改めて $a=p$ とおきます。再び $p=\frac{a+b}{2}$ として、$f(a)\cdot f(p)$ の値を計算します。

演習1

$b-a<0.02$ となるまで、上記の操作を手動で繰り返し行ってください。「手動で行う」演習ですので、if文、for文、while文を使わないこと。Markdownとして説明を付ける必要はなく、コードのみを書けばよいです。

2.3. プログラムとしての実装

二分法のアルゴリズムは、次のようにまとめられます。

(反復の終了条件に関する注意)

演習2

上記の二分法のアルゴリズムを実現するコードを書き、関数 $f(x)=x^3-2$ に対して方程式 $f(x)=0$ の区間 $[0,3]$における近似解を求めてください。ただし、許容誤差 $TOL=0.00001$ とします。

演習3

二分法のアルゴリズムにおける区間の両端の初期値 $a$ と $b$、許容誤差 $TOL$、反復回数 $n$ の関係について考察してください。Markdownのセルに解答を書いてください。

(演習3の解答)

演習4(オプション)

二分法のアルゴリズムにおいて、計算量の観点から関数 $f$ の値の計算回数は最小限に抑えるべきです。$f(a)$ の値を格納する変数 $fa$ と $f(p)$ の値を格納する変数 $fp$ を新たに用いることで、演習2のコードを改良してください。

第4回レポート課題

演習1~演習4に取り組んでください。