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

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

Назначение

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

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

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

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

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

zp10r_c реализует метод Лагерра, имеющий кубическую сходимость для изолированных корней и линейную сходимость для кратных корней. Текущая итерация берется в качестве корня, когда значение полинома при этой итерации меньше, чем вычисленная граница ошибок округления при нахождении значения полинома для этой итерации. Степень исходного полинома уменьшается, когда найден вещественный корень или пара комплексных корней, после чего итерационный процесс применяется к полиному уменьшенной степени.

Дж.Х.Уилкинсон, Алгебраическая проблема собственных значений, "Наука", М., 1970.

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

    int zp10r_c (integer *np, real *a, complex *root, real *da,
            real *dz, integer *ierr)

Параметры

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

Версии: нет

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

zp14r_c - вычисление корней квадратного уравнения с вещественными коэффициентами;
zp14c_c - вычисление корней квадратного уравнения с комплексными коэффициентами;
utzp10_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы zp10r_c.

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

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

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

    /* Local variables */
    static int ierr;
    extern int zp10r_c(int *, float *, complex *, float *, float *, int *);
    static complex root[3];
    static float da[4], dz[4];
    static int np, i__;

    np = 3;
    zp10r_c(&np, a, root, da, dz, &ierr);

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


Результаты:

       root(1) = (1.0, 0.0) ,   root(2) = (1.0, 1.0) ,
       root(3) = (1.0, - 1.0) , ierr = 0