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