Уравнения n-ой степени

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

Наверх

Hosted by uCoz