Текст подпрограммы и версий
afh1r_c.zip , afh1d_c.zip , afh1c_c.zip
Тексты тестовых примеров
tafh1r_c.zip , tafh1d_c.zip , tafh1c_c.zip

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

Назначение

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

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

Заданная положительно опpeдeлeнная симметричная матрица А приводится к действительной невырожденной нижней треугольной матрице L, такой, что LLT = А, методом квадратного корня (методом Холецкого).

В.В.Воеводин, Численные методы алгебры (теория и алгорифмы), "Наука", М., 1966 г.

Использование

    int afh1r_c (real *a, integer *n, integer *ierr)

Параметры

a - вектор длины n * (n + 1) / 2, в котором содержится заданная матрица, записанная в компактной форме; по окончании работы подпрограммы в массиве a запоминается также в компактной форме нижняя треугольная матрица L (тип: вещественный);
n - порядок матрицы (тип: целый);
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr=65 - если исходная матрица не является положительно определенной.

Версии

afh1d_c - треугольное разложение положительно определенной симметричной матрицы методом квадратного корня с компактной формой представления симметричной и треугольной матриц с повышенной точностью.
afh1c_c - треугольное разложение положительно определенной эрмитовой матрицы методом квадратного корня с компактной формой представления матриц.

Вызываемые подпрограммы

utaf10_c - подпрограмма выдачи диагностических сообщений при работе подпрограмм afh1r_c, afh1c_c .
utaf11_c - подпрограмма выдачи диагностических сообщений при работе подпрограмм afh1d_c, afh1p_c .

Замечания по использованию

  Для подпрограммы afh1d_c параметр a должен тиметь тип double, а для afh1c_c - тип complex.

Пример использования

int main(void)
{
    /* Initialized data */
    static float a[6] = { 1.f,2.f,20.f,3.f,26.f,70.f };

    /* Local variables */
    static int ierr, i__;
    extern int afh1r_c(float *, int *, int *);

    for (i__ = 0; i__ <= 3; i__+=3) {
        printf("\n  %6.2f %6.2f %6.2f \n",
               a[i__], a[i__+1], a[i__+2]);
    }
    afh1r_c(a, &c__3, &ierr);

    for (i__ = 0; i__ <= 3; i__+=3) {
        printf("\n  %6.2f %6.2f %6.2f \n",
               a[i__], a[i__+1], a[i__+2]);
    }
    printf("\n  %5i \n", ierr);
    return 0;
} /* main */


Результаты:    a = (1., 2., 4., 3., 5., 6.),   ierr = 0