|
Текст подпрограммы и версий adh0r_c.zip , adh0d_c.zip , adh0c_c.zip |
Тексты тестовых примеров tadh0r_c.zip , tadh0d_c.zip , tadh0c_c.zip |
Вычисление определителя симметричной матрицы модифицированным методом квадратного корня (модифицированным методом Холецкого).
Симметричная матрица А раскладывается в произведение А = UTDU, где U - верхняя треугольная матрица, на главной диагонали которой стоят единицы, D - диагональная матрица, с помощью модифицированного метода квадратного корня. Предпологается, что главные миноры матрицы А отличны от нуля. Определитель матрицы А вычисляется как определитель матрицы D и записывается в виде:
det A = D1*2D2, где 0.0625 ≤ D1 < 1
R.S.Мartin, G.Рeters, J.Н.Wilkinson, Symmetric Decomposition of a Рositive Definite Мatrix, Numer. Матн, 7, 1965.
int adh0r_c (real *a, real *d1, integer *d2, real *s, integer *n)
Параметры
| a - | вещественный двумерный массив размера n на n, содержащий исходную симметричную матрицу; |
| d1 - | вещественная переменная, в которой запоминается мантисса определителя; |
| d2 - | целая переменная, в которой запоминается двоичный порядок определителя; |
| s - | вещественный вектор длины n, используемый как рабочий; |
| n - | заданный порядок исходной матрицы (тип: целый). |
Версии
| adh0d_c - | вычисление определителя симметричной матрицы, заданной с удвоенной точностью, модифицированным методом квадратного корня. |
| adh0c_c - | вычисление определителя эрмитовой матрицы модифицированным методом квадратного корня. |
Вызываемые подпрограммы
| afh0r_c - | треугольное разложение неособенной симметричной матрицы модифицированным методом квадратного корня. |
| afh0d_c - | треугольное разложение неособенной симметричной матрицы, заданной с удвоенной точностью, модифицированным методом квадратного корня. |
| afh0c_c - | треугольное разложение эрмитовой матрицы модифицированным методом квадратного корня. |
Замечания по использованию
| 1. |
В подпрограмме adh0d_c параметры a, d1, s имеют тип double. | |
| 2. | В подпрограмме adh0c_c параметр a имеет тип complex. |
int main(void)
{
/* Local variables */
extern int adh0r_c(float *, float *, int *, float *, int *);
static float a[25] /* was [5][5] */;
static int i__, j, n;
static float s[5], d1;
static int d2;
#define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6]
for (i__ = 1; i__ <= 5; ++i__) {
for (j = i__; j <= 5; ++j) {
a_ref(i__, j) = (float) i__;
/* l3: */
a_ref(j, i__) = (float) i__;
}
}
n = 5;
adh0r_c(a, &d1, &d2, s, &n);
printf("\n %15.8f \n",d1);
printf("\n %5i \n",d2);
return 0;
} /* main */
Результат:
d1 = 0.0625, d2 = 4,
т.е. det a = 0.0625*24 = 1.