方法的思想就是:一直选取区间中间的数值,如果发现中间的函数值与一侧函数值,异号,那么说明解在这个更小的区间中,采用eps=1e-5作为区间的极限大小,通过迭代的方法求解这个方程的数值解。
所以了解了上述思想,那么else if(f(a)*f(c)<0) b=c说明的是 f(a)和f(c)异号,那么使用b=(a+b)/2缩小迭代区间,继续迭代;同理else a=c说明f(a)和f(c)同号,那么使用a(a+b)/2缩小迭代区间,继续迭代!
二分法查找还是二分法求方程式解
#include<stdio.h>#include <math.h>
float f( float a )
{
return a*a*a + a - 1
}
float jie( float a, float b )
{
/* x*x*x + x -1 = 0 */
float m = (a+b)/2
printf( "a=%f,b=%f\n", a, b)
printf( "fm=%f, fa=%f, fb=%f\n", f(m), f(a), f(b) )
if ( f(a)*f(b)> 0 )
{
printf( "起始区间不正确\n" )
return m
}
if ( fabs(f(m)) < 0.0001 )
return m
if ( f(m)*f(a) > 0 )
return jie( m, b )
else
return jie( a, m )
}
int main()
{
float a, b, x
printf( "输入起始区间: " )
scanf( "%f %f", &a, &b )
x = jie( a, b )
printf( "x^3+x-1=0 x= %.3f\n", x )
}