Текст подпрограммы и версий
aib1r_c.zip  aib1d_c.zip 
Тексты тестовых примеров
taib1r_c.zip  taib1d_c.zip 

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

Назначение

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

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

Подпрограмма aib1r_c вычисляет матрицу B, такую что А*В = Е, где А - исходная ленточная, а Е - единичная матрицы. Обращение осуществляется с выбором главного элемента по столбцу.

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

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

    int aib1r_c (real *a, real *ainv, integer *n, integer *nlc,
            integer *nuc, real *r__, integer *ierr)

Параметры

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

Версии

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

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

utbf10_c - подпрограмма печати диагностических сообщений при работе подпрограммы aib1r_c;
utbf11_c - подпрограмма печати диагностических сообщений при работе подпрограммы aib1d_c.

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

 

При работе подпрограммы исходная матрица не сохраняется. На место вектора a помещается его треугольное разложение.

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

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

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

    for (i__ = 0; i__ <= 6; i__+=3) {
         printf("\n %10.4f %10.4f %10.4f \n",
                   a[i__], a[i__+1], a[i__+2]);
    }
    aib1r_c(a, b, &c__3, &c__1, &c__1, r__, &ierr);

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


Результаты:

         b = (0.8125, -0.1875, 0.125, 0.1875, 0.1875, -0.125, 0.125, 0.125, 
                 0.25), 
         ierr  =  0