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

Будем рассматривать уравнения вида:

 x5 + a * x4 + b * x3 + c * x2 + d * x + e = 0

Как и все уравнения нечётных степеней, уравнение пятой степени всегда имеет по крайней мере один действительный корень. Определив отрезок, на концах которого полином имеет разные знаки, этот корень можно вычислить при помощи алгоритма zeroin. Затем, используя полученный корень, уравнение сводится к уравнению четвёртой степени:

Для нахождения действительных корней уравнения пятой степени предлагаю следующую функцию:

class Polynom5 : public MathFunc1
{
public:
    double a, b, c, d, e;

    double operator () ( double t ) const
    {
        return e + t * ( d + t * ( c + t * ( b + t * ( a + t ) ) ) );
    }
};

double root5 ( double & a, double & b, double & c, double & d, double e )
{
    if ( e == 0 ) return 0;
    double x;
    Polynom5 func;
    func.a = a;
    func.b = b;
    func.c = c;
    func.d = d;
    func.e = e;
    if ( e < 0 )
    {
        if ( func ( 1 ) < 0 )
        {
            double g = - e;
            if ( d < 0 ) g -= d;
            if ( c < 0 ) g -= c;
            if ( b < 0 ) g -= b;
            if ( a < 0 ) g -= a;
            zeroin ( 1, g, func, 0, x );
        }
        else
            zeroin ( 0, 1, func, 0, x );
    }
    else
    {
        if ( func ( -1 ) > 0 )
        {
            double g = - e;
            if ( d < 0 ) g += d;
            if ( c > 0 ) g -= c;
            if ( b < 0 ) g += b;
            if ( a > 0 ) g -= a;
            zeroin ( g, -1, func, 0, x );
        }
        else
            zeroin ( -1, 0, func, 0, x );
    }
    a += x;
    b += x * a;
    c += x * b;
    d += x * c;
    return x;
}

nat root5 ( double a, double b, double c, double d, double e, double * x )
{
    x[0] = root5 ( a, b, c, d, e );
    return 1 + root4 ( a, b, c, d, x+1 );
}
Исходники этой функции находятся в файле mathem.cpp.

Следующая функция, кроме вещественных корней, вычисляет также комплексные корни:

void root5 ( double a, double b, double c, double d, double e, double & x1,
             Complex & x2, Complex & x3, Complex & x4, Complex & x5 )
{
    x1 = root5 ( a, b, c, d, e );
    root4 ( a, b, c, d, x2, x3, x4, x5 );
}
Исходники этой функции находятся в файле complex.cpp.
Описание типа Complex смотрите в разделе Класс Complex.

Наверх