Текст подпрограммы и версий
zp17r_c.zip  zp17d_c.zip 
Тексты тестовых примеров
tzp17r_c.zip  tzp17d_c.zip 

Подпрограмма:  zp17r_c

Назначение

Вычисление корней уравнения четвертой степени с вещественными коэффициентами.

Математическое описание

Подпрограмма zp17r_c вычисляет корни уравнения четвертой степени

       A(1)*X4 + A(2)*X3 + A(3)*X2 + A(4)*X + A(5)  =  0.0  , 

в котором коэффициенты  А ( I ),  I = 1, 2, 3, 4, 5 являются вещественными.

Использование

    int zp17r_c (real *a, integer *nreal, real *root,
            integer *ierr)

Параметры

a - вещественный вектор длины 5, содержащий коэффициенты исходного уравнения;
nreal - целая переменная, значение которой в результате работы подпрограммы полагается равным числу вещественных корней уравнения;
root - вещественный вектор длины 4, содержащий вычисленные корни;
ierr - целая переменная, значение которой в результате работы подпрограммы полагается равным 65, если коэффициент  A (1) при старшей степени равен 0.

Версии

zp17d_c - вычисление корней уравнения четвертой степени с вещественными коэффициентами с повышенной точностью. При этом векторы a и root должны иметь тип double.

Вызываемые подпрограммы

zp16r_c - вычисление корней уравнения третьей степени с вещественными коэффициентами. Используется в подпрограмме zp17r_c.
utzp10_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы zp17r_c.
zp16d_c - вычисление корней уравнения третьей степени с вещественными коэффициентами с повышенной точностью. Используется в подпрограмме zp17d_c.
utzp11_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы zp17d_c.

Замечания по использованию

 

Если nreal = 0, то вычисленные корни имеют вид root (1) ± root (2) i и root (3) ± root (4) i, при этом root (2) > 0. и root (4) > 0.

Если nreal = 2, то root (1) ≤ root (2), а вторая пара корней имеет вид root (3) ± root (4) i, при этом root (4) > 0.

Если nreal = 4, то root (1) ≤ root (2) ≤ root (3) ≤ root (4).

Пример использования

int main(void)
{
    /* Initialized data */
    static float a[5] = { 1.f,-10.f,35.f,-50.f,24.f };

    /* Local variables */
    static int ierr;
    static float root[4];
    extern int zp17r_c(float *, int *, float *, int *);
    static int nreal, i__;

    zp17r_c(a, &nreal, root, &ierr);

    for (i__ = 1; i__ <= 5; ++i__) {
         printf("\n %16.7e \n", a[i__ - 1]);
    }
    printf("\n %5i \n", nreal);
    printf("\n %16.7e %16.7e %16.7e %16.7e \n",
           root[0], root[1], root[2], root[3]);
    printf("\n %5i \n", ierr);
    return 0;
} /* main */


Результаты: 

       root(1) = 1. ,  root(2) = 2. ,  root(3) = 3. ,  root(4) = 4. ,
       nreal   = 4 ,    ierr = 0