実際の数値計算は,
であるような2点
から出発する.
そして,区間
を2分する点
に対して,
を計算を行う.
ならば
を
と置き換え,
ならば
を
と置き
換える.絶えず,区間
の間に解があるようにするのである.この操作
を繰り返して,区間の幅
が与えられた値
よりも小さく
なったならば,計算を終了する.解へ収束は収束率1/2の一次収束という.
後は教科書を用いて説明する.
left
riht
mid
epsilon
言うまでもないと思うが,このプログラムは,方程式
| (3) |
1 #include <stdio.h>
2 #include <math.h>
3 #include <stdlib.h>
4
5 /* 解析したい関数 */
6 double func(double x)
7 {
8 return x*x*x*x*x
9 -10.0*x*x*x*x
10 +25.0*x*x*x
11 +40.0*x*x
12 +200.0*x-500.0;
13 }
14
15 /* 2分探索法(バイナリサーチ) */
16 double BinarySearch(void)
17 {
18 double left,mid,right,epsilon;
19
20 /* ↓「答に非常に近い」という範囲を定義する。
21 この値をいろいろと変えることで,答の精度を調節できる。
22 ちなみに,あまり小さくしすぎると情報落ちの関係で
23 答が求まらなくなってしまうので注意。 */
24 epsilon=0.00001;
25
26 /* 「leftとrightの間に確実に解がある」という範囲を指定する */
27 left=1.0;
28 right=3.0;
29
30 /* 範囲をひたすら絞り込む */
31 while(fabs(right-left)>epsilon &&fabs(func(left))>epsilon)
32 {
33 mid=(left+right)/2.0;
34
35 /* func(left)とfunc(mid)が同符号なら */
36 if(func(left)*func(mid)>=0.0)
37 left=mid; /* leftの位置をmidに合わせる */
38 else
39 right=mid; /* rightの位置をmidに合わせる */
40 }
41 return left;
42 }
43
44 int main(void)
45 {
46 double d;
47 d=BinarySearch();
48 printf("方程式の解は%lf,"
49 "そのときのfunc(x)は%lfです。\n",d,func(d));
50 return EXIT_SUCCESS;
51 }
[転載について]
このページ中のリスト1のプログラムは,教科書として使用している以下の書籍
| 書名 | プログラミングの宝箱 アルゴリズムとデータ構造 ISBN4-7973-2419-8 |
| 著作者 | 紀平拓男・春日伸弥 |
| 出版社 | ソフトバンク パブリッシング株式会社 |