【数値計算#1】根を求める
根ってなんだよ
ある関数が0になるときのの値のこと。
例:の根はである。
二分法
概要
初期区間[ ]のどちらかを中点に適切に置き換え、どんどん幅を狭めて根を求めていく。
長所:確実である
短所:収束は遅い
詳しく説明してみる
について考えてみる。次のグラフは、 (赤)と (黒)を図示している。 さて、初期値[ ]を[ ]とする。これも図示してみる。 次に、との中点を求める。中点となり、これも図示してみる。 ここで、とについて考える。もし、とある2点からなる幅の間に根があるとき、その2点をそれぞれ関数に代入した値どうしの積は負の値になるはず(正負負)である。, より、[ ]を採用。なので、と置き換える。 以下繰り返し。かつとなったとき、探索を終了する。直前の中点が答えになる。
Pythonソースコード
def bisection(func, xl, xr): epsilon = 1.0e-6 i = 0 while(abs(xr-xl) > epsilon): sl = func(xl) sr = func(xr) xm = (xl + xr) / 2 # 中点 sm = func(xm) if(sl*sm < 0.0): xr = xm else: xl = xm i += 1 print('iteration:{}, value:{}'.format(i,xm)) return xm
実際に動かしてみる
関数
def func(x): return x**2-2
実行
bisection(func, 1, 2)
iteration:1, value:1.5 iteration:2, value:1.25 iteration:3, value:1.375 iteration:4, value:1.4375 iteration:5, value:1.40625 iteration:6, value:1.421875 iteration:7, value:1.4140625 iteration:8, value:1.41796875 iteration:9, value:1.416015625 iteration:10, value:1.4150390625 iteration:11, value:1.41455078125 iteration:12, value:1.414306640625 iteration:13, value:1.4141845703125 iteration:14, value:1.41424560546875 iteration:15, value:1.414215087890625 iteration:16, value:1.4141998291015625 iteration:17, value:1.4142074584960938 iteration:18, value:1.4142112731933594 iteration:19, value:1.4142131805419922 iteration:20, value:1.4142141342163086