试图用二等分法求方程(x ^ 3)-(x ^ 2)+2的根。为此,我从用户那里获取了两个值作为初始猜测(此处称为极限),然后收敛到函数变为0的值。但是,每当我更改极限时,该值也相差很大,并且没有它们接近实际值。有什么建议我可能错了吗?
代码如下:
#include<stdio.h>
#include<cstdlib>
# define Epsilon 0.0001
float f(float x)
{
return x*x*x-x*x+2;
}
float bisection(float a, float b)
{
if(f(a)*f(b)>0)
{
printf("No root within this interval.");
}
float c=a;
while(abs(b-a)>Epsilon)
{
c=(a+b)/2;
if(f(a)*f(c)<0)
{
b=c;
}
else if(f(b)*f(c)<0)
{
a=c;
}
else if(f(c)==0)
{
printf("The root of x^3-x^2+2 is %f",c);
break;
}
}
printf("The root of x^3-x^2+2 is %f",c);
}
int main(void)
{
float u,l;
printf("Enter upper limit:\n");
scanf("%f",&u);
printf("Enter lower limit:\n");
scanf(" %f",&l);
bisection(l,u);
}
谢谢您的帮助!
答案 0 :(得分:2)
#include <cmath>
abs
(整数绝对值)替换为fabs
(浮点绝对值)if (f(c) <= Epsilon)
而不是if (f(c) == 0)
,这不太可能发生。但是无论如何,您仍然需要检查是否有 解决方案。如果猜测间隔中没有解决方案,则函数中的循环永远不会停止。这留作练习。
答案 1 :(得分:2)
您的bisection
函数中有一个无限循环。
if (f(a)*f(b)>0)
,您确定在您的时间间隔内找不到根;然后继续尝试找到它。您无法找到存在根的子间隔,因此您无需进行任何更改就可以重试。