Текст подпрограммы и версий
zp11r_c.zip  zp11c_c.zip 
Тексты тестовых примеров
tzp11r_c.zip  tzp11c_c.zip 

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

Назначение

Вычисление корней полинома с вещественными коэффициентами методом Дженкинса - Трауба.

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

Подпрограмма zp11r_c вычисляет NР вещественных и комплексных корней полинома

      A(1) + A(2)*X + A(3)*X2 + ... + A(NP + 1)*XNP , 

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

М.А.Jenkins, J.F.Тraub, A  Тhree - Stage Аlgorithm for Real Pоlinomials Using Quadratic Iteration, SIАМ Journal on Numerical Аnalysis, 7, 1970.

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

    int zp11r_c (integer *np, real *a, complex *root, real *rab,
            integer *ierr)

Параметры

np - заданная степень полинома (тип: целый);
a - вещественный вектор длины np + 1, содержащий коэффициенты исходного полинома в порядке возрастания степеней;
root - комплексный вектор длины np, содержащий вычисленные корни;
rab - вещественный вектор длины 7 * (np + 1), используемый в подпрограмме как рабочий;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом
ierr=65 - когда степень полинома меньше 1;
ierr=66 - когда коэффициент A (np + 1) при старшей степени равен 0;
ierr=67 - когда вычислено меньше корней, чем степень полинома; соответствующее число корней в конце вектора root полагаются равными (3.4e38, 3.4e38).

Версии

zp11c_c - вычисление корней полинома с комплексными коэффициентами методом Дженкинса - Трауба. Тем самым, вектор a имеет тип complex.

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

utzp10_c - подпрограмма выдачи диагностических сообщений при работе подпрограмм zp11r_c и zp11c_c.

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

 

Подпрограмма zp11r_c использует внешние структуры с именами pp11r_ и prpqlj_, а также служебные подпрограммы zrpqlb_c, zrpqlc_c, zrpqld_c, zrpqle_c, zrpqlf_c, zrpqlg_c, zrpqlh_c, zrpqli_c.

В подпрограмме zp11c_c вещественный вектор rab имеет длину 10 * (np + 1) и использует внешние структуры с именами pp11c_ и pcpqln_, а также служебные подпрограммы zcpqlb_c, zcpqlc_c, zcpqld_c, zcpqle_c, zcpqlf_c, zcpqlg_c, zcpqlh_c, zcpqli_c, zcpqlj_c, zcpqlk_c, zcpqll_c, zcpqlm_c.

Алгоритм, реализованный в подпрограмме zp11c_c изложен в статье

M.A.Jenkins, J.F.Traub, A  Three - Stage Variable - Shift Iteration for Polinomial Zeros and its Relation то Generalized Rayleigh Iteration, Number. Mатн., 14, 1970.

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

1.
int main(void)
{
    /* Initialized data */
    static float a[4] = { -2.f,4.f,-3.f,1.f };

    /* Local variables */
    static int ierr;
    extern int zp11r_c(int *, float *, complex *, float *, int *);
    static complex root[3];
    static int np, i__;
    static float rab[28];

    np = 3;
    zp11r_c(&np, a, root, rab, &ierr);

    printf("\n %5i \n", ierr);
    printf("\n %5i \n", np);
    for (i__ = 1; i__ <= 4; ++i__) {
         printf("\n %15.7e \n", a[i__ - 1]);
    }
    for (i__ = 1; i__ <= 3; ++i__) {
         printf("\n %15.7e %15.7e \n", root[i__ - 1].r, root[i__ - 1].i);
    }
    for (i__ = 0; i__ <= 24; i__ += 4) {
         printf("\n %15.7e %15.7e %15.7e %15.7e \n",
                rab[i__], rab[i__ + 1], rab[i__ + 2], rab[i__ + 3]);
    }
    return 0;
} /* main */


Результаты:
       
       root(1) = (1.0, 0.0) ,    root(2) = (1.0, 1.0)
       root(3) = (1.0, - 1.0) ,  ierr = 0

2.
int main(void)
{
    /* Local variables */
    extern int zp11c_c(int *, complex *, complex *, float *, int *);
    static int ierr;
    static complex a[4], z__[3];
    static int np, i__;
    static float rab[40];

    np = 3;
    a[0].r = 10.f, a[0].i = 0.f;
    a[1].r = -8.f, a[1].i = 12.f;
    a[2].r = -3.f, a[2].i = -6.f;
    a[3].r = 1.f, a[3].i = 0.f;
    zp11c_c(&np, a, z__, rab, &ierr);

    printf("\n %5i \n", ierr);
    printf("\n %5i \n", np);
    for (i__ = 1; i__ <= 4; ++i__) {
         printf("\n %10.3e %10.3e \n", a[i__ - 1].r, a[i__ - 1].i);
    }
    for (i__ = 1; i__ <= 3; ++i__) {
         printf("\n   %10.3e %10.3e \n", z__[i__ - 1].r, z__[i__ - 1].i);
    }
    for (i__ = 0; i__ <= 36; i__ += 4) {
         printf("\n %10.3e %10.3e %10.3e %10.3e \n",
                rab[i__], rab[i__ + 1], rab[i__ + 2], rab[i__ + 3]);
    }
    return 0;
} /* main */

Результаты:

       z__ = (1.0, 1.0), (1.0, 2.0), (1.0, 3.0)
       ierr = 0