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

Назначение

Приведение вещественной матрицы к верхней форме Хессенберга элементарными неортогональными преобразованиями подобия.

Математическое описание

Подпрограмма 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 строках ее вещественную и мнимую части соответственно.
Параметр nm определяет число строк массивов ar и ai, указанное при описании этих массивов в вызывающей подпрограмме.
В результате работы подпрограммы afg6c_c массивы ar и ai содержат соответственно вещественную и мнимую части вычисленной матрицы Хессенберга, а также вещественные и мнимые части элементов  ni j матриц преобразования  Nj.
Первый оператор подпрограммы afg6c_c имеет вид

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  |