Текст подпрограммы и версий 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 |