Текст подпрограммы и версий zp12c_c.zip |
Тексты тестовых примеров tzp12c_c.zip |
Вычисление корней полинома с комплексными коэффициентами методом наискорейшего спуска.
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.)