Текст подпрограммы и версий
adh0r_c.zip , adh0d_c.zip , adh0c_c.zip
Тексты тестовых примеров
tadh0r_c.zip , tadh0d_c.zip , tadh0c_c.zip

Подпрограмма:  adh0r_c

Назначение

Вычисление определителя симметричной матрицы модифицированным методом квадратного корня (модифицированным методом Холецкого).

Математическое описание

Симметричная матрица А раскладывается в произведение А = 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.