Текст подпрограммы и версий aeb1r_c.zip , aeb1d_c.zip |
Тексты тестовых примеров taeb1r_c.zip , taeb1d_c.zip |
Вычисление собственных значений вещественной симметрической ленточной матрицы с помощью Q*L - алгоритма.
Симметричная ленточная матрица приводится ортогональными преобразованиями Гивенса к симметрической трехдиагональной форме, которая используется для вычисления собственных значений исходной матрицы Q*L - алгоритмом.
Дж.Х.Уилкинсон, Агебраическая проблема собственных значений, "Наука", М., 1970.
int aeb1r_c (integer *n, integer *nc, real *a, real *ev, real * rab, integer *ierr)
Параметры
n - | порядок исходной матрицы (тип: целый); |
nc - | заданное число кодиагоналей исходной матрицы, включая главную диагональ (тип: целый); |
a - | вещественный двумерный массив размера n*nc, в котором задается исходная симметричная ленточная матрица в компактной форме; |
ev - | вещественный вектор длины n, содержащий вычисленные в возрастающем порядке собственные значения; |
rab - | вещественный вектор длины 2 на n, используемый как рабочий; |
ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом значение ierr полагается равным номеру собственного значения, для вычисления которого потребовалось более 30 итераций; в этом случае собственные значения с индексами 1, 2, ..., ierr - 1 вычислены правильно и расположены в возрастающем порядке, но они не обязательно являются самыми меньшими из всех n собственных значений. |
Версии
aeb1d_c - | вычисление собственных значений вещественной симметрической ленточной матрицы с помощью QL - алгоритма с двойной точностью. |
Вызываемые подпрограммы
utae10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограмм aeb1r_c, aeb1d_c. |
Замечания по использованию
Подпрограммы aeb1r_c, aeb1d_c не сохраняют исходную ленточную матрицу, но в последних двух столбцах массива a запоминается ее трехдиагональная форма. | |
В подпрограмме aeb1d_c параметры a, ev, rab имеют тип double. |
int main(void) { /* Builtin functions */ double pow_ri(float *, int *); /* Local variables */ static int ierr; extern int aeb1r_c(int *, int *, float *, float *, float *, int *); static float a[21] /* was [7][3] */; static int i__, n, nc, i; static float ev[7], rab[14]; 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; /* l11: */ a_ref(i__, 1) = 1.f; } nc = 3; n = 7; aeb1r_c(&n, &nc, a, ev, rab, &ierr); for (i = 1; i <= 7; ++i) { printf("\n %16.7e \n",ev[i-1]); } printf("\n %5i \n",ierr); return 0; } /* main */ Результаты:
Собственные значения:
| -5.67229125355d+00 | | 1.55306255671d+01 | | 1.01029233155d+02 | ev = | 1.00010119681d+03 | | 1.00000101005d+04 | | 1.00000001008d+05 | | 1.00000000011d+06 | ierr = 0