Сложный двойной возврат переменной (NaN) при использовании метода Хорнера для оценки полиномов - PullRequest
0 голосов
/ 17 марта 2020

Нас попросили оценить данный многочлен в определенных корнях, используя метод Хорнера. Итак, у меня есть эта функция с именем useHorner ()

complex <long double> useHorner (vector<long double> coeff, complex<long double> x)
{
  //Evaluating polynomial at identified roots using Horner's Method
  complex<long double> answer=coeff[0]; 
  for(int i = 1; i<coeff.size(); i++)
  {
     answer = answer*x+coeff[i]; 
  }
  return answer;
}

• Переменная coeff - это длинный двойной вектор, который содержит числовые коэффициенты полинома. Например:
Дан полином = 1 (x ^ 3) -13 (x) -12
Переменная coeff будет содержать [1, 0, -13, -12]
(обратите внимание, что коэффициенты расположены от коэффициента с наивысшей степенью к коэффициенту с наименьшей степенью)

• Переменная x представляет собой сложный длинный дубль, который содержит сложные корни, которые мы пытаемся оценить. Один root для полинома выше будет (1.0000, 0.0000), где 1.0000 - это действительное root, а 0.000 - это воображаемое root.


Ниже приведен воспроизводимый код:

#include <iostream>
#include <vector>
#include <complex>

using namespace std; 

complex <long double> useHorner (vector<long double> coeff, complex<long double> x); 



int main()
{
    //numerical coefficients of the polynomial with increasing power
    // POLYNOMIAL 1(x ^ 3) -13( x ) -12
    vector <long double> coeffForEval{1, 0, -13, -12}; 

    long double roots[coeffForEval.size()-1][2]; 

    roots[0][0] = -1; 
    roots[0][1] = 0; 

    roots[1][0] = 4;    
    roots[1][1] = 0; 

    roots[2][0] = -3; 
    roots[2][1] =  0; 



    cout << endl << "Evaluating polynomial at identified roots: " << endl;
    for(int i = 0; i<coeffForEval.size()-1; i++)
    {
        complex<long double> x(roots[i][0],roots[i][1]); 
        cout << "f(" << roots[i][0] << ", " << roots[i][1] << ") = " 
        << (useHorner(coeffForEval, x)) << endl;
    }
    return 0; 
}


complex <long double> useHorner (vector<long double> coeff, complex<long double> x)
{
  //Evaluating polynomial at identified roots using Horner's Method
  complex<long double> answer(0); 
  for(int i = 0; i<coeff.size(); i++)
  {
     answer = answer*x+coeff[i]; 
  }
  return answer;
}



Оценка полинома на определенных корнях:
f (-1, 0) = (0,0)
f (4, 0) = (0,0)
f (-3,0) = (0,0)


[РЕДАКТИРОВАТЬ] Воспроизводимый код работает и возвращает правильные результаты, однако реализация этого в моем исходном файле все еще возвращает NaN. Единственное отличие состоит в том, что значения внутри массива корней имеют разную точность:

[ORIGNAL]
корни [0] [0] = - 1,000000
корни [0] [1] = 0,000000
корни [0] [0] = 4,000000
корни [0] [1] = 0,000000
корни [0] [0] = -3,000000
корни [0] [1] = 0,000000
[ВОСПРОИЗВЕДЕНО]
корни [0] [0] = -1
корни [0] [1] = 0
корни [0] [0] = 4
корни [0] [1] = 0
корни [0] [0] = -3
корни [0] [1] = 0

ПРОБЛЕМА : Первая оценка всегда возвращает NaN.

ВЫХОД ДЛЯ ЭТОГО ИСПЫТАТЕЛЬНОГО СЛУЧАЯ:
Оценка полинома на идентифицированных корнях:
f (-1.000000, 0.000000) = (nan, nan)
f (4.000000, 0.000000) = (-0.000000,0.000000)
f (-3.000000, 0.000000) = (-0.000000,0.000000)

Отслеживание выходных данных кажется, что умножение answer на x в первой итерации приводит к выводу NaN. Я правильно реализую алгоритм?

...