Квадратные уравнения

В этом разделе рассматриваются решения квадратных уравнений.
Первые алгоритмы находят только действительные корни:

// a * x^2 + b * x + c = 0 - общее квадратное уравнение

unsigned int root2 ( double a, double b, double c, double x[2] )
{
    if ( a == 0 )
    {
        if ( c == 0 )
        {
            x[0] = 0.;
        }
        else
        {
            if ( b == 0 ) return 0;
            x[0] = -c / b;
        }
        return 1;
    }
    else
    {
        if ( c == 0 )
        {
            x[0] = 0.;
            x[1] = -b / a;
        }
        else
        {
            b *= -0.5;
            double d = b * b - a * c;
            if ( d < 0 ) return 0;
            d = sqrt ( d );
            double t = b > 0 ? b + d : b - d;
            x[0] = c / t;
            x[1] = t / a;
        }
    }
    return 2;
}

// x^2 + a * x + b = 0 - приведённое квадратное уравнение

unsigned int root2 ( double a, double b, double x[2] )
{
    if ( b == 0 )
    {
        x[0] = 0.;
        x[1] = -a;
    }
    else
    {
        a *= -0.5;
        double d = a * a - b;
        if ( d < 0 ) return 0;
        d = sqrt ( d );
        x[1] = a > 0 ? a + d : a - d;
        x[0] = b / x[1];
    }
    return 2;
}
Функции возвращают количество корней, а сами корни помещаются в массив x[2] по возрастанию модуля числа.
Исходники этих функций находятся в файле mathem.cpp.

Следующий алгоритм находит комплексные корни:
void root2 ( double a, double b, Complex & x1, Complex & x2 )
{
    if ( b == 0 )
    {
        x1.re = -a;
        x2.re = x1.im = x2.im = 0;
    }
    else
    {
        a *= -0.5;
        double d = a * a - b;
        if ( d < 0 )
        {
            x1.re = x2.re = a;
            x1.im = sqrt ( -d );
            x2.im = - x1.im;
        }
        else
        {
            d = sqrt ( d );
            x1.re = a > 0 ? a + d : a - d;
            x2.re = b / x1.re;
            x1.im = x2.im = 0;
        }
    }
}
Этот алгоритм решает уравнение с комплексными коэффициентами:
void root2 ( const Complex & a, const Complex & b, Complex & x1, Complex & x2 )
{
    if ( b.re == 0 && b.im == 0 )
    {
        x1 = b;
        x2 = -a;
    }
    else
    {
        const Complex c ( -0.5 * a.re, -0.5 * a.im );
        const Complex d = sqrt ( c * c - b );
        x1 = c - d;
        x2 = c + d;
    }
}
Описание типа Complex смотрите в разделе Класс Complex.
Исходники этих функций находятся в файле complex.cpp.

Наверх