実際の数値計算は, であるような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 |
著作者 | 紀平拓男・春日伸弥 |
出版社 | ソフトバンク パブリッシング株式会社 |