Текст подпрограммы и версий
afh0r_c.zip , afh0d_c.zip , afh0c_c.zip
Тексты тестовых примеров
tafh0r_c.zip , tafh0d_c.zip , tafh0c_c.zip

Подпрогрaмма:  afh0r_c

Назначение

Треугольное разложение симметричной матрицы модифицированным методом квадратного корня (модифицированным методом Холецкого).

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

Подпрограмма 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. |