Текст подпрограммы и версий afg1r_c.zip , afg1d_c.zip , afg1c_c.zip |
Тексты тестовых примеров tafg1r_c.zip , tafg1d_c.zip , tafg1c_c.zip |
Треугольное разложение вещественной матрицы методом Гаусса с выбором ведущего элемента по столбцу.
Для заданной матрицы А выпoлняется факторизация вида QА = LU, где Q - вычисляемая матрица перестановок, L - нижняя, U - верхняя треугольная матрицы. Матрица L имеет единичные диагональные элементы. Матрица Q осуществляет перестановку строк исходной матрицы и обеспечивает стратегию выбора ведущего элемента по столбцам.
В.В.Воеводин, Р.В.Петрина, Комплекс алгоритмов, основанных на преобразованиях типа Гаусса, в пакете линейной алгебры, Сб. "Численный анализ на ФОРТРАНе", вып.3, Изд-во МГУ, 1973.
int afg1r_c (real *a, integer *s, integer *n)
Параметры
a - | двумерный n*n массив, в котором задается исходная матрица (тип: real); по окончании работы подпрограммы в массиве a на соответствующих местах запоминаются элементы матрицы U и поддиагональные элементы матрицы L; |
s - | вектор длины n, в котором запоминается вектор, порождающий матрицу перестановок; при этом в s (k) запоминается номер строки, переставленной на K - ом шаге с K - ой строкой (тип: целый); |
n - | заданный порядок исходной матрицы (тип: целый). |
Версии
afg1d_c - | треугольное разложение матрицы, заданной с удвоенной точностью методом Гаусса с выбором ведущего элемента по столбцу. |
afg1c_c - | треугольное разложение комплексной матрицы методом Гаусса с выбором ведущего элемента по столбцу. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме afg1c_c массив a имеет тип complex. | |
2. |
В подпрограмме afg1d_c массив a имеет тип double. | |
3. | Поскольку факторизация Гаусса требует n - 1 шагов, то s (n) = 0. |
int main(void) { /* Initialized data */ static float pa[16] /* was [4][4] */ = { 7.9f,8.5f,4.3f,3.2f,5.6f,-4.8f, 4.2f,-1.4f,5.7f,.8f,-3.2f,-8.9f,-7.2f,3.5f,9.3f,3.3f }; /* Local variables */ extern int afg1r_c(float *, int *, int *); static int i__, s[4]; #define pa_ref(a_1,a_2) pa[(a_2)*4 + a_1 - 5] afg1r_c(pa, s, &c__4); for (i__ = 1; i__ <= 4; ++i__) { printf("\n %10.5f %10.5f %10.5f %10.5f \n", pa_ref(i__,1), pa_ref(i__,2), pa_ref(i__,3), pa_ref(i__,4)); } printf("\n %5i %5i %5i %5i \n", s[0], s[1], s[2], s[3]); return 0; } /* main */ Результат: | 8.500 -4.800 0.800 3.500 | | 0.929 10.061 4.956 -10.453 | pa_ref = | 0.376 0.040 -9.402 2.405 | ; | 0.506 0.659 0.731 12.658 | s = (2, 2, 4, 0); это означает, что | 1 0 0 0 | | 0.929 1 0 0 | l = | 0.376 0.040 1 0 | ; | 0.506 0.659 0.731 1 | | 8.500 -4.800 0.800 3.500 | | 0 10.061 4.956 -10.453 | u = | 0 0 -9.402 2.405 | | 0 0 0 12.658 |