0

我正在编写一个二分法算法来查找多项式的根。我的代码的第二部分说如果变量FP等于零或它的绝对值b-a只是打破了我猜的 if 语句。

我希望程序完全停止 for 循环(迭代)并返回 p。最后,我想打印获得解决方案所需的迭代次数,但显然使用我的 printf 语句它表明即使获得了根(零),程序也会继续执行。

关于如何停止整个机制并返回为零的 p 值和它所花费的确切迭代次数的任何想法?谢谢

double computeroots(double a, double b, double epsilon, int MaxIter)
{
    double FA = pow(a,4) -4*a +  1;
    double FB = pow(b,4) - 4*b + 1;
    double FP;
    double p;
    int i;

    for(i=0;i<MaxIter;i++) {
        if(FA * FB < 0) {
            p = a + (b-a)/2;
            FP = pow(p,4) - 4*p +1;
            if(FP == 0 || abs(b-a) < epsilon) {
                return p;
                break;
            } else if (FA * FP >0) {
                a =p;
                FA = FP;
            } else {
                b = p;
                FB = FP;
            }
            i++;
        }
    }

    printf("The number of iterations is: %d\n", i);
}
4

5 回答 5

3

你的printf陈述没有被击中,因为你return p;在陈述之前有一个break。一条return语句立即退出函数。

您需要将return语句移到 之后printf,或将 移到printf之前return

        if(FP == 0 || abs(b-a) < epsilon)
        {
            printf("the number of iterations is : %d\n", i);
            return p;
        }
        ...

    printf("failed to converge after %d iterations\n", i);
    return p;
}
于 2013-02-14T15:12:16.773 回答
1

要合并所有必要的修改:

double computeroots(
  double a, 
  double b, 
  double epsilon, 
  size_t MaxIter, 
  size_t * pNumIter
) 
{
    double FA = pow(a,4) -4*a +  1;
    double FB = pow(b,4) - 4*b + 1;
    double FP;
    double p = NaN;
    size_t i;

    for(i=0; i<MaxIter; ++i) {
        if(FA * FB < 0) {
            p = a + (b-a)/2;
            FP = pow(p,4) - 4*p +1;
            if(FP == 0 || abs(b-a) < epsilon) {
                break;
            } else if (FA * FP >0) {
                a =p;
                FA = FP;
            } else {
                b = p;
                FB = FP;
            }
        }
    }

    *pNumIter = i;

    printf("the number of iterations is : %z\n", *pNumIter);

    return p;
}

像这样称呼它:

double a, b, epsilon;
size_t sizeMax, sizeIterations;

... /* some initialisations here */

double d = computeroots(a, b, epsilon, sizeMax, &sizeIterations);

修改注意事项:

  • 删除错位return
  • 最后添加了缺少的回报
  • ints 改为 be size_t,作为一种unsigned更适合柜台的类型
  • 添加对附加size_t变量的引用以返回迭代次数
  • 删除了第二个增量i
于 2013-02-14T17:32:04.127 回答
1

如果你有一个return陈述,那么你的break陈述是没有用的。return 退出函数的范围并返回给调用者,因此之后不再执行指令。

所以这:

return p;
break;

应该变成:

printf("the number of iterations is : %d\n", i);
return p;

如果您发现退出条件选择不正确,我猜这更像是一个有限精度问题。你正在检查FP == 0但是FP是 a所以你必须在足够接近 0 时double停止,而不是在它完全相等时停止。FP例如:abs(FP) < epsilon

于 2013-02-14T15:13:57.260 回答
1

当您需要返回多个值时,您可以使用 out-arguments 来完成。将您的功能更改为

double computeroots(double a, double b, double epsilon, int MaxIter, int *numIterations)

像这样称呼它:

int numIter;
soln = computeroots(a, b, epsilon, MaxIter, &numIter);

在你的函数中,在返回之前,添加:

*numIterations = i;
于 2013-02-14T15:15:36.323 回答
0

您可以返回一个双精度数组,其中第一个元素是结果,第二个元素是迭代次数。

或者,您将变量的引用传递给函数,并分配给它,如下所示:

double compute_something(int param1, int param2, int* iterations) {
    // your code ...
    // when you want to return, use this:
    *iterations = 5;
    return 1.23;
    // your code ...
}

int iter;
double result = compute_something(1,2, &iter);

在此之后, result 包含结果,并 iter 您存储的迭代次数。此解决方案可能会更好,因为您没有将迭代次数(显然是整数)返回为双精度数。

于 2013-02-14T15:13:12.113 回答