/* bisection.c 二分法 ( Bisection Method ) による非線形方程式の解法 */ #include #include // 方程式 f(x) = 0 はここで定義 //#define function (x * x - 3.0 * x + 2.0) //#define function_string "x^2 - 3x + 2" //#define function ((x * x - 2.0 ) * x + 1.0) //#define function_string "x^3 - 2x + 1" //#define function (x * x - 2.0) //#define function_string "x^2 - 2" //#define function (x * x - 3.0) //#define function_string "x^2 - 3" //#define function (x * x * x - 2.0) //#define function_string "x^3 - 2" //#define function sin(x) //#define function_string "sin(x)" //#define function log(x) - 1 //#define function_string "log(x) - 1" #define function exp(-x) - sin(x) #define function_string "exp(-x) - sin(x)" double f(double x) { return function; } main() { int n = 32, i, ok, s; double a, b, c, fa, fb, fc, p; // 初期値の入力 printf("二分法を用いて %s = 0 の解の近似値を求めます。\n", function_string); ok = 0; while(ok == 0){ printf("f(a)×f(b) <= 0 となるような a, b を入力してください。\n"); printf("a = "); scanf("%lf", &a); printf("b = "); scanf("%lf", &b); fa = f(a); fb = f(b); if(fa * fb <= 0.0) ok = 1; else printf("f(a) = %lf, f(b) = %lf なので f(a)×f(b) > 0 でした。\n", fa, fb); } ok = 0; while(ok == 0){ printf("小数点以下何桁まで求めますか ( 2 以上、最大 15 まで ) "); scanf("%d", &n); if(n > 1 && n < 16) ok = 1; } p = pow(0.1, n) / 2.0; // 許容誤差の指定 0.5 * 10^(-n) s = 0; // ステップ数 while(fabs(a-b) > p){ c = (a + b) / 2.0; printf(" c = %20.17lf\n", c); fc = f(c); if(fa * fc <= 0.0){ b = c; } else{ a = c; fa = fc; } s++; } printf("\n"); printf("解は x = %20.17lf です。\n", c); printf("誤差は %20.17lf 以下です。\n", fabs(a-b)); printf("ステップ数は %d でした。\n", s); }