 
 
 
 
 
   
計算の原理は、
中間値の定理「連続な関数 
![$ f\colon[a,b]\to\R$](img27.png) について、
 について、
 と
 と  の符号が異なれば、
 の符号が異なれば、 に解が少なくとも1つ存在する」と、
その区間縮小法による証明に基づきます。
 に解が少なくとも1つ存在する」と、
その区間縮小法による証明に基づきます。
![$ [a,b]$](img31.png) に解が存在するならば、
2つに分割した区間
 に解が存在するならば、
2つに分割した区間 
![$ [a,(a+b)/2]$](img32.png) ,
, 
![$ [(a+b)/2, b]$](img33.png) のどちらかに存在します
(両方に存在することもある) が、どちらにあるか判断できれば、
繰り返すことで区間の幅を半分半分にして行けて、
解を追い詰めることが出来る、ということです。
(詳しいことは次の小節で -- 暇な時に読んでね。)
 のどちらかに存在します
(両方に存在することもある) が、どちらにあるか判断できれば、
繰り返すことで区間の幅を半分半分にして行けて、
解を追い詰めることが出来る、ということです。
(詳しいことは次の小節で -- 暇な時に読んでね。)
以下にサンプル・プログラムを示します。 少し長いですが、 心臓部分 (プログラム後半部分) は (区間縮小法を理解していれば) 難しくないでしょう。
| bisection.BAS | 
| REM bisection.BAS --- ʬˡʶֽ̾ˡˤ f(x)=0 ζ
REM ա 1000⡼ɤˤƤĶ۴ؿ17
REM Ķ۴ؿȤʤ 1000 ⡼ɤǹ٤ζ
REM OPTION ARITHMETIC DECIMAL_HIGH
OPTION ARITHMETIC NATIVE
REM  f(x)=0 
FUNCTION F(x)
   LET F=COS(X)-X
END FUNCTION
REM -----------------------------------------------------
LET FMT$="---%.############### "
LET FMT2$=FMT$&FMT$
INPUT PROMPT "üü=": A,B
LET EPS=(B-A)*1.0e-14
REM ------------- ϤͤΥå ------------------
LET FA=F(A)
LET FB=F(B)
IF FA=0 THEN
   PRINT A;"ϲǤ"
   STOP
ELSEIF FB=0 THEN
   PRINT B;"ϲǤ"
   STOP
ELSEIF (FA > 0 AND FB > 0) OR (FA < 0 AND FB < 0) THEN
   PRINT "f(a),f(b)椬ƱǤ"
   STOP
END IF
REM ------------ ʬˡʶֽ̾ˡˤ¹ -------------
LET MAXITR=100
FOR i=1 TO MAXITR
   LET C=(A+B)/2
   LET FC=F(C)
   IF FC=0 THEN
      PRINT "Ĥޤ"
      PRINT USING FMT$: C
      STOP
   ELSEIF (FA>0 AND FC<0) OR (FA<0 AND FC>0) THEN
      REM ¦[A,C]˲
      LET B=C
      LET FB=FC
   ELSE
      REM ¦[C,B]˲
      LET A=C
      LET FA=FC
   END IF
   PRINT USING "###": I;
   PRINT USING FMT2$: A,B;
   PRINT FA;FB
   IF B-A < EPS THEN
      PRINT "֤ʬʤޤɽޤ"
      PRINT USING FMT$: (A+B)/2
      STOP
   END IF
NEXT I
PRINT "֤ϽʬʤޤǤ" 
END
 | 
実行すると「区間の左端、右端」を尋ねてくる。 例えば 0,1 と答える。
| bisection.TXT | 
| üü=0,1 1 0.500000000000000 1.000000000000000 .377582561890373 -.45969769413186 2 0.500000000000000 0.750000000000000 .377582561890373 -1.83111311261791E-2 3 0.625000000000000 0.750000000000000 .185963119505218 -1.83111311261791E-2 4 0.687500000000000 0.750000000000000 8.53349461524715E-2 -1.83111311261791E-2 5 0.718750000000000 0.750000000000000 3.38793724180665E-2 -1.83111311261791E-2 6 0.734375000000000 0.750000000000000 7.87472545850132E-3 -1.83111311261791E-2 7 0.734375000000000 0.742187500000000 7.87472545850132E-3 -5.19571174375921E-3 8 0.738281250000000 0.742187500000000 1.34514975180511E-3 -5.19571174375921E-3 (ά) 42 0.739085133214985 0.739085133215212 2.93876034618279E-13 -8.65973959207622E-14 43 0.739085133215099 0.739085133215212 1.03583808197527E-13 -8.65973959207622E-14 44 0.739085133215156 0.739085133215212 8.54871728961371E-15 -8.65973959207622E-14 45 0.739085133215156 0.739085133215184 8.54871728961371E-15 -3.90798504668055E-14 46 0.739085133215156 0.739085133215170 8.54871728961371E-15 -1.53210777398272E-14 47 0.739085133215156 0.739085133215163 8.54871728961371E-15 -3.44169137633799E-15 ֤ʬʤޤɽޤ 0.739085133215159 | 
なお、この計算では要求精度
(区間の幅がどこまで小さくなったら反復を停止するか)
を 
 (意味は
 (意味は 
 という意味) としてありますが、
これは演習に用いている十進BASICの通常の演算精度が、
10 進法 15 桁であることから決めたものです。
 という意味) としてありますが、
これは演習に用いている十進BASICの通常の演算精度が、
10 進法 15 桁であることから決めたものです。
やってみよう    
   を解くことで、
 を解くことで、 を求めてみよ
(これは課題8Bの一部である)。
 を求めてみよ
(これは課題8Bの一部である)。
 
 
 
 
