Текст подпрограммы и версий zp11r_c.zip zp11c_c.zip |
Тексты тестовых примеров tzp11r_c.zip tzp11c_c.zip |
Вычисление корней полинома с вещественными коэффициентами методом Дженкинса - Трауба.
Подпрограмма 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