|
Текст подпрограммы и версий ait1r_c.zip ait1d_c.zip ait1c_c.zip |
Тексты тестовых примеров tait1r_c.zip tait1d_c.zip tait1c_c.zip |
Обращение вещественной треугольной матрицы.
Заданная вещественная вер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 |