二分法求解方程f(x)=0根 用二分法求解方程f(x)=0根的前提条件是:f(x)在求解的区间[a,b]上是连续的,且已知f(a)与f(b)异号,即 f(a)*f(b)<0
令[a0,b0]=[a,b],c0=(a0+b0)/2,若f(c0)=0,则c0为方程f(x)=0的根;否则,若f(a0)与f(c0)异号,即 f(a0)*f(c0)<0,则令[a1,b1]=[a0,c0];若f(b0)与f(c0)异号,即 f(b0)*f(c0)<0,则令[a1,b1]=[c0,b0]。
依此做下去,当发现f(cn)=0时,或区间[an,bn]足够小,比如| an-bn |<0.0001时,就认为找到了方程的根。
用二分法求一元非线性方程f(x)= x3/2+2x2-8=0(其中^表示幂运算)在区间[0,2]上的近似实根r,精确到0.0001.算法如下:
#include <stdio.h>
#include <math.h>
int main()
{
float x,a,b,f1,f2,f;
printf("input a,b\n");
scanf("%f%f",&a,&b);
f1=a*a*a/2+2*a*a-8;
f2=b*b*b/2+2*b*b-8;
if(f1*f2>0)
{
printf("No root\n");
return 0;
}
else
{
do
{
x=(a+b)/2;
f=x*x*x/2+2*x*x-8;
if(f==0)break;
else if(f1*f>0)
{
a=x;
f1=f;
}
else
{
b=x;
f2=f;
}
}while(fabs(a-b)>=1e-4);
printf("root=%f",x);
}
}