比如用二分法求f(x)=x^3-6x-1=0的实根。
代码如下(已调试):
#include
"math.h"
main()
{
float
x,x1,x2
float
F(float
x,float
x1,float
x2)
printf("请输入区间[x1,x2]\n")
scanf("%f%f",&x1,&x2)
printf("x=%f\n",F(x,x1,x2))
}
float
F(float
x,float
x1,float
x2)
{
float
f,f1,f2
do
{
f1=pow(x1,3)-6*x1-1.0
f2=pow(x2,3)-6*x2-1.0
}while(f1*f2>0)
//确保输入的x1,x2使得f1,f2符号相反
do
{
x=(x1+x2)/2
//求x1,x2的中点
f=pow(x,3)-6*x-1.0
if(f1*f>0)
//当f与f1符号相同时
{x1=xf1=f}
else
if(f2*f>0)
//当f与f2符号相同时
{x2=xf2=f}
}while(fabs(f)>1e-6)
//判断条件fabs(f)>1e-6的意思是f的值非常0
return
x
}
输入:1
5
则输出:x=2.528918
输入:-10
10
则输出:x=2.528918
如果连续函数在给定区间不单调,很有可能中值*下界值和中值*上界值都大于0,那么会跳出认为没有根,而事实上很有可能这个中值点靠近函数极点。
而真正用二分法求给定区间的思路是:
首先为函数求导,算出导函数的零点,然后再判断零点性质,最后将函数区间分为单调递增和单调递减间隔的形式,对每一段进行二分法求根。
#include <stdio.h>#include <math.h>
#define DEFAULT_UPPER (10)
#define DEFAULT_LOWER (-10)
#define DEFAULT_E (0.00000001)
#define _MID(x,y) ((x+y)/2)
#define _VALUE(x) (2*x*x*x-4*x*x+3*x-6)
double _e
int getRoot(double lower, double upper, double *result)
main()
{
double root
printf("Enter a deviation:")
scanf("%lf",& _e)
if(_e == 0.0)
_e = DEFAULT_E
if(getRoot(DEFAULT_LOWER, DEFAULT_UPPER, &root))
printf("Root:%2.8lf\n", root)
else
printf("Root:No Solution.\n")
}
int getRoot(double lower, double upper, double *result)
{
*result = _MID(lower,upper)
if(upper - lower <= _e)
return 1
if(_VALUE(lower)*_VALUE(*result) <= 0)
return getRoot(lower, *result, result)
else if(_VALUE(*result)*_VALUE(upper) <= 0)
return getRoot(*result, upper, result)
else
return 0
}
可以,只要在二分法外面,加一个循环就可以了.比如,以i为变量从1到1000,只要f(x(i-1))*f(xi)<0,然后在,i-1和i之间用二分法,就可以实现你的目的了.这是我第一次回答问题,希望能帮到你.