假位置方法达到MAX迭代限制

时间:2014-12-17 10:37:11

标签: c numerical-methods

我正在尝试使用False Position Method编写一个程序来查找连续函数的根。但是,我一次又一次得到 c 的相同值,并将相同的值分配给 a ,从而达到MAX_ITER的限制。我该怎样避免这个?我没有正确使用算法吗?

#include<stdio.h>
#include<math.h>

#define F(x) ((2*x)+1)
#define ERROR 0.00001
#define MAX_ITER 1000

float FalsePosition(float a, float b)
{   
    float c;
    int iter = 0;
    do
    {
        c = (b - F(b)) * (b - a) / (F(b) - F(a));

        printf("F(a): %f, F(b) : %f, F(c) : %f, a: %f, b : %f, c : %f\n", F(a), F(b), F(c), a, b, c);

        if((F(c) > 0 && F(a) > 0) || (F(c) < 0 && F(a) < 0))
        {
            a = c;
        }
        else
        {
            b=c;
        }

        iter++;
    }
    while(fabsf(a-b) > ERROR && iter < MAX_ITER);
    return a;
}

int main()
{
    float a = -2.5;
    float b = 2.5;

    printf("Finding root in the interval [%f, %f]\n", a, b);

    if((F(a)>0 && F(b)>0) || (F(a)<0 && F(b)<0))
    {
        printf("No root lie in the interval [%f, %f]", a, b);
    }
    else
    {
        printf("The root is : %f\n", FalsePosition(a, b));
    }

    return 0;
}

1 个答案:

答案 0 :(得分:3)

c的公式错误,应该是

c = b - (f(b) * (b - a)) / (f(b) - f(a));

请参阅here

为防止达到MAX_ITER次迭代,您可能希望观看c之类的更改

previousValue = c;
c = b - (f(b) * (b - a)) / (f(b) - f(a));

然后,while条件将是

while ((fabs(previousValue - c) > ERROR) && (iter < MAX_ITER));

您可以将previousValue初始化为a,以便开始循环。 最后,您应该返回c而不是a