создание итерационной программы для оценки корня многочлена - PullRequest
0 голосов
/ 24 марта 2011

Создаю программу на 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;
}

Derive - функция, которая вычисляет производную члена в полиноме.К сожалению, эта программа дает неожиданные результаты.я не могу понять, где я не прав, потому что он компилируется и работает нормально.Есть ли другой способ, которым я могу оценить корень, используя метод Ньютона.Как я могу улучшить программу, чтобы она давала требуемые результаты.

Ответы [ 2 ]

5 голосов
/ 24 марта 2011

У вас есть несколько унифицированных переменных: total (дважды) и, по-видимому, iteration.Если вы не инициализируете переменную, ее значение не определено и может даже отличаться между запусками одной и той же программы.

Выполните total = 0. до ввода цикла в poly и poly_der.

3 голосов
/ 24 марта 2011

Вот некоторые вещи, которые могут помочь:

  1. Опубликовать функцию.
  2. Опубликуйте, что вы ожидаете, что корень будет.
  3. Опубликуйте полученный результат вместе с предоставленными вами данными.
  4. Дайте некоторое представление о том, какие начальные условия вы выбрали, поскольку итерационные методы, такие как N-R, могут давать разные результаты в зависимости от того, с чего вы начинаете.
  5. Скажите нам, почему вы уверены, что это не локальный минимум, который дал вам N-R.
  6. Что это за функция производная ()? Это твое?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...