Текст подпрограммы и версий
aet1c_c.zip
Тексты тестовых примеров
taet1c_c.zip

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

Назначение

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

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

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

Если рассматриваемая матрица Хессенберга была получена в результате унитарного подобного преобразования некоторой комплексной матрицы общего вида с помощью подпрограммы afg7c_c, то подпрограмма aet1c_c может вычислить непосредственно собственные векторы исходной комплексной матрицы общего вида.

Уилкинсон Дж.Х. Алгебраическая проблема собственных значений. М.: "Наука", 1970.

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

    int aet1c_c (integer *nm, integer *n, integer *low, integer *
        igh, real *ortr, real *orti, real *hr, real *hi, real *wr, real *wi, 
            real *zr, real *zi, integer *ierr)

Параметры

nm - число строк двумерных массивов hr, hi, zr, zi, указанное при описании этих массивов в вызывающей подпрограмме (тип: целый);
n - порядок исходной матрицы (тип: целый);
      low -
      igh  
выходные параметры подпрограммы amb1c_c (тип: целый); если матрица не масштабировалась, то можно взять low = 1, igh = n;
        ortr -
        orti  
вещественные векторы длины igh; первые low - 1 компонент этих векторов подпрограммой aet1c_c не используются; если требуется вычислить собственные векторы матрицы Хессенберга, то на входе в подпрограмму должно выполняться
ortr (i) = orti (i) = 0.0,
i = low, low + 1, ..., igh;
если требуется вычислить собственные векторы комплексной матрицы общего вида (к которой была предварительно применена подпрограмма afg7c_c), то ortr и orti являются выходными параметрами подпрограммы afg7c_c и содержат часть информации о выполненном унитарном преобразовании;
hr, hi - вещественные двумерные массивы размерности nm на n, содержащие на входе в подпрограмму в своих первых n строках соответственно вещественную и мнимые части исходной матрицы Хессенберга; если требуется вычислить собственные векторы матрицы Хессенберга, то остальные элементы массивов hr и hi (лежащие ниже поддиагонали) могут быть произвольными; если же требуется вычислить собственные векторы комплексной матрицы общего вида, то hr и hi - выходные параметры подпрограммы afg7c_c, которые кроме матрицы Хессенберга содержат еще оставшуюся информацию о выполненном унитарном преобразовании;
wr, wi - вещественные векторы длины n, содержащие на выходе из подпрограммы соответственно вещественные и мнимые части вычисленных собственных значений;
zr, zi - вещественные двумерные массивы размерности nm на n, содержащие на выходе из подпрограммы в своих столбцах соответственно вещественные и мнимые части вычисленных собственных векторов; собственные векторы не нормируются;
ierr - целочисленная переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; на выходе из подпрограммы ierr равно индексу собственного значения для вычисления которого требуется более 30 итераций, при этом собственные значения с индексами ierr + 1, ierr + 2, ..., n вычислены правильно, а собственные векторы не вычисляются; если вычислены все собственные значения и соответствующие собственные векторы, то ierr = 0.

Версии

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

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

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

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

  1. 

В подпрограмме aet1p_c параметры ortr, orti, hr, hi, wr, wi, zr, zi имеют тип double.

  2.  Подпрограмма aet1c_c (aet1p_c) не сохраняет исходные массивы hr и hi.

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

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

    /* Local variables */
    static int ierr;
    static float orti[3], ortr[3];
    extern int aet1c_c(int *, int *, int *, int *, float *, float *,
                       float *, float *, float *, float *, float *,
                       float *, int *);
    static int i__, n;
    static float wi[3], zi[9] /* was [3][3] */, wr[3],
                        zr[9] /* was [3][3] */;

#define zi_ref(a_1,a_2) zi[(a_2)*3 + a_1 - 4]
#define zr_ref(a_1,a_2) zr[(a_2)*3 + a_1 - 4]

    n = 3;
    i__1 = n;
    for (i__ = 1; i__ <= i__1; ++i__) {
        ortr[i__ - 1] = 0.f;
        orti[i__ - 1] = 0.f;
/* l10: */
    }
    aet1c_c(&n, &n, &c__1, &n, ortr, orti, hr, hi, wr, wi, zr, zi, &ierr);

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


Результаты:

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

                  | 1.  0.  0. |
       zr_ref  =  | 0.  a  -a  |
                  | 0.  a   a  |

                 | 0.  0. -a  |
       zi_ref  =  | 0.  0.  0.  |
                 | 0.  0.  0. |

   где   a  =  0.707106781187