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