bisection.c |
/* * bisection.c -- 二分法 (bisection method) で方程式 f(x)=0 を解く * コンパイル: gcc -o bisection bisection.c -lm * 実行: ./bisection * 入力は "0 1 1e-15" など。ここで 1e-15 は 1かける 10 の -15 乗を意味する。 */ #include <stdio.h> #include <math.h> double f(double x) { return cos(x) - x; } int main() { int i, maxitr = 100; double a, b, c, eps; double fa, fb, fc; printf(" 探す区間の左端, 右端, 許容精度ε: "); scanf("%lf %lf %lf", &a, &b, &eps); fa = f(a); fb = f(b); if (fa * fb > 0.0) { printf(" f(α) f(β) > 0 なのであきらめます。\n"); exit(0); } else { printf("f(%20.15f)=%9.2e, f(%20.15f)=%9.2e\n", a, fa, b, fb); for (i = 0; i < maxitr; i++) { c = (a + b) / 2; fc = f(c); if (fc == 0.0) break; else if (fa * fc <= 0.0) { /* 左側 [a,c] に根がある */ b = c; fb = fc; } else { /* 左側 [a,c] には根がないかもしれない。[c,b] にあるはず */ a = c; fa = fc; } printf ("f(%20.15f)=%9.2e, f(%20.15f)=%9.2e\n", a, fa, b, fb); if ((b - a) <= eps) break; } printf ("二分法による近似解=%20.15f\n", c); } return 0; } |
区間 内に解があることがわかるから、二分法で許容精度 を指示して解かせたのが以下の結果 (入力は 0 1 1e-15)。関数値が、区間の左端では正、右端では負になったまま区間が縮小 して行くのを理解しよう。
isc-xas06% gcc -o bisection bisection.c -lm isc-xas06% ./bisection 探す区間の左端α, 右端β, 許容精度ε=0 1 1e-15 f( 5.000000000000000e-01)= 3.78e-01, f( 1.000000000000000e+00)=-4.60e-01 f( 5.000000000000000e-01)= 3.78e-01, f( 7.500000000000000e-01)=-1.83e-02 f( 6.250000000000000e-01)= 1.86e-01, f( 7.500000000000000e-01)=-1.83e-02 f( 6.875000000000000e-01)= 8.53e-02, f( 7.500000000000000e-01)=-1.83e-02 f( 7.187500000000000e-01)= 3.39e-02, f( 7.500000000000000e-01)=-1.83e-02 f( 7.343750000000000e-01)= 7.87e-03, f( 7.500000000000000e-01)=-1.83e-02 f( 7.343750000000000e-01)= 7.87e-03, f( 7.421875000000000e-01)=-5.20e-03 f( 7.382812500000000e-01)= 1.35e-03, f( 7.421875000000000e-01)=-5.20e-03 中略 f( 7.390851332151556e-01)= 8.55e-15, f( 7.390851332151627e-01)=-3.44e-15 f( 7.390851332151591e-01)= 2.55e-15, f( 7.390851332151627e-01)=-3.44e-15 f( 7.390851332151591e-01)= 2.55e-15, f( 7.390851332151609e-01)=-4.44e-16 f( 7.390851332151600e-01)= 1.11e-15, f( 7.390851332151609e-01)=-4.44e-16 f( 7.390851332151600e-01)= 1.11e-15 isc-xas06% |