Текст подпрограммы и версий
ash0r_c.zip , ash0c_c.zip , ash0d_c.zip
Тексты тестовых примеров
tash0r_c.zip , tash0c_c.zip , tash0d_c.zip

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

Назначение

Решение системы линейных алгебраических уравнений с симметричной матрицей модифицированным методом квадратного корня (модифицированным методом Холецкого).

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

Подпрограмма ash0r_c модифицированным методом квадратного корня осуществляет разложение заданной симметричной матрицы А в произведение

     A = UT*D*U , 

где U - верхняя треугольная матрица, на диагонали которой стоят единицы, D - диагональная матрица, и затем решает две треугольные системы

     UT*y = b ,        D*U*x = y . 

При повторном решении системы с той же матрицей и другой правой частью подпрограмма позволяет использовать полученное ранее разложение.

Главные миноры матрицы А должны быть отличными от нуля.

R.S.Мartin, G.Рeters, J.Н.Wilkinson, Symmetric Decomposition of a Рositive Definite Мatrix, Numer. Матн., 7, 1965.

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

    int ash0r_c (real *a, real *b, real *x, real *s, integer *n,
            integer *l)

Параметры

a - вещественный двумерный массив размера n на n, содержащий исходную матрицу; в результате работы подпрограммы над главной диагональю матрицы A запоминается верхняя треугольная матрица U без диагональных элементов; нижняя треугольная часть матрицы A, включая главную диагональ, сохраняется;
b - вещественный вектор длины n, в котором задается правая часть;
x - вещественный вектор длины n, в котором запоминается вычисленное решение;
s - вещественный вектор длины n, содержащий величины, обратные диагональным элементам диагональной матрицы D;
n - порядок симметричной матрицы A (тип: целый);
l - задает режим работы подпрограммы (тип: целый); при этом:
l = 1 - если система с данной матрицей A решается впервые;
l ≠ 1 - если система с данной матрицей A решается повторно.

Версии

ash0c_c - решение системы линейных алгебраических уравнений с эрмитовой матрицей модифицированным методом квадратного корня.
ash0d_c - решение системы линейных алгебраических уравнений с симметричной матрицей, заданной с двойной точностью, модифицированным методом квадратного корня.

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

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

  1. 

В подпрограмме ash0d_c параметры a, b, s, x имеют тип double.

  2.  В подпрограмме ash0c_c параметры a, b, x имеют тип complex.

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

int main(void)
{
    /* Local variables */
    extern int ash0d_c(double *, double *, double *, double *, int *, int *),
               ash0r_c(float *, float *, float *, float *, int *, int *);
    static float a[25] /* was [5][5] */, b[5];
    static int i__, j, n;
    static float s[5], x[5];
    static double a1[25] /* was [5][5] */, b1[5], s1[5], x1[5];

#define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6]
#define a1_ref(a_1,a_2) a1[(a_2)*5 + a_1 - 6]

    n = 5;
    for (i__ = 1; i__ <= 5; ++i__) {
        for (j = 1; j <= 5; ++j) {
            a1_ref(i__, j) = 2520.f / (i__ + j - 1.f);
/* l1: */
            a_ref(i__, j) = a1_ref(i__, j);
        }
    }
    for (i__ = 1; i__ <= 5; ++i__) {
        b1[i__ - 1] = 0.f;
/* l3: */
        b[i__ - 1] = 0.f;
    }
    b[0] = 1.f;
    b1[0] = 1.f;
    ash0r_c(a, b, x, s, &n, &c__1);

    for (i__ = 1; i__ <= 5; ++i__) {
         printf("\n  %15.7e \n", s[i__-1]);
    }
    for (i__ = 1; i__ <= 5; ++i__) {
         printf("\n  %15.7e \n", x[i__-1]);
    }
    ash0d_c(a1, b1, x1, s1, &n, &c__1);

    for (i__ = 1; i__ <= 5; ++i__) {
         printf("\n  %16.7e \n", s1[i__-1]);
    }
    for (i__ = 1; i__ <= 5; ++i__) {
         printf("\n  %16.7e \n", x1[i__-1]);
    }
    return 0;
} /* main */


Результаты:

      x  =   (1.359751359*10-4,   -3.26340326*10-3,   2.44755244*10-2,
                 -8.1585081*10-2,    1.34615384*10-1,   -1.07692307*10-1,
                 3.33333333*10-2)