二分算法代码中的逻辑错误

时间:2015-01-30 18:30:14

标签: c bisection

我正在编写一个程序来演示二分算法(来自数值方法)。

我正在做的是:

  1. 定义了一个函数F(int),它取整数并返回该整数的多项式的值。

  2. 在bisection()函数中:

    a)a,b是初始近似值。

    b)for()构造找到a的值,之后F(a)的符号(幅度)发生变化。

    c)printfs用于故障排除(最后一个除外)。

    d)int prec用于解决方案所需的精度(迭代次数),其中no。迭代次数,N = log((b-a)/ E),E = 10 ^( - prec)。

  3. 我得到的是:

    Output:
    
    a=1     F(a)=-0.207936
    
    a=1, b=2
    Approximation 0: x = 0  a=1072693248   b=1
    Approximation 1: x = 0  a=1072693248   b=1
    Approximation 2: x = 0  a=1072693248   b=1
    Approximation 3: x = 0  a=1072693248   b=1
    Approximation 4: x = 0  a=1072693248   b=1
    
    The solution is: x = 1.000000
    

    我试过评论N = ...语句并将常数整数赋给N,但没有效果。

    有趣的是,在for()构造中用变量x注释掉所有语句不会改变a和b的值。

    奇怪的是,如果声明x =(a + b)/ 2;被注释掉,然后a的值受x初始化的值的影响:

    i)a = 1072693248,当x = 1时,

    ii)当x = 0时,a = 0,b = 0

    iii)当x = -1时,a = -1074790400,b = 1

    我正在使用Microsoft Visual C ++ 2010 Express进行编译。

    请帮帮我。 这是代码:

    #include<stdio.h>
    #include<math.h>
    
    #define MIN -10
    
    double F(int x)
    {
        double y=(x*x)-(2*x)+0.792064;
    //  printf("\nx=%d y=%d",x,y);
        return y;
    }
    
    void bisection(int prec)
    {
        int a,b=0;
        int c,N=10,i;
        double x=0;
    
        for(a=MIN;(F(a)*F(a-1))>0;a++);
        printf("\na=%d  F(a)=%f",a,F(a));
    
    
        b=a+1;
        printf("\n\na=%d, b=%d",a,b);
        N=(log((float)(b-a))+5);
    
        for(i=0;i<N;i++)
        {
                x=(a+b)/2;
                printf("\nApproximation %d: x = %d\ta=%d   b=%d",i,x,a,b);
                if((F(a)*F(x)>0))
                    a=x;
                else
                    b=x;
        }
        printf("\n\nThe solution is: x = %f",x);
        getchar();
    }
    
    int main()
    {   
        bisection(4);
        return 0;
    }
    

1 个答案:

答案 0 :(得分:2)

这是因为ab被声明为int s。当您编写x = (a + b) / 2;时,右侧的所有元素都是整数,因此它们将被计算为整数。此外,由于ab之差为1,因此该值将等于其中较小的一个,即a。这就是为什么x的价值变为1.0的原因。要修复它,上限和下限应声明为double s,而不是int s。当ab为整数时,其值无法收敛到x的实际值。

此外,您在%d中使用printf来撰写double值。它应该是%lf

相关问题