Текст подпрограммы и версий asp1r_c.zip , asp1d_c.zip , asp1c_c.zip |
Тексты тестовых примеров tasp1r_c.zip , tasp1d_c.zip , tasp1c_c.zip |
Нахождение нормального решения неопределенной системы линейных алгебраических уравнений полного ранга методом отражений.
Находится нормальное решениe cиcтемы АХ = В, где А - матрица полного ранга размера N на М (N ≤ М), В - заданный вектор длины N. Для решения используется нормализованное приведение матрицы системы к нижней треугольной форме L с помощью последовательности преобразований отражения
(1) SAQ1Q2...QN = L ,
где Qi - соответствующие матрицы отражения, 1 ≤ i ≤ N , S - результирующая матрица перестановок, L - нижняя треугольная матрица размера N на М.
Из полученной треугольной системы
LY = SB
находится нормальное решение Y, по которому затем определяется искомое решение Х = Q1Q2 ... QNY .
Д.К.Фадеев, В.Н.Кублановская, В.Н.Фадеева, О решении линейных алгебраических систем с прямоугольными матрицами. Тp. Мат. ин-та АН СССР, 1968, 96.
int asp1r_c (real *a, real *b, real *x, real *t, integer *s, integer *n, integer *m, integer *l)
Параметры
a - | вещественный двумерный массив размера n на m (n ≤ m), в котором задается исходная матрица A; в результате работы подпрограммы в массиве a на соответствуюших местах запоминаются поддиагональные элементы вычисленной нижней треугольной матрицы L; в остальной части массива в последовательных строках запоминаются векторы, порождающие соответствующие матрицы отражения; |
b - | вещественный вектор длины n, в котором задается правая часть системы; |
x - | вещественный вектор длины m , в котором запоминается найденное решение системы; |
t - | вещественный вектор длины m, используемый подпрограммой как рабочий; в результате работы подпрограммы в первых n компонентах массива t запоминаются диагональные элементы нижней треугольной матрицы L; |
is - | целый вектор длины n, в котором запоминаются перестановки строк при проведении нормализованного процесса (1); в is (k) запоминается номер строки, переставленной с k - ой строкой на k - ом шаге преобразования; |
n, m - | число строк и столбцов исходной матрицы A, n ≤ m (тип: целый); |
l - | задает режим работы подпрограммы (тип: целый); при этом: |
l = 1 - | если система с данной матрицей A решается в первый раз; |
l ≠ 1 - | если система решается повторно с той же матрицей A, но с другой правой частью; в этом случае разложение (1) матрицы A не выполняется. |
Версии
asp1d_c - | нахождение нормального решения недоопределенной системы линейных алгебраических уравнений полного ранга, заданной с удвоенной точностью, методом отражений. |
asp1c_c - | нахождение нормального решения комплексной недоопределенной системы линейных алгебраических уравнений полного ранга методом отражений. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме asp1c_c параметры a, b, x, t имеют тип complex. | |
2. |
В подпрограмме asp1d_c параметры a, b, x, t имеют тип double. | |
3. | При повторном решении системы с той же матрицей информация, полученная ранее в массивах a, t, is не должна портиться. |
int main(void) { /* Initialized data */ static float a[20] /* was [4][5] */ = { 1.f,-2.f,3.f,-4.f,-5.f,6.f,-7.f, 8.f,9.f,10.f,-11.f,12.f,0.f,1.f,-1.f,4.f,-5.f,-15.f,16.f,-20.f }; static float b[12] = { 1.f,-24.f,27.f,-36.f,6.f,13.f,-13.f,16.f,6.f,-8.f, 10.f,-12.f }; /* Local variables */ extern int asp1r_c(float *, float *, float *, float *, int *, int *, int *, int *); static int i__, j, p, s[4]; static float t[5], x[5], a1[20] /* was [4][5] */, b1[4]; static int i1, j1; #define a_ref(a_1,a_2) a[(a_2)*4 + a_1 - 5] #define a1_ref(a_1,a_2) a1[(a_2)*4 + a_1 - 5] for (i__ = 1; i__ <= 4; ++i__) { for (j = 1; j <= 5; ++j) { /* l100: */ a1_ref(i__, j) = a_ref(i__, j); } } j1 = 0; for (i1 = 1; i1 <= 3; ++i1) { for (i__ = 1; i__ <= 4; ++i__) { /* l110: */ b1[i__ - 1] = b[j1 + i__ - 1]; } for (i__ = 1; i__ <= 4; ++i__) { printf("\n %16.7e %16.7e %16.7e \n", a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3)); printf("\n %16.7e %16.7e \n", a_ref(i__, 4), a_ref(i__, 5)); } for (i__ = 1; i__ <=4; ++i__) { printf("\n %16.7e \n", b1[i__-1]); } p = 1; asp1r_c(a, b1, x, t, s, &c__4, &c__5, &p); for (i__ = 1; i__ <= 4; ++i__) { printf("\n %16.7e %16.7e %16.7e \n", a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3)); printf("\n %16.7e %16.7e \n", a_ref(i__, 4), a_ref(i__, 5)); } for (i__ = 1; i__ <= 5; ++i__) { printf("\n %16.7e \n", t[i__-1]); } printf("\n %5i %5i %5i %5i \n", s[0], s[1], s[2], s[3]); for (i__ = 1; i__ <= 4; ++i__) { printf("\n %16.7e \n", b1[i__-1]); } for (i__ = 1; i__ <= 5; ++i__) { printf("\n %16.7e \n", x[i__-1]); } for (i__ = 1; i__ <= 4; ++i__) { for (j = 1; j <= 5; ++j) { /* l101: */ a_ref(i__, j) = a1_ref(i__, j); } } j1 += 4; } /* l102: */ return 0; } /* main */ Результат: x = ( 0.00000000044, -0.069999999928, 0.799999999989, -2.7000000002, 3.4999999997, -1.5400000002 )