Текст подпрограммы и версий
zp12c_c.zip 
Тексты тестовых примеров
tzp12c_c.zip 

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

Назначение

Вычисление корней полинома с комплексными коэффициентами методом наискорейшего спуска.

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

zp12c_c вычисляет NР комплексных корней полинома

       A(1) + A(2)*X + ... + A(NP)*X(NP - 1) + A(NP + 1)*X(NP) , 

с комплексными коэффициентами  А ( I ),  I = 1, 2, ..., NР + 1.

Реализуется модифицированный метод наискорейшего спуска.

Воеводин В.В., Павленко О.А. Модифицированный метод наискорейшего спуска для определения всех корней полинома, в Сб. "Численный анализ на Фортране", вып.27, изд - во МГУ, 1980.

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

    int zp12c_c (integer *np, complex *a, complex *d, complex *root,
            integer *ierr)

Параметры

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

Версии: нет

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

gsu2r_c - счетчик псевдослучайных чисел.
utzp12_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы zp12c_c.

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

  Используются служебные подпрограммы: zp12c1_c, zp12c2_c, zp12c3_c, zp12c4_c, zp12c5_c.

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

int main(void)
{
    /* System generated locals */
    int i__1;

    /* Local variables */
    extern int zp12c_c(int *, complex *, complex *, complex *, int *);
    static int ierr;
    static complex root[4], a[4], d__[4];
    static int i__, np;

    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;
    np = 3;
    zp12c_c(&np, a, d__, root, &ierr);

    printf("\n %5i \n", ierr);
    i__1 = np;
    for (i__ = 1; i__ <= i__1; ++i__) {
         printf("\n %18.11e %18.11e \n", root[i__ - 1].r, root[i__ - 1].i);
    }
    return 0;
} /* main */


Результаты:

       ierr  =  0

       root(1)  =  (1., 2.)
       root(2)  =  (1., 1.)
       root(3)  =  (1., 3.)