0

我正在用 c 创建一个程序,该程序假设使用牛顿拉夫森方法估计 10 阶多项式的根。用户输入 10 个系数,假设估计方程的根。绝对相对误差为 0.00000001,允许的最大迭代次数为 70。示例代码如下。

   n=0;
    while(abserr<=0.00000001){
    yold=y;
    y = y-(poly(y,coefficients,11)/poly_der(y,coefficients,11));
    ynew = y;
    error=ynew-yold;
    abserr=sqrt(error*error);

    printf("iteration x%d = %.2f error =%.2f\n",n+1,y,abserr);
    n++;
    iteration++;

    if(iteration==70){
    printf("you have reached the maximum number of iterations\n");
    break;}
    }

函数 poly 和 poly_der 分别计算多项式的值及其导数。定义如下。

float poly(float x, float coefficients[], int order)
    {
     int idx;
     float total;

     for (idx = 0; idx < order; idx++)
        total += coefficients[idx] * pow(x, idx);
        return total;
     }

   float poly_der(float x, float coefficients[], int order)
{
    int idx;
    float total;

    for (idx = 0; idx < order; idx++)
        total += coefficients[idx] * deri(x, idx);
    return total;
}

deri 是计算多项式中一项的导数的函数。不幸的是,这个程序产生了意想不到的结果。我不知道哪里错了,因为它编译并运行良好。有没有另一种方法可以使用牛顿法估计根。我怎样才能改进程序,使其产生所需的结果。

4

2 回答 2

5

你有几个统一的变量:(total两次)并且看起来iteration也一样。如果你不初始化一个变量,它的值是未定义的,甚至在同一程序的运行之间可能会有所不同。

total = 0.在进入循环之前做polyand poly_der

于 2011-03-24T17:22:52.367 回答
3

以下是一些可能有帮助的事情:

  1. 发布功能。
  2. 发布您期望的根。
  3. 发布您得到的结果以及您提供的输入。
  4. 给出您选择的起始条件的一些想法,因为像 NR 这样的迭代方法可以根据您的起始位置给出不同的结果。
  5. 告诉我们为什么您确定这不是 NR 给您的当地最低标准。
  6. 那个 deri() 函数是什么?那是你的吗?
于 2011-03-24T17:21:41.143 回答