Текст подпрограммы и версий afg6r_c.zip , afg6d_c.zip , afg6c_c.zip , afg6p_c.zip |
Тексты тестовых примеров tafg6r_c.zip , tafg6d_c.zip , tafg6c_c.zip , tafg6p_c.zip |
Приведение вещественной матрицы к верхней форме Хессенберга элементарными неортогональными преобразованиями подобия.
Подпрограмма afg6r_c осуществляет приведение вещественной матрицы А порядка N к верхней форме Хессенберга Н.
Подпрограмма afg6r_c требует задания чисел LОW и IGН, удовлетворяющих условию
ai j = 0 , ecли i > j и ecли 1 ≤ j < LOW или IGH < i ≤ N ,
которое означает, что первые (LОW - 1) столбцов и последние (N - IGН) строк матрицы А имеют верхнюю треугольную форму.
Тогда достаточно будет привести к верхней форме Хессенберга только подматрицу матрицы А, расположенную в строках и столбцах с номерами от LОW до IGН.
Приведение к форме Хессенберга осуществляется с помощью последовательности элементарных устойчивых преобразований подобия
Aj = Nj-1 Ij j ' Aj -1 Ij j ' Nj , j = LOW+1, LOW+2, ... , IGH-1 , где АLОW = А , Ij j ' - элементарная матрица перестановок , Nj - элементарная матрица с элементами { Nj }i j = ni j , i = j +1, j +2, ... , IGH , { Nj }i k = δi k в остальных позициях .
Информация о выполненных преобразованиях запоминается и может быть использована потом для восстановления собственных векторов исходной матрицы.
Уилкинсон, Райнш. "Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра." М.: Машиностроение, 1976.
int afg6r_c (integer *nm, integer *n, integer *low, integer *igh, real *a, integer *int)
Параметры
nm - | число строк двумерного массива a, указанное при описании этого массива в вызывающей подпрограмме (тип: целый); |
n - | порядок исходной матрицы, n ≤ nm (тип: целый); |
low - igh |
заданные граничные индексы строк и столбцов
подматрицы исходной матрицы, которую
требуется привести к форме Хессенберга (тип: целый); если матрица масштабировалась, то low, igh - выходные параметры подпрограммы amb1r_c , в общем случае можно взять low = 1, igh = n; |
a - | вещественный двумерный массив размерности nm * n, содержащий в своих первых n строках исходную матрицу; в результате работы подпрограммы массив a содержит вычисленную матирцу Хессенберга, а в остальной части массива a в столбцах с номерами j = low, low + 1, ..., igh - 2 запоминается информация об использованных элементарных преобразованиях, причем элементы ni j, i = j + 1, j + 2, ..., igh, определяющие матрицу Nj, запоминаются в ( j - 1) - ом столбце; |
int - | целочисленный вектор длины igh, в котором запоминается информация о выполненных перестановках строк и столбцов, причем элемент вектора int ( j ), j = low + 1, low + 2, ..., igh - 1 содержит номер строки, переставленной с j - ой строкой текущей матрицы на j - ом шаге преобразования. |
Версии
afg6d_c - | приведение к верхней форме Хессенберга элементарными неортогональными (неунитарными) преобразованиями вещественной матрицы, заданной с удвоенной точностью. |
afg6c_c - | приведение к верхней форме Хессенберга элементарными неортогональными (неунитарными) преобразованиями комплексной матрицы (см. замечания по использованию). |
afg6p_c - | приведение к верхней форме Хессенберга элементарными неортогональными (неунитарными) преобразованиями комплексной матрицы, заданной с удвоенной точностью (см. замечения по использованию). |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме afg6d_c параметр a имеет тип double. | |
2. |
В подпрограмме afg6c_c исходная комплексная матрица
порядка n задается в двух вещественных массивах ar и
ai размеров nm * n, содержащих в своих первых n
строках ее вещественную и мнимую части соответственно. int afg6c_c (integer *nm, integer *n, integer *low, integer *igh, real *ar, real *ai, integer *int__) | |
3. | Подпрограмма afg6p_c имеет такие же параметры, как и подпрограмма afg6c_c, только при этом ar и ai имеют тип double. |
int main(void) { /* Initialized data */ static float a[16] /* was [4][4] */ = { 8.f,16.f,64.f,32.f,-4.f,12.f, 16.f,16.f,1.f,21.f,28.f,20.f,16.f,48.f,64.f,64.f }; /* Local variables */ extern int afg6r_c(int *, int *, int *, int *, float *, int *); static int i__, int__[4]; #define a_ref(a_1,a_2) a[(a_2)*4 + a_1 - 5] int__[0] = 0; int__[3] = 0; afg6r_c(&c__4, &c__4, &c__1, &c__4, a, int__); for (i__ = 1; i__ <= 4; ++i__) { printf("\n %15.7e %15.7e %15.7e %15.7e \n", a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3), a_ref(i__, 4)); } printf("\n %5i %5i %5i %5i \n", int__[0], int__[1], int__[2], int__[3]); return 0; } /* main */ Результаты: | 8.00 8.00 8. 16. | | 64.00 64.00 64. 64. | a_ref = | 0.25 32.00 32. 32. | , | 0.50 0.75 8. 8. | int__ = (0, 3, 3, 0)t . Это означает, что h = n3- 1 i3, 3 n2- 1 i2, 3 a i2, 3 n2 i3, 3 n3 = | 8. 8. 8. 16 | | 64. 64. 64. 64. | = | 0. 32. 32 32. | , | 0. 0. 8. 8. | при этом | 1 0 0 0 | | 0 1 0 0 | n2 = | 0 0.25 1 0 | , | 0 0.5 0 1 | | 1 0 0 0 | | 0 1 0 0 | n3 = | 0 0 1 0 | . | 0 0 0.75 1 |