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

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

// x^2 + a * x + b = 0

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

Наверх


Hosted by uCoz