牛顿的方法对于某些多项式是发散的

Newton's method is divergent for some polynomials

本文关键字:多项式 方法 于某些      更新时间:2023-10-16

我已经尝试实现多项式的牛顿方法。类似:

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++;
}

其中CCD_ 1计算函数的值并且CCD_。

作为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是多项式的次数

我不知道你为什么会说它是发散的。

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

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接近。