Текст подпрограммы и версий
ait1r_c.zip  ait1d_c.zip  ait1c_c.zip 
Тексты тестовых примеров
tait1r_c.zip  tait1d_c.zip  tait1c_c.zip 

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

Назначение

Обращение вещественной треугольной матрицы.

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

Заданная вещественная верxняя (нижняя) треугольная матрица А порядка N обращается путем последовательного обращения треугольных подматриц Аi порядка  i,  i = 1,...,N, стоящих в левом верхнем (правом нижнем) углу матрицы.

Дж. Форсайт, М. Малькольм, К. Моулер. Машинные методы математических вычислений, М.: Мир, 1980.

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

    int ait1r_c (real *a, integer *m, integer *n, integer *low,
            integer *ierr)

Параметры

a - вещественный двумерный массив размера m на n, в котором задается исходная треугольная матрица; на выходе содержит вычисленную матрицу A-1;
m - первая размерность массива a в вызывающей программе (тип: целый);
n - порядок матрицы A (тип: целый);
low - признак обращаемой матрицы (тип: целый), причем low = 0, если матрица A верхняя треугольная, low≠0, если матрица A нижняя треугольная;
ierr - целая переменная, содержащая на выходе информацию о прохождении счета; при этом:
ierr=65 - если m ≤ 0 или n ≤ 0,
ierr=66 - если в процессе работы произошло переполнение (это говорит о том, что некоторые элементы матрицы A- 1 превосходят по абсолютной величине максимальное представимое на данной машине число);
ierr=-k - если в k - й строке матрицы A диагональный элемент равен нулю (это свидетельствует о вырожденности матрицы A). Если таких строк несколько, то значение k полагается равным номеру первой из них.

Версии

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

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

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

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

  1. 

В подпрограмме ait1d_c массив a имеет тип double.

  2. 

В подпрограмме ait1c_c массив a имеет тип complex.

  3.  Если вырабатывается значение переменной ierr, отличное от нуля, то выдается соответствующее диагностическое сообщение и происходит выход из подпрограммы.

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

int main(void)
{
    /* Local variables */
    static int ierr;
    extern int ait1r_c(float *, int *, int *, int *, int *);
    static float a[25] /* was [5][5] */,
                 b[25] /* was [5][5] */,
               c__[25] /* was [5][5] */,
               d__[25] /* was [5][5] */;
    static int i__, j, k, m, n, low;
    int i__1, i__2, i__3;

#define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6]
#define b_ref(a_1,a_2) b[(a_2)*5 + a_1 - 6]
#define c___ref(a_1,a_2) c__[(a_2)*5 + a_1 - 6]
#define d___ref(a_1,a_2) d__[(a_2)*5 + a_1 - 6]

    m = 5;
    n = 5;
    low = 0;
    i__1 = n;
    for (j = 1; j <= i__1; ++j) {
        i__2 = j;
        for (i__ = 1; i__ <= i__2; ++i__) {
            a_ref(i__, j) = (float) (i__ * 10 + j);
            b_ref(i__, j) = a_ref(i__, j);
/* l3: */
        }
/* l4: */
    }
    for (i__ = 1; i__ <= 5; ++i__) {
    printf("\n %10.4e %10.4e %10.4e %10.4e %10.4e \n",
       a_ref(i__,1), a_ref(i__,2), a_ref(i__,3), a_ref(i__,4), a_ref(i__,5));
    }
    ait1r_c(a, &m, &n, &low, &ierr);

    for (i__ = 1; i__ <= 5; ++i__) {
    printf("\n %10.4e %10.4e %10.4e %10.4e %10.4e \n",
       a_ref(i__,1), a_ref(i__,2), a_ref(i__,3), a_ref(i__,4), a_ref(i__,5));
    }
    i__1 = m;
    for (i__ = 1; i__ <= i__1; ++i__) {
        i__2 = n;
        for (j = 1; j <= i__2; ++j) {
            c___ref(i__, j) = 0.f;
            d___ref(i__, j) = 0.f;
            i__3 = n;
            for (k = 1; k <= i__3; ++k) {
                c___ref(i__, j) = c___ref(i__, j) + b_ref(i__, k) * a_ref(k, 
                        j);
                d___ref(i__, j) = d___ref(i__, j) + a_ref(i__, k) * b_ref(k, 
                        j);
/* l5: */
            }
/* l6: */
        }
/* l7: */
    }
    for (i__ = 1; i__ <= 5; ++i__) {
         printf("\n %10.4e %10.4e %10.4e %10.4e %10.4e \n",
                c___ref(i__,1), c___ref(i__,2), c___ref(i__,3),
                c___ref(i__,4), c___ref(i__,5));
    }
    for (i__ = 1; i__ <= 5; ++i__) {
         printf("\n %10.4e %10.4e %10.4e %10.4e %10.4e \n",
                d___ref(i__,1), d___ref(i__,2), d___ref(i__,3),
                d___ref(i__,4), d___ref(i__,5));
    }
    printf("\n %5i \n", ierr);
    return 0;
} /* main */


Результаты:

               | 9.091e-2    -4.959e-2    -1.251e-3    -9.107e-4    -7.120e-4 |
               |     0            4.546e-2     -3.168e-2    -3.131e-4    -2.448e-4 |
      a  =  |     0                 0             3.031e-2    -2.342e-2     -1.252e-4 |
               |     0                 0                  0            2.273e-2      -1.860e-2 |
               |     0                 0                  0                 0              1.818e-2 |