|
Текст подпрограммы и версий 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