Текст подпрограммы и версий
afj0r_c.zip , afj0d_c.zip
Тексты тестовых примеров
tafj0r_c.zip , tafj0d_c.zip

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

Назначение

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

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

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

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

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

    int afj0r_c (real *b, real *c, integer *n, integer *ierr)

Параметры

b - вещественный вектор длины n, содержащий в последних n - 1 компонентах наддиагональные элементы матрицы Якоби T; на выходе подпрограммы в последних n - 1 компонентах вектора в запоминаются вычисленные наддиагональные элементы матрицы H;
c - вещественный вектор длины n, в последних n - 1 компонентах которого содержатся поддиагональные элементы исходной матрицы Якоби; на выходе подпрограммы на месте вектора с запоминаются вычисленные диагональные элементы диагональной матрицы D;
n - заданный порядок исходной матрицы Якоби T (тип: целый);
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr=66 - если не все попарные произведения соответствующих элементов побочных диагоналей исходной матрицы неотрицательны;
ierr=67 - если имеется равное нулю произведение соответствующих элементов побочных диагоналей, причем сомножители равны нулю неодновременно;
ierr=68 - если матрица H получена, но матрица преобразования D не вычислена, т.к. она или обратная к ней матрица алгоритмически вырождена.

Версии

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

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

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

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

  В подпрограмме afj0d_c параметры b, c должны иметь тип double.

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

int main(void)
{
    /* Initialized data */
    static float b[5] = { 0.f,1.f,1.f,-4.f,-4.f };
    static float c__[5] = { 0.f,4.f,16.f,-4.f,-4.f };

    /* Local variables */
    static int ierr, i__;
    extern int afj0r_c(float *, float *, int *, int *);

    afj0r_c(b, c__, &c__5, &ierr);

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


Результаты:

      b    =   (0., 2., 4., 4.), 
      c__  =   (1., 2., 8., -8., 8.), 

      ierr  =  0