二分法求多项式单根

二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。

二分法的步骤为:

 

  • 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
  • 如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
  • 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
  • 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2, b],令a=(a+b)/2,重复循环;
  • 如果f((a+b)/2)与f(b)同号,则说明根在区间[a, (a+b)/2],令b=(a+b)/2,重复循环;

     

    本题目要求编写程序,计算给定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 }

 

posted on 2015-02-11 15:51  丝工木每  阅读(640)  评论(0编辑  收藏  举报

导航