Текст подпрограммы и версий
afh5r_c.zip , afh5d_c.zip
Тексты тестовых примеров
tafh5r_c.zip , tafh5d_c.zip

Подпрограмма:  afh5r_c

Назначение

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

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

Подпрограмма 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