【问题标题】:Newton's method is divergent for some polynomials牛顿法对于某些多项式是发散的
【发布时间】:2015-10-28 22:00:55
【问题描述】:

我尝试实现多项式的牛顿法。喜欢:

double xn=x0;
double gxn=g(w, n, xn);

int i=0;
while(abs(gxn)>e && i<100){
    xn=xn-(gxn/dg(w, n, xn));
    gxn=g(w, n, xn);

    i++;
}

其中g(w, n, xn) 计算函数的值,dg(w, n, xn) 计算导数。

作为x0,我使用起点M,这是我使用Sturm定理找到的。

我的问题是这种方法对于像x^4+2x^3+2x^2+2x+1 这样的一些多项式是发散的。也许它不规则,但我注意到它发生在方程的解为负数时。我在哪里可以找到解释?

编辑: dg

double result=0;
for(int i=0; i<n+1; i++)
    result+=w[i]*(n-i)*pow(x, n-i-1);

其中 n 是多项式的次数

【问题讨论】:

  • 收敛到特定根的一组起始值称为吸引力盆地。如果你用谷歌搜索,你会发现数学非常先进。
  • @PaulBoddington 看来,OP 在他们的代码中实际上有一个错误(或更多),而不是吸引力盆地之外的起始值。但是,OP 似乎假设 Raphson 的方法(错误地称为牛顿的方法——未能发表)应该总是收敛的。

标签: c++ polynomial-math newtons-method convergence


【解决方案1】:

我不知道你为什么会说它是分歧的。

我实现的牛顿方法和你的类似:

double g(int w[], int n, double x) {
    double result = 0;
    for (int i = 0; i < n + 1; i++)
        result += w[i] * pow(x, n - i);
    return result;
}

double dg_dx(int w[], int n, double x) {
    double result = 0;
    for (int i = 0; i < n ; i++)
        result += w[i] * (n - i) * pow(x, n - i - 1);
    return result;
}

int main() {

    double xn = 0;        // Choose initial value. I chose 0.
    double gx;
    double dg_dx_x;
    int w[] = { 1, 2, 2, 2, 1 };
    int i = 0;
    int n = 4;

    do {
        gx = g(w, n, xn);
        dg_dx_x = dg_dx(w, n, xn);
        xn = xn - (gx / dg_dx_x);
        i++;
    } while (abs(gx) > 10e-5 && i < 100);

    std::cout << xn << '\n';
}

它产生-0.997576,它接近解决方案-1

【讨论】:

  • 嗯,我的程序对任何多项式都应该是灵活的,我写了 g 和 dg,所以也许它会导致问题。可以看看吗?
  • 函数gdg 中的变量wn 是什么意思? gdg 的完整定义是什么?如果 gdg 定义正确,这应该不是问题,因此您应该发布您的实现,这样我们就可以看到出了什么问题。
  • w 是多项式系数的数组,n 是次数。我刚刚更新了我的 dg 定义帖子
  • 我想知道我是否应该使用霍纳来计算 g 和 dg ?
  • 我已经编辑了我的答案,以使程序适合所有使用 w[] 和 n 的多项式。它工作正常。主要区别,我猜这是你的问题,是在我称为dg_dx 的导数函数中,for 循环中的停止条件应该是i &lt; n,因为常数的导数为零。
猜你喜欢
  • 2021-11-27
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2017-05-05
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
相关资源
最近更新 更多