|
В этом разделе рассматриваются решения квадратных уравнений.
// 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. Наверх
|