Текст подпрограммы и версий
aej2r_c.zip , aej2d_c.zip
Тексты тестовых примеров
taej2r_c.zip , taej2d_c.zip

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

Назначение

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

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

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

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

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

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

Параметры

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

Версии

aej2d_c - вычисление всех собственных значений вещественной матрицы Якоби с повышенной точностью. Массивы a,ev, rab имеют тип double.

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

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

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

  Подпрограмма aej2r_c сохраняет исходную информацию.

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

int main(void)
{
    /* Initialized data */
    static float a[15]   /* was [5][3] */ = { 0.f,1.f,1.f,1.f,1.f,0.f,0.f,0.f,
                                              0.f,0.f,1.f,1.f,1.f,1.f,0.f };
    /* Local variables */
    static int ierr;
    extern int aej2r_c(int *, float *, float *, float *, int *);
    static int i__;
    static float ev[5], rab[10];

#define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6]

    for (i__ = 1; i__ <= 5; ++i__) {
        printf("\n %14.4e %14.4e %14.4e \n",
            a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3));
    }
    aej2r_c(&c__5, a, ev, rab, &ierr);

    for (i__ = 1; i__ <= 5; ++i__) {
        printf("\n %14.4e %14.4e %14.4e \n",
            a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3));
    }
    printf("\n %16.7e %16.7e %16.7e ", ev[0], ev[1], ev[2]);
    printf("\n %16.7e %16.7e \n", ev[3], ev[4]);
    printf("\n %5i \n", ierr);
    return 0;
} /* main */


Результаты:

      ev(1)  =  -1.7320508 , 
      ev(2)  =  -1.0 , 
      ev(3)  =  6.28*10-12 , 
      ev(4)  =  1.0 , 
      ev(5)  =  1.7320508 ;

      ierr  =  0