Текст подпрограммы и версий
aeb3r_c.zip , aeb3d_c.zip
Тексты тестовых примеров
taeb3r_c.zip , taeb3d_c.zip

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

Назначение

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

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

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

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

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

    int aeb3r_c (integer *n, integer *nc, integer *mm, integer *m,
            real *rlb, real *rub, real *a, real *ev, integer *irab, real *rab, 
            integer *ierr)

Параметры

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

Версии

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

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

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

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

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

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

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

    /* Local variables */
    static int ierr;
    extern int aeb3r_c(int *, int *, int *, int *, float *, float *,
                       float *, float *, int *, float *, int *);
    static int irab1[7];
    static float a[21] /* was [7][3] */;
    static int i__, m, n, mb, mm, j;
    static float ev[7], rab[35], rlb, rub;
    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;
/* l1: */
        a_ref(i__, 1) = 1.f;
    }
    n = 7;
    mb = 3;
    mm = 7;
    rlb = -6.f;
    rub = 1e7f;
    aeb3r_c(&n, &mb, &mm, &m, &rlb, &rub, a, ev, irab1, rab, &ierr);

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


Результаты:

Собственные значения в интервале (-6.d0, 10.d0**7) :

                | -5.67228961584d+00 |
                |  1.55306282219d+01 |
                |  1.01029236853d+02 |
     ev  =  |  1.00010120030d+03 |  ,      ierr  =  0
                |  1.00000101020d+04 |
                |  1.00000001010d+05 |
                |  1.00000000011d+06 |