Текст подпрограммы и версий afh4r_c.zip , afh4d_c.zip |
Тексты тестовых примеров tafh4r_c.zip , tafh4d_c.zip |
Приведение вещественной симметрической матрицы к симметрической трехдиагональной матрице ортогональными преобразованиями подобия.
Подпрограмма afh4r_c реализует алгоритм приведения симметрической матрицы А ортогональными подобными преобразованиями к симметрической трехдиагональной форме F = QTАQ, где Q - пpоизведение оpтогональных симметpических матpиц отpажения.
Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра, М., "Машиностроение", 1976.
int afh4r_c (integer *n, real *a, real *d, real *e)
Параметры
n - | порядок исходной матрицы (тип: целый); |
a - | вещественный двумерный массив размера n*n, содержащий симметрическую матрицу; в результате работы подпрограммы в поддиагональной части массива a в последовательных строках запоминаются векторы, порождающие матрицы отражения Q1, ..., Qn - 2; |
d - | вещественный вектор длины n, содержащий диагональные элементы трехдиагональной матрицы; |
e - | вещественный вектор длины n, содержащий в последних n - 1 компонентах поддиагональные элементы симметрической трехдиагональной матрицы. Первый элемент e произволен. |
Версии
afh4d_c - | приведение симметрической матрицы, заданной с удвоенной точностью, к симметрической трехдиагональной матрице ортогональными преобразованиями подобия. |
Вызываемые подпрограммы: нет
Замечания по использованию
Исходную матрицу A можно задавать лишь нижним треугольником. Подпрограмма afh4r_c сохраняет только полный верхний треугольник массива a, в остальных компонентах этого массива размещается информация об ортогональных преобразованиях. |
int main(void) { /* Initialized data */ static float a[16] /* was [4][4] */ = { 1.f,.42f,.54f,.66f,.42f,1.f,.32f, .44f,.54f,.32f,1.f,.22f,.66f,.44f,.22f,1.f }; /* Local variables */ extern int afh4r_c(int *, float *, float *, float *); static int i__; static float ev[4], rab[4]; #define a_ref(a_1,a_2) a[(a_2)*4 + a_1 - 5] for (i__ = 1; i__ <= 4; ++i__) { printf("\n %10.2f %10.2f %10.2f %10.2f \n", a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3), a_ref(i__, 4)); } afh4r_c(&c__4, a, ev, rab); for (i__ = 1; i__ <= 4; ++i__) { printf("\n %10.2f %10.2f %10.2f %10.2f \n", a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3), a_ref(i__, 4)); } printf("\n %14.7f %14.7f %14.7f %14.7f \n", ev[0], ev[1], ev[2], ev[3]); printf("\n %10.3e %10.3e %10.3e %10.3e \n", rab[0], rab[1], rab[2], rab[3]); return 0; } /* main */ Результаты: | 1.00 0.42 0.54 0.66 | a_ref = | 0.18 1.00 0.32 0.44 | | 0.42 0.58 1.00 0.22 | | 0.66 0.44 1.04 1.00 | | 0.6670 | d__ = | 0.6501 | | 1.6829 | | 1.0000 | | 0.0000 | ev = | -0.0879 | | -0.4614 | | -0.8232 |