Текст подпрограммы и версий afh5r_c.zip , afh5d_c.zip |
Тексты тестовых примеров tafh5r_c.zip , tafh5d_c.zip |
Приведение вещественной симметричной матрицы, заданной в компактной форме, к симметричной трехдиагональной матрице с помощью ортогонального преобразования подобия.
Подпрограмма afh5r_c осуществляет приведение вещественной матрицы А порядка N к симметричной трехдиагональной матрице Т с помощью следующей последовательности ортогональных преобразований подобия
Ai = Pi*Ai-1*Pi , i = 1, 2, ..., N-2 , где А0 = А , Рi = I - uiuiT / hi , hi = uiTui / 2 ,
а векторы ui ∈ ЕN выбираются таким образом, чтобы последние i строк и столбцов матрицы Аi имели бы трехдиагональную структуру. При этом у векторов ui отличными от нуля являются только компоненты с номерами 1, 2, ..., N - 1 . I - единичная матрица порядка N .
Информация о выполненых преобразованиях, а именно векторы ui, порождающие матрицы отражения Рi, запоминается и впоследствии может быть использована для восстановления собственных векторов исходной матрицы.
Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра. М.: Машиностроение, 1976.
int afh5r_c (integer *n, integer *nv, real *a, real *d, real *e, real *e2)
Параметры
n - | порядок исходной матрицы (тип: целый); |
nv - | длина вектора a, указанная при описании этого вектора в вызывающей подпрограмме, причем nv ≥ n (n + 1) / 2 (тип: целый); |
a - | вещественный вектор длины nv, в первых n (n + 1) / 2 компонентах которого задается исходная симметричная матрица в компактной форме; в результате работы подпрограммы вектор a содержит информацию о векторах ui, i = 1, 2, ..., n - 2, при этом на месте внедиагональных элементов (n - i + 1) - й строки исходной матрицы запоминаются ненулевые элементы вектора ui, а на месте диагонального элемента (n - i + 1) - й строки - величина √ h i (см. математическое описание); |
d - | вещественный вектор длины n, содержащий на выходе из подпрограммы диагональные элементы трехдиагональной матрицы; |
e - | вещественный вектор длины n, содержащий на выходе из подпрограммы в последних n - 1 компонентах поддиагональные элементы трехдиагональной матрицы, e (1) = 0; |
e2 - | вещественный вектор длины n на выходе из подпрограммы e2 (i) = (e (i))2 , i = 1, 2, ..., n. |
Версии
afh5d_c - | приведение симметричной матрицы, заданной в компактной форме с удвоенной точностью, к симметричной трехдиагональной форме с помощью ортогонального преобразования подобия. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
Фактические параметры, соответствующие формальным параметрам e и e2 могут совпадать, при этом будут получены только сами поддиагональные элементы без их квадратов. | |
2. | В подпрограмме afh5d_c параметры a, d, e, e2 имеют тип double. |
int main(void) { /* Initialized data */ static float a[10] = { 1.f,0.f,2.f,-1.f,0.f,1.f,4.f,0.f,0.f,2.f }; /* Local variables */ extern int afh5r_c(int *, int *, float *, float *, float *, float *); static float d__[4], e[4], e2[4]; int i__; afh5r_c(&c__4, &c__10, a, d__, e, e2); for (i__ = 1; i__ <= 10; ++i__) { printf("\n %15.7e \n", a[i__-1]); } printf("\n %15.7e %15.7e %15.7e %15.7e \n", d__[0], d__[1], d__[2], d__[3]); printf("\n %15.7e %15.7e %15.7e %15.7e \n", e[0], e[1], e[2], e[3]); printf("\n %15.7e %15.7e %15.7e %15.7e \n", e2[0], e2[1], e2[2], e2[3]); return 0; } /* main */ Результаты: a = (0., 0., 0., -1., 1., 1., 4., 0., 4., 4.)t d__ = (2., 1., 1., 2.)t e = (0., 0., -1., -4.)t e2 = (0., 0., 1., 16.)t Это означает, что | 2 0 0 0 | | 0 1 -1 0 | t = | 0 -1 1 -4 | | 0 0 -4 2 | pi = i - uiuit / hi , i = 1, 2 , где u1 = (4., 0., 4., 0.)t , √ h 1 = 4 u2 = (-1., 1., 0., 0.)t , √ h 2 = 1