Текст подпрограммы и версий
asg5a_c.zip , asg5d_c.zip , asg5e_c.zip
Тексты тестовых примеров
tasg5a_c.zip , tasg5d_c.zip , tasg5e_c.zip

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

Назначение

Решение системы линейных алгебраических уравнений на основе преобразований вращения.

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

Матрица А размера N нa N исходной системы А*x = b с помощью преобразований вращения  R1 2, R1 3, ..., RN - 1 N представляется в виде

     A = L*RN-1 N ... R1 2 , 

где L - нижняя треугольная матрица размера N на N. Заменой переменных y = RN - 1 N ... R1 2*x исходная система сводится к системе L*y = b, которая решается способом обратной подстановки. При повторном решении системы с той же матрицей А и другой правой частью предоставляется возможность не выполнять заново факторизацию матрицы А.

В.В. Воеводин, Вычислительные основы линейной алгебры, М., 1977.

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

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

Параметры

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

Версии

asg5d_c - решение системы линейных алгебраических уравнений, заданной с удвоенной точностью, на основе преобразований вращения.
asg5e_c - решение комплексной системы линейных алгебраических уравнений на основе преобразований вращения.

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

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

  1. 

Подпрограммы asg5a_c, asg5d_c, asg5e_c позволяют помещать вычисленное решение x на место правой части b.

  2. 

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

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

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

int main(void)
{
    /* Local variables */
    extern int asg5a_c(float *, float *, float *, int *, int *);
    static float a[25] /* was [5][5] */, b[5];
    static int i__, j;
    static float x[5];

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

    for (i__ = 1; i__ <= 5; ++i__) {
        for (j = 1; j <= 5; ++j) {
/* l2: */
            a_ref(i__, j) = 0.f;
        }
    }
    for (i__ = 1; i__ <= 5; ++i__) {
        for (j = i__; j <= 5; ++j) {
/* l3: */
            a_ref(i__, j) = 1.f;
        }
    }
    for (i__ = 1; i__ <= 5; ++i__) {
/* l4: */
        b[i__ - 1] = (float) (6 - i__);
    }
    asg5a_c(a, b, x, &c__5, &c__1);

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


Результат:

      x  =  (1., 1., 1., 1., 1.)