Текст подпрограммы и версий
afe0c_c.zip , afe0p_c.zip
Тексты тестовых примеров
tafe0c_c.zip , tafe0p_c.zip

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

Назначение

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

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

Подпрограмма afe0c_c приводит комплексную эрмитову трехдиагональную матрицу Н к вещественной симметрической матрице Т преобразованием подобия вида Т = D - 1НD, где D - комплексная диагональная матрица, диагональные элементы которой удовлетворяют условию | di | = 1. При этом диагональные элементы матрицы Т вычислять не требуется, т.к. они совпадают с диагональными элементами исходной матрицы Н.

Подпрограмма afe0c_c по заданным поддиагональным элементам  ci эрмитовой матрицы Н вычисляет поддиагональные элементы  bi матрицы Т и элементы диагональной матрицы D по следующим формулам

     bi = | ci | ,                i = 2,...,N

     d1 = 1. ,
     di + 1 = di * ci / | ci | ,        если сi ≠ 0 ;
     di + 1 = 1. ,                       если сi = 0. ,            i = 1,...,N-1 

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

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

    int afe0c_c (real *cr, real *ci, real *b, integer *n)

Параметры

cr, ci - вещественные векторы длины n, содержащие в последних n - 1 компонетах соответственно вещественные и мнимые части поддиагональных элементов исходной эрмитовой матрицы H; на выходе подпрограммы векторы cr и ci содержат соответственно вещественные и мнимые части диагональных элементов матрицы преобразования D;
b - вещественный вектор длины n, содержащий в последних n - 1 компонентах вычисленные поддиагональные элементы трехдиагональной матрицы T;
n - заданный порядок исходной трехдиагональной матрицы (тип: целый).

Версии

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

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

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

  В подпрограмме afe0p_c параметры cr, ci, b имеют тип double.

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

int main(void)
{
    /* Initialized data */
    static float cr[5] = { 0.f,3.f,1.f,0.f,0.f };
    static float ci[5] = { 0.f,4.f,0.f,1.f,0.f };

    /* Local variables */
    extern int afe0c_c(float *, float *, float *, int *);
    static float b[5];
    static int i__;

    afe0c_c(cr, ci, b, &c__5);

    for (i__ = 1; i__ <= 5; ++i__) {
        printf("\n  %15.7e \n", cr[i__-1]);
    }
    for (i__ = 1; i__ <= 5; ++i__) {
        printf("\n  %15.7e \n", ci[i__-1]);
    }
    for (i__ = 1; i__ <= 5; ++i__) {
        printf("\n  %15.7e \n", b[i__-1]);
    }
    return 0;
} /* main */


Результаты:

      cr  =   (1., 0.6, 0.6, -0.8, 1.) ,
      ci   =   (0., 0.8, 0.8, 0.6, 0.) ,

      b   =   (0., 5., 1., 1., 0.) .