使用二等分求方程的根

时间:2019-03-04 16:47:03

标签: c

试图用二等分法求方程(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);
}

谢谢您的帮助!

2 个答案:

答案 0 :(得分:2)

  1. 您需要#include <cmath>
  2. 您需要将abs(整数绝对值)替换为fabs(浮点绝对值)
  3. 您需要检查Epsilon:if (f(c) <= Epsilon)而不是if (f(c) == 0),这不太可能发生。

但是无论如何,您仍然需要检查是否有 解决方案。如果猜测间隔中没有解决方案,则函数中的循环永远不会停止。这留作练习。

答案 1 :(得分:2)

您的bisection函数中有一个无限循环。

if (f(a)*f(b)>0),您确定在您的时间间隔内找不到根;然后继续尝试找到它。您无法找到存在根的子间隔,因此您无需进行任何更改就可以重试。