Текст подпрограммы и версий afh0r_c.zip , afh0d_c.zip , afh0c_c.zip |
Тексты тестовых примеров tafh0r_c.zip , tafh0d_c.zip , tafh0c_c.zip |
Треугольное разложение симметричной матрицы модифицированным методом квадратного корня (модифицированным методом Холецкого).
Подпрограмма afh0r_c осуществляет разложение симметричной матрицы размера N*N в произведение А = UTDU, где U - верхняя треугольная матрица, на главной диагонали которой стоят единицы, D - диагональная матрица, с помощью модифицированного метода квадратного корня.
Предполагается, что главные миноры матрицы А отличны от нуля.
R.S.Мartin, G.Рeters, J.Н.Wilkinson, Symmetric Decomposition of a Рositive Definite Мatrix, Numer. Матн, 7, 1965.
int afh0r_c (real *a, real *s, integer *n)
Параметры
a - | вещественный двумерный массив размера n*n, содержащий исходную симметричную матрицу; в результате работы подпрограммы над главной диагональю матрицы A запоминается верхняя треугольная матрица U без диагональных элементов; нижняя треугольная часть матрицы A, включая главную диагональ, сохраняется; |
s - | вещественный вектор длины n, в котором запоминаются величины, обратные диагональным элементам матрицы D; |
n - | порядок исходной симметричной матрицы A (тип: целый). |
Версии
afh0d_c - | треугольное разложение симметричной матрицы, заданной с удвоенной точностью, модифицированным методом квадратного корня. |
afh0c_c - | треугольное разложение эрмитовой матрицы A, вида A = U*DU модифицированным методом квадратного корня. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме afh0d_c параметры a, s имеют тип double. | |
2. | В подпрограмме afh0c_c параметр a имеет тип complex. |
int main(void) { /* Local variables */ extern int afh0r_c(float *, float *, int *); static float a[25] /* was [5][5] */; static int i__, j, n; static float s[5]; #define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6] n = 5; for (i__ = 1; i__ <= 5; ++i__) { for (j = i__; j <= 5; ++j) { a_ref(i__, j) = (float) i__; /* l10: */ a_ref(j, i__) = (float) i__; } } afh0r_c(a, s, &n); for (i__ = 1; i__ <= 5; ++i__) { printf("\n %15.7e %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), a_ref(i__, 5)); } printf("\n %15.7e %15.7e %15.7e %15.7e %15.7e \n", s[0], s[1], s[2], s[3], s[4]); return 0; } /* main */ Результаты: | 1. 1. 1. 1. 1. | | 1. | | 1. 2. 1. 1. 1. | | 1. | a_ref = | 1. 2. 3. 1 1. | , s = | 1. | , | 1. 2. 3. 4. 1. | | 1. | | 1. 2. 3. 4. 5. | | 1. | это означает, что | 1. 1. 1. 1. 1. | | 1. 0 0 0 0 | | 0. 1. 1. 1. 1. | | 0 1. 0 0 0 | u = | 0. 0. 1. 1. 1. | , d = | 0 0 1. 0 0 | . | 0. 0. 0. 1. 1. | | 0 0 0 1. 0 | | 0. 0. 0. 0. 1. | | 0 0 0 0 1. |