Текст подпрограммы и версий
aft1r_c.zip , aft1d_c.zip , aft1c_c.zip
Тексты тестовых примеров
taft1r_c.zip , taft1d_c.zip , taft1c_c.zip

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

Назначение

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

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

Для заданной вещественной треугольной матрицы А порядка N вычисляется величина, обратная числу обусловленности матрицы:

    rcond  =  1 / ( || A ||1 * || A-1 ||1) ,

где    || A ||1 =  maxj=1,..,N  (  | a1 j | + | a2 j | +...+ | aN j |  ) 

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

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

    int aft1r_c (real *a, integer *m, integer *n, integer *low,
            real *rcond, real *z, integer *ierr)

Параметры

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

Версии

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

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

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

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

  1. 

В подпрограмме aft1d_c массивы a, z и переменная rcond имеют тип double.

  2. 

В подпрограмме aft1c_c массивы a и z имеют тип complex.

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

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

int main(void)
{
    /* Local variables */
    static int ierr;
    extern int aft1r_c(float *, int *, int *, int *, float *,
                       float *, int *);
    static float a[81] /* was [9][9] */;
    static int i__, j, m, n;
    static float z__[9], rcond;
    static int low;
    int i__1, i__2;

#define a_ref(a_1,a_2) a[(a_2)*9 + a_1 - 10]

    n = 9;
    m = 9;
    low = 0;
    i__1 = n;
    for (j = 1; j <= i__1; ++j) {
        i__2 = m;
        for (i__ = 1; i__ <= i__2; ++i__) {
            a_ref(i__, j) = 0.f;
            if (j < i__) {
                goto l2;
            }
            a_ref(i__, j) = (float) (i__ * 10 + j);
l2:
/* l3: */
            ;
        }
/* l4: */
    }
    for (i__ = 1; i__ <= 9; ++i__) {
          printf("\n %12.4e %12.4e %12.4e \n",
                a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3));
          printf(" %12.4e %12.4e %12.4e \n %12.4e% 12.4e %12.4e \n",
                a_ref(i__, 4), a_ref(i__, 5), a_ref(i__, 6),
                a_ref(i__, 7), a_ref(i__, 8), a_ref(i__, 9));
    }
    aft1r_c(a, &m, &n, &low, &rcond, z__, &ierr);

    printf("\n %5i \n", ierr);
    printf("\n %15.7e \n", rcond);
    return 0;
} /* main */


Результат:    rcond = 0.03629