Текст подпрограммы и версий aeb3r_c.zip , aeb3d_c.zip |
Тексты тестовых примеров taeb3r_c.zip , taeb3d_c.zip |
Вычисление собственных значений вещественной симметрической ленточной матрицы, принадлежащих заданному интервалу, и их номеров.
Симметричная ленточная матрица приводится ортогональными преобразованиями Гивенса к трехдиагональной форме, которая используется для вычисления методом бисекций собственных значений, принадлежащих заданному интервалу, и их номеров.
Дж.Х.Уилкинсон, Агебраическая проблема собственных значений, "Наука", М., 1970.
int aeb3r_c (integer *n, integer *nc, integer *mm, integer *m, real *rlb, real *rub, real *a, real *ev, integer *irab, real *rab, integer *ierr)
Параметры
n - | порядок исходной ленточной матрицы (тип: целый); |
nc - | заданное число кодиагоналей исходной матрицы, включая главную диагональ (тип: целый); |
mm - | оценка сверху числа собственных значений исходной матрицы, принадлежащих заданному интервалу (тип: целый); если фактическое число собственных значений m, принадлежащих заданному интервалу, больше, чем mm, то собственные значения не вычисляются; |
m - | целая переменная, в которой запоминается вычисленное число собственных значений, принадлежащих заданному интервалу; |
rlb - rub | заданные нижняя и верхняя границы интервала собственных значений (тип: вещественный); если rlb > rub, то собственные значения не вычисляются; |
a - | вещественный двумерный массив размера n*nc, в котором задается исходная симметричная ленточная матрица в компактной форме; |
ev - | вещественный вектор длины mm, содержащий вычисленные в возрастающем порядке собственные значения; |
irab - | целый вектор длины mm, содержащий индексы расположенных в возрастающем порядке m вычисленных собственных значений; |
rab - | вещественный вектор длины 5*n, используемый как рабочий; |
ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом значение ierr полагается равным 3*n+1, если значение mm меньше истинного числа m собственных значений на интервале. |
Версии
aeb3d_c - | вычисление собственных значений вещественной симметрической ленточной матрицы, принадлежащих заданному интервалу, и их номеров с двойной точностью. |
Вызываемые подпрограммы
utae10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограмм aeb3r_c, aeb3d_c. |
Замечания по использованию
Подпрограммы aeb3r_c, aeb3d_c не сохраняют исходную ленточную матрицу, но в последних двух столбцах массива a запоминается ее трехдиагональная форма. | |
В подпрограмме aeb3d_c параметры a, ev, rab, rlb, rub имеют тип double . |
int main(void) { /* Builtin functions */ double pow_ri(float *, int *); /* Local variables */ static int ierr; extern int aeb3r_c(int *, int *, int *, int *, float *, float *, float *, float *, int *, float *, int *); static int irab1[7]; static float a[21] /* was [7][3] */; static int i__, m, n, mb, mm, j; static float ev[7], rab[35], rlb, rub; int i__1; #define a_ref(a_1,a_2) a[(a_2)*7 + a_1 - 8] for (i__ = 1; i__ <= 7; ++i__) { i__1 = 7 - i__; a_ref(i__, 3) = (float)pow_ri(&c_b2, &i__1); a_ref(i__, 2) = 10.f; /* l1: */ a_ref(i__, 1) = 1.f; } n = 7; mb = 3; mm = 7; rlb = -6.f; rub = 1e7f; aeb3r_c(&n, &mb, &mm, &m, &rlb, &rub, a, ev, irab1, rab, &ierr); for (j = 1; j <= 7; ++j) { printf("\n %15.7e \n", ev[j-1]); } printf("\n %5i \n", ierr); return 0; } /* main */ Результаты:
Собственные значения в интервале (-6.d0, 10.d0**7) :
| -5.67228961584d+00 | | 1.55306282219d+01 | | 1.01029236853d+02 | ev = | 1.00010120030d+03 | , ierr = 0 | 1.00000101020d+04 | | 1.00000001010d+05 | | 1.00000000011d+06 |