2015-10-28 14 views
1

Я попытался реализовать метод Ньютона для полиномов. Как:Метод Ньютона расходится для некоторых полиномов

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, которую я нашел, используя теорему Штурма.

Моя проблема заключается в том, что этот метод расходится для некоторых полиномов, таких как x^4+2x^3+2x^2+2x+1. Может быть, это не регулярно, но я заметил, что это происходит, когда решение уравнения является отрицательным числом. Где я могу найти объяснение?

Edit: дециграмм

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

где п степень полинома

+0

Набор начальных значений, которые сходятся к определенному корню, называется бассейном притяжения. Если вы Google, что вы обнаружите, что математика очень продвинута. –

+1

[Вы удивлены?] (Https://en.wikipedia.org/wiki/Newton_fractal) – imallett

+0

@PaulBoddington Похоже, что на самом деле у ОП была ошибка (или больше) в их коде, а не начальное значение за пределами бассейна Привлечение. Однако, похоже, что ОП предполагает, что метод Рафсона (ложно названный Ньютоном, который не смог его опубликовать) всегда должен сходиться. – Walter

ответ

2

Я не уверен, почему вы бы сказать, что это расходится.

я реализовал метод Ньютона подобно твоим:

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.

+0

hmm, моя программа должна быть гибкой для любого полинома, я написал g и dg, поэтому, возможно, это вызывает проблему. Не могли бы вы взглянуть на него? – adolzi

+0

Что вы имели в виду под переменными 'w' и' n' в ваших функциях 'g' и' dg'? Каково полное определение 'g' и' dg'? Это не должно быть проблемой, если 'g' и' dg' правильно определены, поэтому вы должны опубликовать свою реализацию, и таким образом мы могли видеть, что пошло не так. – dorverbin

+0

w - массив коэффициентов полинома, а n - степень. Я только что обновил свой пост dg definition – adolzi

 Смежные вопросы

  • Нет связанных вопросов^_^