Текст подпрограммы и версий am02d_c.zip , am02c_c.zip |
Тексты тестовых примеров tam02d_c.zip , tam02c_c.zip |
Вычисление нормированного вектора невязки системы линейных алгебраических уравнений.
Вычисляется вектор R = r / S, где r = b - Ax, b - заданный вектор длины N, x - заданный вектор длины М, A - заданная матрица размера N * М, S = || r || ∞.
Нормировка вектора невязки r необходима при решении системы линейных алгебраических уравнений Аx = b с уточнением.
В.В.Воеводин, Вычислительные основы линейной алгебры, "Наука", М., 1977.
int am02d_c (doublereal *a, doublereal *b, doublereal *x, doublereal *r, doublereal *s, integer *n, integer *m)
Параметры
a - | двумерный массив размера n * m, в котором задается матрица системы (тип: вещественный двойной точности); |
b - | вектор длины n, в котором запоминается правая часть системы (тип: вещественный двойной точности); |
x - | вектор длины m, в котором задается решение системы (тип: вещественный двойной точности); |
r - | одномерный массив длины n, в котором запоминается вычисленный нормированный вектор невязки (тип: вещественный двойной точности); |
s - | переменная, в которой запоминается бесконечная норма вычисленного вектора невязки (тип: вещественный двойной точности); |
n, m - | число строк и столбцов матрицы системы (тип: целый). |
Версии
am02c_c - | вычисление нормированного вектора невязки комплексной системы линейных алгебраических уравнений. |
Вызываемые подпрограммы: нет.
Замечания по использованию
1. |
В подпрограмме am02c_c параметры a, b, x, r имеют тип complex. | |
2. | Подпрограммы am02d_c, am02c_c целесообразно использовать при решении системы линейных алгебраических уравнений с уточнением (см. пример использования). |
int main(void) { /* Initialized data */ static double b[7] = { 0.,0.,0.,0.,0.,0.,0. }; /* System generated locals */ int i__1, i__2; double d__1; /* Local variables */ extern int am02d_c(double *, double *, double *, double *, double *, int *, int *), ash0d_c(double *, double *, double *, double *, int *, int *); static double a[49] /* was [7][7] */, d__[7], f; static int i__, j, k, n; static double r__[7], s, x[7], z__, a1[49] /* was [7][7] */, s0, s1[7], x1[7]; #define a_ref(a_1,a_2) a[(a_2)*7 + a_1 - 8] #define a1_ref(a_1,a_2) a1[(a_2)*7 + a_1 - 8] n = 7; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = n; for (j = 1; j <= i__2; ++j) { a_ref(i__, j) = 360360. / (double) (i__ + j - 1); /* l4: */ a1_ref(i__, j) = a_ref(i__, j); } } b[4] = 360360.; ash0d_c(a, b, x, s1, &n, &c__1); s0 = 0.; i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { x1[i__ - 1] = x[i__ - 1]; if ((d__1 = x[i__ - 1], abs(d__1)) <= s0) { goto l3; } s0 = (d__1 = x[i__ - 1], abs(d__1)); l3: ; } for (k = 1; k <= 6; ++k) { for (i__ = 1; i__ <= 7; ++i__) { printf("\n %20.12e \n", x[i__-1]); } } am02d_c(a1, b, x, r__, &s, &n, &n); for (i__ = 1; i__ <= 7; ++i__) { printf("\n %20.12e \n", r__[i__-1]); } printf("\n %20.12e \n", s); ash0d_c(a, r__, d__, s1, &n, &c__2); for (i__ = 1; i__ <= 7; ++i__) { printf("\n %20.12e \n", d__[i__-1]); } i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { /* l2: */ x[i__ - 1] += d__[i__ - 1] * s; } z__ = 0.; i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { f = (d__1 = x[i__ - 1] - x1[i__ - 1], abs(d__1)); x1[i__ - 1] = x[i__ - 1]; if (f <= z__) { goto l5; } z__ = f; l5: ; } if (s0 + z__ == s0) { goto l6; } /* l9: */ /* } */ l6: for (i__ = 1; i__ <= 7; ++i__) { printf("\n %20.12e \n", x[i__-1]); } /* l21: */ return 0; } /* main */Подпрограмма ash0d_c (a, b, x, s, n, p) находит решение системы ax = b, причем при повторном решении системы с той же матрицей и другой правой частью параметр p полагают отличным от единицы. Проводится два шага уточнения решения системы с матрицей Гильберта 7 порядка и правой частью b = (0, 0, 0, 0, 1, 0, 0).
Результат: x1 x2 x3 4.85115043411 + 04 4.85099999532 + 04 4.85100000000 + 04 - 1.94046009606 + 06 - 1.94039999813 + 06 - 1.94040000000 + 06 1.87115797099 + 07 1.87109999819 + 07 1.87110000000 + 07 - 7.27672565200 + 07 - 7.27649999300 + 07 - 7.27650000001 + 07 1.33406641488 + 08 1.33402499871 + 08 1.33402500000 + 08 - 1.15263342213 + 08 - 1.15259759888 + 08 - 1.15259760000 + 08 3.78389772248 + 07 3.78377999634 + 07 3.78378000000 + 07 где x1 - решение системы без уточнения; x2 - решение системы после 1-ого шага уточнения; x3 - решение системы после 2-ого шага уточнения.