二分算法代码中的逻辑错误
Logical error in bisection algorithm code
我正在编写一个程序来演示二分法算法(来自数值方法)。
我做的是这样的:
定义了一个函数 F(int),它接受整数和 returns 该整数处多项式的值。
在 bisection() 函数中:
a) a,b 是初始近似值。
b) for() 构造找到 a 的值,之后 F(a) 的符号(大小)发生变化。
c) printfs 用于故障排除(最后一个除外)。
d) int prec 是解决方案所需的精度(迭代次数),其中没有。迭代次数,N=log((b-a)/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;
}
因为a
和b
被声明为int
。当你写 x = (a + b) / 2;
时,右边的所有元素都是整数,所以它们将被计算为整数。此外,由于a
和b
的差是1
,因此该值将等于其中较小的一个,即a
。这就是 x
的值变为 1.0
的原因。要修复它,上限和下限应声明为 double
s,而不是 int
s。当a
和b
为整数时,它们的值不能收敛到x
.
的实际值
此外,您在 printf
中使用 %d
写入 double
值。应该是 %lf
.
我正在编写一个程序来演示二分法算法(来自数值方法)。
我做的是这样的:
定义了一个函数 F(int),它接受整数和 returns 该整数处多项式的值。
在 bisection() 函数中:
a) a,b 是初始近似值。
b) for() 构造找到 a 的值,之后 F(a) 的符号(大小)发生变化。
c) printfs 用于故障排除(最后一个除外)。
d) int prec 是解决方案所需的精度(迭代次数),其中没有。迭代次数,N=log((b-a)/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;
}
因为a
和b
被声明为int
。当你写 x = (a + b) / 2;
时,右边的所有元素都是整数,所以它们将被计算为整数。此外,由于a
和b
的差是1
,因此该值将等于其中较小的一个,即a
。这就是 x
的值变为 1.0
的原因。要修复它,上限和下限应声明为 double
s,而不是 int
s。当a
和b
为整数时,它们的值不能收敛到x
.
此外,您在 printf
中使用 %d
写入 double
值。应该是 %lf
.