Текст подпрограммы и версий
afb1r_c.zip , afb1d_c.zip
Тексты тестовых примеров
tafb1r_c.zip , tafb1d_c.zip

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

Назначение

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

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

Заданная в компактной формe лeнтoчная матрица А приводится к ленточной верхней треугольной матрице U при помощи элементарного преобразования L так, что LU = А. Матрица L является ленточной нижней треугольной с единичными диагональными элементами.

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

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

    int afb1r_c (real *a, integer *n, integer *nlc, integer *nuc,
            real *r, integer *ierr)

Параметры

a - вещественный двумерный массив размера n *(nlc + nuc + 1), в котором содержится заданная матрица, записанная в компактной форме; по окончании работы подпрограммы в массиве a запоминается также в компактной форме ленточная верхняя треугольная матрица U (в первых nuc + 1 столбцах);
n - порядок матрицы (тип: целый);
nlc - число ненулевых диагоналей, расположенных под главной диагональю (тип: целый);
nuc - число ненулевых диагоналей, расположенных над главной диагональю (тип:целый);
r - вещественный двумерный массив размера n * (nlc + 1), используемый как рабочий; по окончании работы подпрограммы в первых n*nlc компонентах массива r содержится нижняя треугольная ленточная матрица L;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr=65 - если заданная матрица является алгоритмически сингулярной.

Версии

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

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

utbf10_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы afb1r_c.
utbf11_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы afb1d_c.

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

  Для подпрограммы afb1d_c параметры a и r должны иметь тип double.

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

int main(void)
{
    /* Initialized data */
    static float a[9] /* was [3][3] */ = { 0.f,2.f,1.f,1.f,5.f,17.f,2.f,1.f,
                                           0.f };
    /* Local variables */
    static int ierr;
    extern int afb1r_c(float *, int *, int *, int *, float *, int *);
    static int i__, j;
    static float r__[6]  /* was [3][2] */;

#define r___ref(a_1,a_2) r__[(a_2)*3 + a_1 - 4]

    for (i__ = 1; i__ <= 3; ++i__) {
        for (j = 1; j <= 2; ++j) {
/* l8: */
            r___ref(i__, j) = 0.f;
        }
    }
    for (i__ = 0; i__ <= 6; i__+= 3) {
        printf("\n  %12.4e %12.4e %12.4e \n",
                   a[i__], a[i__ + 1], a[i__ + 2]);
    }
    afb1r_c(a, &c__3, &c__1, &c__1, r__, &ierr);

    for (i__ = 0; i__ <= 6; i__+= 3) {
        printf("\n  %12.4e %12.4e %12.4e \n",
                   a[i__], a[i__ + 1], a[i__ + 2]);
    }
    for (i__ = 0; i__ <= 3; i__+= 3) {
        printf("\n  %12.4e %12.4e %12.4e \n",
                   r__[i__], r__[i__ + 1], r__[i__ + 2]);
    }
    printf("\n  %5i \n", ierr);
    return 0;
} /* main */


Результаты:

      a     =   (1., 25., 16., 3., 5., 0., 0., 0., 0.), 

      r__  =   (0., -1., 0.4, 1., 2., 3.), 

      ierr  =  0