Текст подпрограммы и версий
afh2r_c.zip , afh2d_c.zip
Тексты тестовых примеров
tafh2r_c.zip , tafh2d_c.zip

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

Назначение

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

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

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

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

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

    int afh2r_c (real *a, integer *n, integer *nc, integer *ierr)

Параметры

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

Версии

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

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

utaf10_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы afh2r_c;
utaf11_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы afh2d_c.

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

  Для подпрограммы afh2d_c параметр a должен иметь тип double.

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

int main(void)
{
    /* Initialized data */
    static float a[6]  /* was [3][2] */ = { 0.f,2.f,12.f,1.f,25.f,56.f };

    /* Local variables */
    static int ierr;
    extern int afh2r_c(float *, int *, int *, int *);
    static int n, nc, i__;

    n = 3;
    nc = 1;
    afh2r_c(a, &n, &nc, &ierr);

    for (i__ = 0; i__ <= 3; i__+=3) {
        printf("\n  %15.7e %15.7e %15.7e \n",
               a[i__], a[i__+1], a[i__+2]);
    }
    return 0;
} /* main */


Результаты:  a  =   (0.,  2.,  2.6186,  1.,  4.5826,  7.0102)