标签:
二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。
二分法的步骤为:
本题目要求编写程序,计算给定3阶多项式f(x)=a3x3+a2x2+a1x+a0在给定区间[a, b]内的根。
输入格式:
输入在第1行中顺序给出多项式的4个系数a3、a2、a1、a0,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。
输出格式:
在一行中输出该多项式在该区间内的根,精确到小数点后2位。
输入样例:3 -1 -3 1
-0.5 0.5
输出样例:
0.33
1 /* 2 ** 二分法求多项式单根 3 */ 4 #include <stdio.h> 5 #define THRESHOLD 0.001 6 7 double coefficient[4]; 8 9 /* 10 ** 三阶多项式 11 */ 12 double f( double x ) 13 { 14 double temp = 1; 15 double result = 0; 16 int i; 17 for( i = 0; i < 4; ++ i ) { 18 result += coefficient[i] * temp; 19 temp *= x; 20 } 21 return result; 22 } 23 24 /* 25 ** 用二分法求多项式的单根 26 */ 27 double Root( double a, double b ) 28 { 29 double minddle; 30 while( b - a >= THRESHOLD && f( a ) * f( b ) <= 0 ) { 31 // 考虑根在区间端点的情况 32 if( f( a ) == 0 ) 33 return a; 34 if( f( b ) == 0 ) 35 return b; 36 // 如果根不在端点,用二分法求根 37 minddle = ( a + b ) / 2; 38 if( f( minddle ) == 0 ) 39 return minddle; 40 else if( f( a ) * f( minddle ) > 0 ) 41 a = minddle; 42 else if( f( b ) * f( minddle ) > 0 ) 43 b = minddle; 44 } 45 if( b - a < THRESHOLD ) 46 return ( a + b ) / 2; 47 } 48 49 int main() 50 { 51 int i; 52 double a, b; 53 for( i = 3; i >= 0; --i ) { 54 scanf( "%lf", &coefficient[i] ); 55 } 56 scanf( "%lf%lf", &a, &b ); 57 58 printf( "%.2lf", Root( a, b ) ); 59 return 0; 60 }
标签:
原文地址:http://www.cnblogs.com/zouhongmey/p/4286408.html