Текст подпрограммы и версий
afh7r_c.zip , afh7d_c.zip
Тексты тестовых примеров
tafh7r_c.zip , tafh7d_c.zip

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

Назначение

Численное треугольное разложение симметричной положительно определенной разреженной матрицы, заданной в формате RR (U) U.

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

Описания форматов RR (U) U и RR (U) О приведены в описаниях подпрограмм am21r_c и ash4r_c соответственно.

Пусть симметричная положительно определенная разреженная матрица А порядка N задана в формате RR (U) U. Подпрограмма afh7r_c вычисляет элементы матрицы U по заданному ее портрету в формате RR (U) О, такую, что A = UTDU, где U - верхняя треугольная матрица с единичной диагональю, а D - диагональная матрица. Портрет матрицы U может быть предварительно получен при помощи подпрограммы afh6r_c сначала в формате RR (U) U, а затем упорядочен в формат RR (U) О путем двухкратного применения подпрограммы amtcr_c .

С.Писсанецки. Технология разреженных матриц. - М.: Мир, 1988

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

    int afh7r_c (integer *ia, integer *ja, real *an, real *ad,
            integer *n, integer *iu, integer *ju, real *un, real *di, integer *ip,
             integer *iup)

Параметры

ia, ja, -
    an, ad   
заданные портрет и ненулевые элементы матрицы A в формате RR (U) U;
n - заданный порядок матрицы A (тип: целый);
iu, ju - заданный портрет матрицы U в формате RR (U) O;
un - вещественный одномерный массив длины n, в который помещаются вычисленные ненулевые элементы матрицы U в соответствии с ее портретом;
di - вещественный одномерный массив длины n, в который помещаются вычисленные элементы матрицы, обратной к диагональной матрице D разложения;
ip, ipu - целые одномерные массивы длины n, используемые в подпрограмме в качестве рабочих;

Версии

afh7d_c - численное треугольное разложение симметричной положительно определенной разреженной матрицы, заданной в формате RR (U) U, в режиме удвоенной точности; при этом параметры an, ad, un и di должны имет тип double.

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

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

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

int main(void)
{
    /* Initialized data */
    static int ia[6] = { 1,2,3,4,5,5 };
    static int ja[4] = { 5,5,5,5 };
    static int iu[6] = { 1,2,3,4,5,5 };
    static int ju[4] = { 5,5,5,5 };
    static float an[4] = { 2.f,.5f,2.f,1.f };
    static float ad[5] = { 16.f,.625f,3.f,.5f,4.f };

    /* Local variables */
    extern int afh7r_c(int *, int *, float *, float *,
                       int *, int *, int *, float *, float *, int *, int *);
    static int n;
    static float di[5];
    static int ip[5];
    static float un[4];
    static int iup[5];

    n = 5;
    afh7r_c(ia, ja, an, ad, &n, iu, ju, un, di, ip, iup);

    printf("\n %15.6e %15.6e %15.6e %15.6e \n",
               un[0], un[1], un[2], un[3]);
    printf("\n %15.6e %15.6e %15.6e %15.6e %15.6e \n",
               di[0], di[1], di[2], di[3], di[4]);
    return 0;
} /* main */


Рeзультаты:
   
 un  =  .125000e+00, .800000e+00, .666667e+00, .200000e+01 
  di  =  .625000e-01, .160000e+01, .333333e+00, .200000e+01, .600002e+02