Для того, чтобы найти все корни уравнения 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. Наверх |