使用Bisection找到方程的根

问题描述 投票:0回答:2

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

我在这里先向您的帮助表示感谢!

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

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


2
投票

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

if (f(a)*f(b)>0)你确定在你的间隔内没有找到根;然后你继续尝试找到它。您无法找到存在根的子区域,因此您不会更改任何内容并重试。

© www.soinside.com 2019 - 2024. All rights reserved.