【问题标题】:creating an iterative program to estimate the root of a polynomial创建一个迭代程序来估计多项式的根
【发布时间】:2011-07-22 07:57:38
【问题描述】:

我正在用 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 是计算多项式中一项的导数的函数。 不幸的是,这个程序产生了意想不到的结果。我不知道哪里错了,因为它编译并运行良好。有没有另一种方法可以使用牛顿法估计根。我如何改进程序以产生所需的结果。

【问题讨论】:

  • 牛顿的方法只会找到一个根。为什么不参考数值方法就从头开始编写。例如,数字食谱有一个代码。我相信 GSL 也是如此。这是作业吗?
  • 您只输入了 10 个系数,但现在它使用的是 11(系数 0-10)。我会从一个低阶多项式开始,然后在尝试之前先解决这个问题。另外,您的deri 对吗?它应该只是pow(x,idx-1)*idx。当您使用它时,您应该只从 1 而不是 0 开始遍历涉及 deri 的循环。如果您的 deri 函数不能正确处理 idx=0,那么这可能真的是把事情扔了.
  • @David 到底是哪一章。请指导我。
  • @Justin 我的 deri 是这样的 float deri(float x,int n) { float term_der = n*pow(x,n-1);返回术语_der; }
  • 即使我从 1 开始,错误仍然相同。我的系数现在是 11,因为我从 0 到 10 开始

标签: c numerical-methods polynomial-math


【解决方案1】:

这里有一些可能会有所帮助的事情:

  1. 发布函数。
  2. 发布您期望的根目录。
  3. 发布您获得的结果以及您提供的输入。
  4. 请大致了解您选择的起始条件,因为 N-R 等迭代方法可能会根据您的起始位置给出不同的结果。
  5. 告诉我们您为什么确定这不是 N-R 给您的局部最小值。
  6. deri() 函数是什么?那是你的吗?

【讨论】:

    【解决方案2】:

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

    在进入polypoly_der 中的循环之前执行total = 0.

    【讨论】:

    • 迭代已初始化,我已初始化总计。只是因为我没有将它包含在程序中。对于那个很抱歉。但是现在当我将 total 初始化为 0 时,发生了一些奇怪的事情。无论我输入哪个系数,我都会得到一个答案。我还是不知道怎么回事
    • @Wasswa:可能是因为用户输入了 10 个系数,但是你用 order 11 调用 polypoly_der
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多