Текст подпрограммы и версий
afe1c_c.zip , afe1p_c.zip
Тексты тестовых примеров
tafe1c_c.zip , tafe1p_c.zip

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

Назначение

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

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

Пусть Т - заданная эрмитова трехдиагональная матрица, D - диагональная положительно определенная матрица. Подпрограмма afe1c_c получает вещественную симметрическую трехдиагональную матрицу Н и диагональную матрицу D1, такие, что  Н = D2ТD1 и  D2DD1 = Е , где D2 - диагональная матрица.

Эта подпрограмма может быть использована для сведения обобщенной проблемы собственных значений вида Тx = λDx , где D > 0, к стандартной проблеме Нz = λz с вещественной симметрической трехдиагональной матрицей Н; при этом собственные значения этих задач совпадают, а соответствующие собственные векторы связаны следующим образом:  x = D1z .

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

    int afe1c_c (real *a, real *br, real *bi, real *d, real *fr,
            real *fi, integer *n, integer *ierr)

Параметры

a - вещественный вектор длины n, содержащий диагональные элементы исходной трехдиагональной матрицы T; на выходе из подпрограммы на месте вектора a запоминаются вычисленные диагональные элементы матрицы H;
br, bi - вещественные векторы длины n, в последних n - 1 компонентах которых содержатся соответственно вещественные и мнимые части наддиагональных элементов исходной трехдиагональной матрицы T; на выходе из подпрограммы в последних n - 1 компонентах вектора br запоминаются вычисленные наддиагональные элементы трехдиагональной матрицы H;
d - вещественный вектор длины n, содержащий диагональные элементы исходной диагональной матрицы D;
fr, fi - вещественные векторы длины n, содержащие соответственно вещественные и мнимые части диагональных элементов диагональной матрицы перехода D1;
n - заданный порядок исходных матриц T и D (тип: целый);
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr=65 - если исходная диагональная матрица D не является положительно определенной.

Версии

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

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

utaf12_c - подпрограмма выдачи диагностических сообщений при работе подпрограмм afe1c_c и afe1p_c.

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

  В подпрограмме afe1p_c параметры a, br, bi, d, fr, fi должны иметь тип double.

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

int main(void)
{
    /* Initialized data */
    static float a[4] = { 4.f,4.f,4.f,4.f };
    static float br[4] = { 0.f,0.f,-4.f,2.f };
    static float bi[4] = { 0.f,2.f,0.f,2.f };
    static float d__[4] = { 1.f,4.f,4.f,2.f };

    /* Local variables */
    static int ierr;
    extern int afe1c_c(float *, float *, float *, float *, float *,
                       float *, int *, int *);
    static float fi[4], fr[4];
    static int i__;

    afe1c_c(a, br, bi, d__, fr, fi, &c__4, &ierr);

    for (i__ = 1; i__ <= 4; ++i__) {
        printf("\n  %15.7e \n", a[i__-1]);
    }
    for (i__ = 1; i__ <= 4; ++i__) {
        printf("\n  %15.7e \n", br[i__-1]);
    }
    for (i__ = 1; i__ <= 4; ++i__) {
        printf("\n  %15.7e \n", fr[i__-1]);
    }
    for (i__ = 1; i__ <= 4; ++i__) {
        printf("\n  %15.7e \n", fi[i__-1]);
    }
    printf("\n  %5i \n", ierr);
    return 0;
} /* main */


Результаты:

      a   =   (4., 1., 1., 2.) ,     br  =   (0., 1., 1., 1.) ,

      fr  =   (1., 0., 0., 0.5) ,    fi  =   (0., -0.5, 0.5, 0.5) ,

      ierr  =  0 .