c++ - 牛顿法对某些多项式发散

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

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

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

最佳答案

我不确定您为什么会说它是发散的。

我以与您类似的方式实现了牛顿法:

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

关于c++ - 牛顿法对某些多项式发散,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33402371/

相关文章:

c++ - FileInformation - 提取文件重命名详细信息

创建一个迭代程序来估计多项式的根

c++ - Durand-Kerner 方法求非线性方程的根

assembly - ARM frsqrts 是否需要与额外的 fmul 指令一起使用以进行牛顿迭代?

python - scipy.optimize.newton 给出 TypeError : 'float' object is not callable

python - 给定小数位数的平方根的近似值

未调用 C++ 构造函数

c++ - 如何将初始化列表与基类一起使用?

c++ - 为什么 shared_ptr<> 必须分别为控制 block 和管理对象分配?

algorithm - 嵌套多项式时间函数