Текст подпрограммы и версий afg2r_c.zip , afg2d_c.zip , afg2c_c.zip |
Тексты тестовых примеров tafg2r_c.zip , tafg2d_c.zip , tafg2c_c.zip |
Треугольное разложение вещественной матрицы методом Гаусса с выбором ведущего элемента по всей матрице.
Для заданной матрицы a выпoлняется факторизация вида QАT = LU, где Q и Т - вычисляемые матрицы перестановок, L - нижняя, U - верхняя треугольные матрицы. Матрица L имеет единичные диагональные элементы. Матрицы Q и Т осуществляют соответственно перестановку строк и столбцов исходной матрицы и обеспечивают стратегию выбора ведущего элемента по всей матрице.
В.В.Воеводин, Р.В.Петрина, Комплекс алгоритмов, основанных на преобразованиях типа Гаусса, в пакете линейной алгебры, Сб. "Численный анализ на ФОРТРАНе", вып.3, Изд-во МГУ, 1973.
int afg2r_c (real *a, integer *s, integer *n)
Параметры
a - | двумерный n*n массив, в котором задается исходная матрица (тип: real); по окончании работы подпрограммы в массиве a на соответствующих местах запоминаются элементы матрицы u и поддиагональные элементы матрицы l; |
s - | двумерный n*2 массив, в столбцах которого запоминаются векторы, порождающие матрицы перестановок; при этом в s (k,1) и s (k,2) запоминаются соответственно номера строки и столбца, переставленных на K - ом шаге с K - ой строкой и K - ым столбцом (тип: целый); |
n - | заданный порядок исходной матрицы (тип: целый); |
Версии
afg2d_c - | треугольное разложение матрицы, заданной с удвоенной точностью, методом Гаусса с выбором ведущего элемента по всей матрице. |
afg2c_c - | треугольное разложение комплексной матрицы методом Гаусса с выбором ведущего элемента по всей матрице. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме afg2d_c массив a имеет тип double. | |
2. |
В подпрограмме afg2c_c массив a имеет тип complex. | |
3. | Поскольку факторизация Гаусса требует n - 1 шагов, то s (n, i) = 0, i = 1, 2. |
int main(void) { /* Initialized data */ static float a[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 afg2r_c(float *, int *, int *); static int i__, s[8] /* was [4][2] */; #define a_ref(a_1,a_2) a[(a_2)*4 + a_1 - 5] afg2r_c(a, s, &c__4); for (i__ = 1; i__ <= 4; ++i__) { printf("\n %15.7e %15.7e %15.7e %15.7e \n", a_ref(i__,1), a_ref(i__,2), a_ref(i__,3), a_ref(i__,4)); } return 0; } /* main */ Результат: | 9.300 4.300 4.200 -3.200 | | -0.774 11.229 8.852 3.223 | a_ref = | 0.376 0.613 -11.805 0.029 | ; | 0.355 0.149 0.357 -8.255 | | 34 | | 34 | s = | 34 | ; | 0 | это означает, что | 1 0 0 0 | | -0.774 1 0 0 | l = | 0.376 0.613 1 0 | ; | 0.355 0.149 0.357 1 | | 9.300 4.300 4.200 -3.200 | | 0 11.229 8.852 3.223 | u = | 0 0 -11.805 0.029 | | 0 0 0. -8.255 |