1、你把精确度设为1e-6。注意,float的有效数字只有6位,所以算到小数点后6位时,x1,x2,x的值很有可能就一样了,那么x,x1,x2的值将不将变化,而且肯定会大于1e-6,导致死循环。
解决方法是把所有数据改成double型。
2、仔细分析一下你的find函数吧,它求得的最后一个根区间有很大可能并不包含一个有效根。
比如我输入-10 10,那么,第一个根区间会是-10,-2,那么第2个区间就成了-2,11,第2个区间并不包含根。
解决方法是在调用bin_root前,判断一下polynomial(bot[i])*polynomial(top[i])<0
另外,你的find函数在生成最后一个根区间时,会出现x2比top1大1的情况。你自己改改吧。
我的代码如下:
#include "math.h"
#include "stdio.h"
double polynomial(double x)
{//多项式函数,用于给定多项式形式
double y
y=((3*x+6)*x-1)*x+2
return y
}//polynomial函数
int find(int *bot,int *top,int bot1,int top1)
{//根据多项式函数fun自动搜索求根区间,并把各个区间的上限和下限分别保存到top[]和bot[]数组中,返回包含根的区间个数
double y1,y2
int x1,x2
int count=0
x1=bot1
x2=bot1+1
while(x2<=top1)
{
y1=polynomial((double)x1)
y2=polynomial((double)x2)
while(y1*y2>0&&x2<=top1)
{
x2++
y2=polynomial((double)x2)
}
bot[count]=x1
top[count]=x2
count++
x1=x2
x2=x1+1
}
return count
}//find函数
double bin_root(int bot,int top)
{//函数功能,二分法求根
double y,y1,y2
double x1=bot,x2=top,x
x=(x1+x2)/2
y=polynomial(x)
y1=polynomial(x1)
y2=polynomial(x2)
while(fabs(y)>=1e-6)
{
if(y*y1<0)
{
x2=x
}
else
{
x1=x
}
x=(x1+x2)/2
y=polynomial(x)
y1=polynomial(x1)
y2=polynomial(x2)
}
return x
}//二分法求根bin_root函数
void main()
{
int count,bot[10],top[10]
int bot1,top1//由用户输入求根区间,程序自动找到该区间中存在的根的个数
int i
double root
printf("请输入求根区间:\n")
scanf("%d%d",&bot1,&top1)
count=find(bot,top,bot1,top1)
if(count==0)printf("函数在您输入的区间内无根:\n")
for(i=0i<counti++)
{
if(polynomial(bot[i])*polynomial(top[i])<0)
{
root=bin_root(bot[i],top[i])
printf("函数在子区间[%d,%d]内的根为:%.4f\n",bot[i],top[i],root)
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)