0

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

我正在做的是这样的:

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

  2. 在 bisection() 函数中:

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

    b) for() 构造找到 a 的值,在该值之后 F(a) 的符号(大小)发生变化。

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

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

我得到的是:

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;
}
4

1 回答 1

2

这是因为aandb被声明为ints。当你写x = (a + b) / 2;时,右边的所有元素都是整数,所以它们将被评估为整数。此外,作为 和 的差ab1值将等于其中较小的一个,即a。这就是为什么x变得的价值1.0。要修复它,应将上限和下限声明为doubles,而不是ints。当ab是整数时,它们的值不能收敛到 的实际值x

此外,您正在使用%dinprintf写入一个double值。应该是%lf

于 2015-01-30T18:47:58.330 回答