Текст подпрограммы и версий ash0r_c.zip , ash0c_c.zip , ash0d_c.zip |
Тексты тестовых примеров tash0r_c.zip , tash0c_c.zip , tash0d_c.zip |
Решение системы линейных алгебраических уравнений с симметричной матрицей модифицированным методом квадратного корня (модифицированным методом Холецкого).
Подпрограмма 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)