Текст подпрограммы и версий
aet1r_c.zip , aet1d_c.zip
Тексты тестовых примеров
taet1r_c.zip , taet1d_c.zip

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

Назначение

Вычисление всех собственных значений и собственных векторов вещественной верхней матирцы Хессенберга qr - алгоpитмом с двойным сдвигом.

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

Подпрограмма aet1r_c вычисляет собственные значения верхней матрицы Хессенберга QR - алгоpитмом с двойным сдвигом, информация о выполняемых преобразованиях запоминается и используется потом для вычисления собственных векторов матрицы Хессенберга.

Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра, М.: "Машиностроение", 1976.

Использование

    int aet1r_c (integer *nm, integer *n, integer *low, integer *
        igh, real *h, real *wr, real *wi, real *z, integer *ierr)

Параметры

nm - число строк двумерных массивов h и z, указанное при описании этих массивов в вызывающей подпрограмме (тип: целый);
n - порядок исходной матрицы (тип: целый);
      low -
      igh  
выходные параметры подпрограммы amb1r_c (тип: целый); если матрица не масштабировалась, то можно взять low = 1, igh = n;
h - вещественный двумерный массив размерности nm на n, содержащий на входе в подпрограмму в своих первых n строках исходную матрицу Хессеберга;
wr, wi - вещественные векторы длины n, содержащие на выходе из подпрограммы соответственно вещественные и мнимые части вычисленных собственных значений, при этом комплексно - сопряженные собственные значения располагаются последовательно, причем первым идет собственное значение с положительной мнимой частью;
z - вещественный двумерный массив размерности nm на n, содержащий на выходе из подпрограммы вычисленные собственные векторы, при этом:
если wi (j) = 0 , то соответствующий собственный вектор расположен в j - ом столбце массива z;
если wi (j) > 0 , то в j - ом и (j + 1) - ом столбцах располагаются соответственно вещественная и мнимая части собственного вектора;
если wi (j) < 0 , то собственный вектор не запоминается, т.к. может быть получен как сопряженный собственному вектору, соответствующему (j - 1) - ому собственному значению;
  собственные векторы не нормируются;
ierr - целочисленная переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; на выходе из подпрограммы ierr равно индексу собственного значения для вычисления которого требуется более 30 итераций, при этом собственные значения с индексами ierr + 1, ierr + 2, ...,n вычислены правильно, а собственные векторы не вычисляются; если вычислены все собственные значения и собственные векторы, то ierr = 0.

Версии

aet1d_c - вычисление всех собственных значений и собственных векторов вещественной матрицы Хессенберга, заданной с двойной точностью, с помощью qr - алгоритма с двойным сдвигом.

Вызываемые подпрограммы

utae12_c - подпрограмма выдачи диагностических сообщений при работе подпрограмм aet1r_c и aet1d_c.

Замечания по использованию

  1. 

В подпрограмме aet1d_c параметры h, wr, wi, z имеют тип double.

  2.  Подпрограмма aet1r_c (aet1d_c) не сохраняет исходный массив z.

Пример использования

int main(void)
{
    /* Initialized data */
    static float h__[9] /* was [3][3] */ = { 2.f,0.f,0.f,4.f,3.f,1.f,4.f,1.f,
                                             3.f };
    /* System generated locals */
    int i__1, i__2;

    /* Local variables */
    static int ierr;
    extern int aet1r_c(int *, int *, int *, int *, float *, float *,
                       float *, float *, int *);
    static int i__, n;
    static float z__[9]  /* was [3][3] */, wi[3], wr[3];

#define z___ref(a_1,a_2) z__[(a_2)*3 + a_1 - 4]

    n = 3;
    aet1r_c(&n, &n, &c__1, &n, h__, wr, wi, z__, &ierr);

        printf("\n %5i \n", ierr);
        printf("\n %15.7e %15.7e %15.7e \n", wr[0], wr[1], wr[2]);
        printf("\n %15.7e %15.7e %15.7e \n", wi[0], wi[1], wi[2]);
    for (i__ = 1; i__ <= 3; ++i__) {
        printf("\n %15.7e %15.7e %15.7e \n",
                 z___ref(i__,1), z___ref(i__,2), z___ref(i__,3));
    }
    return 0;
} /* main */


Результаты:

       ierr  =  0 ,   wr  =  (2., 4., 2.) ,  wi  =  (0., 0., 0.)

                | 1   4a    0   |
     z__  =  | 0     a   -a   |
                | 0     a    a   |

   где    a = 0.707106781187