我编写了这个C代码,用二分法比较两个函数的根。我的第一个函数(g(x))执行正确,但是第二个函数(h(x))在屏幕上输出"#1QO“。我在密码里找不到我做错了什么。
你能解释一下吗?任何形式的帮助都会非常感谢。谢谢!
#include <stdio.h>
#include <math.h>
typedef double (*DFD) (double);
double g (double x)
{
double y;
y = pow (x,3) - pow (x,2)-1;
return y;
}
double h (double x)
{
double k;
k = 1.0 + (1.0/x) + (1.0 /pow (x,2));
return k;
}
double bisection (DFD f, double x0, double x1,double tol)
{
int i;
double middle;
for (i=1;i<=50;) {
middle = (x0+x1)/2.0;
if (fabs (middle - x0) <tol) return middle;
if (f(middle)* f(x0) <0.0) x1 = middle;
else x0 = middle;
}
}
int main () {
double root_gx, root_hx = 0.0;
root_gx = bisection (g,0,2,0.0005);
printf ("Root found using g(x) = %.3lf\n",root_gx);
root_hx = bisection (h,1,2,0.0005);
printf ("Root found using h(x) = %.3lf\n",root_hx);
printf ("Difference between the two roots = %.3lf\n", (fabs (root_gx- root_hx)));
return 0;
} 编辑:以二分法初始化i=1,并将bisection (h,0,2,0.0005)改为bisection (h,1,2,0.0005),谢谢大家!
发布于 2015-12-19 22:56:33
值未初始化,导致未定义的行为。被设定为某种价值。
// int i;
int i = 0;
...
for (;i<=50;) {i从不递增。
50是任意的。
建议使用double的二进制精度,因为bisection()将每次迭代减半。
for (i=0; i <= DBL_MANT_DIG; i++) {
...
}
return middle;还建议对算法进行更改,以允许更改小于0.0,以满足0.0的容忍度。
// if (fabs (middle - x0) <tol) return middle;
if (fabs (middle - x0) <= tol) return middle;发布于 2015-12-19 19:56:33
double h (double x)
{
double k;
k = 1.0 + (1.0/x) + (1.0 /pow (x,2));
return k;
}如果x==0.0,则除法为零。当您调用bisection (h,0,2,0.0005);时就会这样做,后者调用f(x0),在本例中是h(0.0);。
如果在函数中除以输入参数,则应始终检查输入参数的实际值是否等于0.0。
double h (double x)
{
if ( x == 0.0 ) return 1e99; // infinite
double k;
k = 1.0 + (1.0/x) + (1.0 /pow (x,2));
return k;
}https://stackoverflow.com/questions/34374709
复制相似问题