1: /* bisection00 */ 2: #include 3: 4: /* f = 0 の解を求める関数 f のプロトタイプ宣言 */ 5: double function( double ); 6: 7: 8: int main( void ){ 9: 10: /* 変数の宣言 */ 11: double xl, xm, xu; 12: double eps; 13: 14: /* 収束判定のための定数 */ 15: eps = 0.001; 16: 17: /* カウンタ用変数 */ 18: int i; 19: 20: /* while の break 用 flag */ 21: int flag; 22: 23: /* 初期値を入力 */ 24: /* flag > 0 の間は初期値の入力を繰り返し */ 25: flag = 1; 26: while ( flag > 0 ) { 27: 28: printf ( "初期値を入力してください 10 <= xl < xu <= 300\n" ); 29: printf ( " xl = ? "); 30: scanf ( "%lf", &xl ); 31: printf ( " xu = ? "); 32: scanf ( "%lf", &xu ); 33: 34: /* 初期値の適合性を判定 */ 35: if ( ( function( xl ) * function( xu ) > 0 ) ) { 36: 37: printf ( "初期値 xl, xu が不適当です\n\n" ); 38: 39: } else { 40: 41: flag = -1; 42: 43: printf ( "\n" ); 44: printf ( "初期値 xl = %5.2f, xu = %5.2f で求解\n", xl, xu ); 45: 46: } 47: 48: } 49: 50: /* 二分法による求解 */ 51: i = 0; 52: while( xu - xl > eps ) { 53: 54: /* 解の更新の様子を表示 */ 55: printf( " %2d 回目: xl = %5.2f xu = %5.2f\n", i, xl, xu ); 56: 57: /* 二分点の計算 */ 58: xm = ( xu + xl ) / 2.0; 59: 60: if ( ( function( xu ) * function( xm ) < 0 ) ) { 61: 62: /* 上界を更新 */ 63: xl = xm; 64: 65: } else { 66: 67: /* 下界を更新 */ 68: xu = xm; 69: 70: } 71: 72: /* カウンタを更新 */ 73: i = i + 1; 74: 75: } 76: 77: /* 結果を表示 */ 78: printf ( "\n" ); 79: printf ( "解は %7.5f で, 誤差は eps = %6.4f 以下です\n\n", xu, eps ); 80: 81: return 0; 82: 83: } 84: 85: 86: /* f = 0 の解を求める関数 f */ 87: /* n_{1} n_{2} = 21 の時の例 */ 88: double function( double x ){ 89: 90: /* 変数の宣言 */ 91: double a, b, c, d, z; 92: 93: /* 係数を定義 n_{1} n_{2} = 21 の時の例 */ 94: a = 1.0; 95: b = - 304.3 - 121; 96: c = 514.42 + ( 304.3 * 121 ); 97: d = ( - 514.42 ) * 121; 98: 99: /* f( x ) の値を計算 */ 100: z = ( a * x * x * x ) + ( b * x * x ) + ( c * x ) + d; 101: 102: return z; 103: 104: }