|
Текст подпрограммы и версий 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.)