Текст подпрограммы и версий
aeb1r_c.zip , aeb1d_c.zip
Тексты тестовых примеров
taeb1r_c.zip , taeb1d_c.zip

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

Назначение

Вычисление собственных значений вещественной симметрической ленточной матрицы с помощью Q*L - алгоритма.

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

Симметричная ленточная матрица приводится ортогональными преобразованиями Гивенса к симметрической трехдиагональной форме, которая используется для вычисления собственных значений исходной матрицы Q*L - алгоритмом.

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

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

    int aeb1r_c (integer *n, integer *nc, real *a, real *ev, real *
        rab, integer *ierr)

Параметры

n - порядок исходной матрицы (тип: целый);
nc - заданное число кодиагоналей исходной матрицы, включая главную диагональ (тип: целый);
a - вещественный двумерный массив размера n*nc, в котором задается исходная симметричная ленточная матрица в компактной форме;
ev - вещественный вектор длины n, содержащий вычисленные в возрастающем порядке собственные значения;
rab - вещественный вектор длины 2 на n, используемый как рабочий;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом значение ierr полагается равным номеру собственного значения, для вычисления которого потребовалось более 30 итераций; в этом случае собственные значения с индексами  1, 2,  ..., ierr - 1 вычислены правильно и расположены в возрастающем порядке, но они не обязательно являются самыми меньшими из всех n собственных значений.

Версии

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

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

utae10_c - подпрограмма выдачи диагностических сообщений при работе подпрограмм aeb1r_c, aeb1d_c.

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

  Подпрограммы aeb1r_c, aeb1d_c не сохраняют исходную ленточную матрицу, но в последних двух столбцах массива a запоминается ее трехдиагональная форма.
  В подпрограмме aeb1d_c параметры a, ev, rab имеют тип double.

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

int main(void)
{
    /* Builtin functions */
    double pow_ri(float *, int *);

    /* Local variables */
    static int ierr;
    extern int aeb1r_c(int *, int *, float *, float *, float *, int *);
    static float a[21]   /* was [7][3] */;
    static int i__, n, nc, i;
    static float ev[7], rab[14];
    int i__1;

#define a_ref(a_1,a_2) a[(a_2)*7 + a_1 - 8]

    for (i__ = 1; i__ <= 7; ++i__) {
        i__1 = 7 - i__;
        a_ref(i__, 3) = (float)pow_ri(&c_b2, &i__1);
        a_ref(i__, 2) = 10.f;
/* l11: */
        a_ref(i__, 1) = 1.f;
    }
    nc = 3;
    n = 7;
    aeb1r_c(&n, &nc, a, ev, rab, &ierr);

    for (i = 1; i <= 7; ++i) {
        printf("\n %16.7e \n",ev[i-1]);
    }
    printf("\n %5i \n",ierr);
    return 0;
} /* main */


Результаты:

Собственные значения:

                  | -5.67229125355d+00 |
                  |  1.55306255671d+01 |
                  |  1.01029233155d+02 |
       ev  =  |  1.00010119681d+03 |
                  |  1.00000101005d+04 |
                  |  1.00000001008d+05 |
                  |  1.00000000011d+06 |

       ierr  =  0