二分法

二分法是求方程(一元非线性方程)近似根的方法中行之有效的最简单的方法,它的递推过程简单,便于计算机上实现,实现二分法的基本步骤如下:

Step1:输入有根区间的端点a,b及预先给定的精度ε;

Step2:计算x=(a+b)/2;

Step3:若f(a)f(x)<0,则b=x;否则a=x;

Step4:若|b-a|<ε,则输出方程满足精度要求的根x,计算结束;否则转Step2。

二分法适用的前提条件是:f(x)在[a,b]上连续,且f(x)=0在区间[a,b]内只有唯一实根。

举例:求x3+2x+40=ex在区间[5 , 10]的根。

由题已知:令f(x)=x3+2x+40-ex,则二分法的C语言求解程序代码如下:

#include <stdio.h>
#include <math.h>
#define f(x) (pow(x,3)+2*x+40-exp(x)) /*定义f(x)*/
#define eps 0.00001  /*容许误差值*/
main()
{
       float a,b,y,x;
       int n=0;
loop:
       printf("Please input a,b:\n");
       scanf("%f%f",&a,&b);/*输入a、b值时,注意两个数字间用空格隔开,如:“5 10”+回车*/
       if(f(a)*f(b)>=0) /* 判断是否符合二分法使用的条件*/
       {
              printf("No root between %f and %f\n",a,b);
              goto loop;
       }
       do
       {
              x=(a+b)/2;
              n++;
              if(f(a)*f(x)<0) /* 如果f(a)*f(x)<0,则根在区间的左半部分*/
              {
                     b=x;
              }
              else  /* 否则根在区间的右半部分*/
              {
                     a=x;
              }
       }while(fabs(b-a)>eps);/*判断是否达到精度要求,若没有达到,继续循环*/
       x=(a+b)/2; /* 取最后的小区间中点作为根的近似值*/
       printf("The root is x=%f, NO.=%d\n",x,n);
       system("pause");
}

二分法的优点是简单和容易操作,缺点是收敛较慢,且不能求重根。

参考资料:
[1] 王汉青. 暖通空调流体流动数值计算方法与应用[M]. 北京: 科学出版社, 2013.10.

来源:,欢迎分享本文,转载请保留出处!