Нас попросили оценить данный многочлен в определенных корнях, используя метод Хорнера. Итак, у меня есть эта функция с именем 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. Я правильно реализую алгоритм?