| [ |
l]bisection.cpp
/*
* bisection.cpp -- 二分法 (bisection method) で方程式 f(x)=0 を解く
* コンパイル: g++ -o bisection bisection.cpp -lm
* 実行: ./bisection
*/
#include <iostream>
#include <cstdlib> // exit()
#include <iomanip>
#include <cmath>
using namespace std;
int main(void)
{
int i, maxitr = 100;
double alpha, beta, a, b, c, eps;
double fa, fb, fc;
double f(double);
cout.setf(ios::scientific, ios::floatfield);
cout << " 探す区間の左端α, 右端β, 許容精度ε=";
cin >> alpha >> beta >> eps;
a = alpha; b = beta;
fa = f(a); fb = f(b);
if (fa * fb > 0.0) {
cout << " f(α) f(β) > 0 なのであきらめます。" << endl;
exit(0);
}
else {
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;
}
cout << "f(" << setw(24) << setprecision(15) << a << ")="
<< setw(9) << setprecision(2) << fa
<< ", f(" << setw(24) << setprecision(15) << b << ")="
<< setw(9) << setprecision(2) << fb << endl;
if ((b - a) <= eps)
break;
}
cout << "f(" << setw(24) << setprecision(15) << c << ")="
<< setw(9) << setprecision(2) << fc << endl;
}
return 0;
}
double f(double x)
{
return cos(x) - x;
}
|
このプログラムの実行結果は以下のようになる。
| コンパイルと実行結果 |
oyabun% g++ -i bisection bisection.cpp oyabun% ./bisection 探す区間の左端α, 右端β, 許容精度ε=0 1 1e-14 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.382812500000000e-01)= 1.35e-03, f( 7.402343750000000e-01)=-1.92e-03 f( 7.382812500000000e-01)= 1.35e-03, f( 7.392578125000000e-01)=-2.89e-04 f( 7.387695312500000e-01)= 5.28e-04, f( 7.392578125000000e-01)=-2.89e-04 f( 7.390136718750000e-01)= 1.20e-04, f( 7.392578125000000e-01)=-2.89e-04 f( 7.390136718750000e-01)= 1.20e-04, f( 7.391357421875000e-01)=-8.47e-05 f( 7.390747070312500e-01)= 1.74e-05, f( 7.391357421875000e-01)=-8.47e-05 f( 7.390747070312500e-01)= 1.74e-05, f( 7.391052246093750e-01)=-3.36e-05 f( 7.390747070312500e-01)= 1.74e-05, f( 7.390899658203125e-01)=-8.09e-06 f( 7.390823364257812e-01)= 4.68e-06, f( 7.390899658203125e-01)=-8.09e-06 f( 7.390823364257812e-01)= 4.68e-06, f( 7.390861511230469e-01)=-1.70e-06 f( 7.390842437744141e-01)= 1.49e-06, f( 7.390861511230469e-01)=-1.70e-06 f( 7.390842437744141e-01)= 1.49e-06, f( 7.390851974487305e-01)=-1.08e-07 f( 7.390847206115723e-01)= 6.91e-07, f( 7.390851974487305e-01)=-1.08e-07 f( 7.390849590301514e-01)= 2.92e-07, f( 7.390851974487305e-01)=-1.08e-07 f( 7.390850782394409e-01)= 9.20e-08, f( 7.390851974487305e-01)=-1.08e-07 f( 7.390850782394409e-01)= 9.20e-08, f( 7.390851378440857e-01)=-7.75e-09 f( 7.390851080417633e-01)= 4.21e-08, f( 7.390851378440857e-01)=-7.75e-09 f( 7.390851229429245e-01)= 1.72e-08, f( 7.390851378440857e-01)=-7.75e-09 f( 7.390851303935051e-01)= 4.72e-09, f( 7.390851378440857e-01)=-7.75e-09 f( 7.390851303935051e-01)= 4.72e-09, f( 7.390851341187954e-01)=-1.51e-09 f( 7.390851322561502e-01)= 1.61e-09, f( 7.390851341187954e-01)=-1.51e-09 f( 7.390851331874728e-01)= 4.63e-11, f( 7.390851341187954e-01)=-1.51e-09 f( 7.390851331874728e-01)= 4.63e-11, f( 7.390851336531341e-01)=-7.33e-10 f( 7.390851331874728e-01)= 4.63e-11, f( 7.390851334203035e-01)=-3.43e-10 f( 7.390851331874728e-01)= 4.63e-11, f( 7.390851333038881e-01)=-1.48e-10 f( 7.390851331874728e-01)= 4.63e-11, f( 7.390851332456805e-01)=-5.11e-11 f( 7.390851331874728e-01)= 4.63e-11, f( 7.390851332165767e-01)=-2.37e-12 f( 7.390851332020247e-01)= 2.20e-11, f( 7.390851332165767e-01)=-2.37e-12 f( 7.390851332093007e-01)= 9.81e-12, f( 7.390851332165767e-01)=-2.37e-12 f( 7.390851332129387e-01)= 3.72e-12, f( 7.390851332165767e-01)=-2.37e-12 f( 7.390851332147577e-01)= 6.74e-13, f( 7.390851332165767e-01)=-2.37e-12 f( 7.390851332147577e-01)= 6.74e-13, f( 7.390851332156672e-01)=-8.48e-13 f( 7.390851332147577e-01)= 6.74e-13, f( 7.390851332152124e-01)=-8.66e-14 f( 7.390851332149850e-01)= 2.94e-13, f( 7.390851332152124e-01)=-8.66e-14 f( 7.390851332150987e-01)= 1.04e-13, f( 7.390851332152124e-01)=-8.66e-14 f( 7.390851332151556e-01)= 8.55e-15, f( 7.390851332152124e-01)=-8.66e-14 f( 7.390851332151556e-01)= 8.55e-15, f( 7.390851332151840e-01)=-3.91e-14 f( 7.390851332151556e-01)= 8.55e-15, f( 7.390851332151698e-01)=-1.53e-14 f( 7.390851332151556e-01)= 8.55e-15, f( 7.390851332151627e-01)=-3.44e-15 f( 7.390851332151627e-01)=-3.44e-15 oyabun% |