二分迭代法求方程零根的程序实现——c——新人文

当f(x)在区间[a,b]上连续,且f(a)*f(b)<0。根据连续函数的性质可知f(x)=0在[a,b]上至少有一个根。若f(x)在区间[a,b]上单调,可知f(x)=0在[a,b]上有唯一一个根。

假设一个 flag 为正小数, 通过二分迭代法求f(x)=0方程根的简单思路如下:
(1)计算区间 [a,b] 的中点 m=(a+b)/2, 如果m的绝对值小于flag,则我们可以近似的将m看作该方程的零根。如果f(m)的绝对值大于flag,则执行(2)
(2)f(b)*f(m)>0,则 b=m ; 否则f(b)*f(m)<0,则 a=m 。继续执行(1)

注:同理可用f(a)比较
f(a)*f(m)>0,则a=m; 否则f(a)*f(m)<0,b=m

以下是用二分法求2x3-4x2+3*x-6=0 的源码

#include
#include

double f( double x )
{
	return 2*x*x*x-4*x*x+3*x-6;
}
int main( void )
{
	double flag=1E-6;	
	double x1=-10,x2=10,m,result;  //x1和x2为根的区间
	m=(x1+x2)/2;
	
	while( fabs( f( m ) )>=flag ){
 	if( f( x2 )*f( m )>0 ){
 		x2=m;
  	}else{
  		x1=m;
  	}
  	m=(x1+x2)/2;
  	}
  	result=m;
 	printf("该方程的根为%f\n",result);
 
 	return 0;
}

代码中的flag其实也就是精度,这里的精度是1E-6,也就是10的负六次。
这里的精度可以根据需要自己调整。

如果大家有看到错误的地方,希望大家在评论中指正,感谢!

你可能感兴趣的:(算法)