Текст подпрограммы и версий asg5a_c.zip , asg5d_c.zip , asg5e_c.zip |
Тексты тестовых примеров tasg5a_c.zip , tasg5d_c.zip , tasg5e_c.zip |
Решение системы линейных алгебраических уравнений на основе преобразований вращения.
Матрица А размера 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.)