Для того, чтобы найти все корни уравнения n-ой степени можно построить матрицу, собственные значения которой
будут равны корням исходного уравнения, а затем найти собственные значения этой матрицы.
Для уравнения xn + p1xn-1 + ... + pn-1x + pn = 0
такая матрица может быть задана в верхней форме Хессенберга:
-p1 -p2 ... -pn-1 -pn 1 0 ... 0 0 0 1 ... 0 0 ................. 0 0 ... 1 0Собственные значения этой матрицы можно получить при помощи функции hqr из раздела Собственные значения матрицы. Отсюда получается простая программа rootN:
bool rootN ( unsigned int n, const double * p, double * r, double * i )
{
if ( n == 0 ) return false;
if ( n == 1 )
{
r[0] = - p[0];
i[0] = 0.;
return true;
}
Matrix a ( n, n );
a.fill ( 0. );
a[0][0] = - p[0];
for ( unsigned int k = 1; k < n; ++k )
{
a[0][k] = - p[k];
a[k][k-1] = 1.;
}
return hqr ( n, a, r, i );
}
Входные данные - степень и параметры многочлена. Выходные - действительная и мнимая части корней уравнения.
Опыт показал, что в случае кратных корней точность заметно ухудшается.
Описание класса Matrix находится здесь. Исходники находятся в файле mathem.cpp. Наверх |