Подпрограмма: 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