|
Текст подпрограммы и версий 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 |