我试图用二分法找到方程(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);
}
我在这里先向您的帮助表示感谢!
#include <cmath>
abs
(浮点绝对值)替换fabs
(整数绝对值)if (f(c) <= Epsilon)
而不是if (f(c) == 0)
,这是不太可能发生的。但无论如何你仍然需要检查是否有解决方案。如果猜测间隔中没有解,则函数中的循环永不停止。这留下了一个练习。
你的bisection
函数有一个无限循环。
if (f(a)*f(b)>0)
你确定在你的间隔内没有找到根;然后你继续尝试找到它。您无法找到存在根的子区域,因此您不会更改任何内容并重试。