Текст подпрограммы и версий asp0r_c.zip , asp0d_c.zip , asp0c_c.zip |
Тексты тестовых примеров tasp0r_c.zip , tasp0d_c.zip , tasp0c_c.zip |
Нахождение нормального псевдорешения переопределенной системы линейных алгебраических уравнений полного ранга методом отражений.
Находится нормальное псевдopeшeние системы АX = B, где А - матрица полного ранга размера N на М (N ≥ М), В - заданный вектор длины N. Для решения используется нормализованное приведение матрицы системы к верхней треугольной форме R с помощью последовательности преобразований отражения
(1) QMQM-1...Q1AS = R ,
где Qi - соответствующие матрицы отражения, S - результирующая матрица перестановок, R - верхняя треугольная матрица размера N на М.
Из полученной треугольной системы
RY = QMQM-1...Q1B
находится нормальное псевдорешение Y, по которому затем определяется искомое решение Х = SY.
Д.К.Фадеев, В.Н.Фадеева, В.Н.Кублановская, О решении линейных алгебраических систем с прямоугольными матрицами. Тp. Мат. ин-та АН СССР, 1968, 96.
int asp0r_c (real *a, real *b, real *x, real *t, integer *s, integer *n, integer *m, integer *l)
Параметры
a - | вещественный двумерный массив размера n на m (n ≥ m), в котором задается исходная матрица A; в результате работы подпрограммы в массиве a на соответствующих местах запоминаются наддиагональные элементы вычисленной верхней треугольной матрицы R; в остальной части массива a в последовательных столбцах запоминаются векторы, порождающие соответствующие матрицы отражения; |
b - | вещественный вектор длины n, в котором задается правая часть системы; |
x - | вещественный вектор длины m, в котором запоминается найденное псевдорешение системы; |
t - | вещественный вектор длины n, используемый подпрограммой как рабочий; в результате работы подпрограммы в первых m компонентах массива t запоминаются диагональные элементы верхней треугольной матрицы R; |
is - | целый вектор длины m, в котором запоминаются перестановки столбцов при проведении нормализованного процесса (1); в is (k) запоминается номер столбца переставленного с k - ым столбцом на k - ом шаге преобразования; |
n, m - | число строк и столбцов исходной матрицы A, n ≥ m (тип: целый); |
l - | задает режим работы подпрограммы (тип: целый); при этом: |
l = 1 - | если система с данной матрицей A решается в первый раз; |
l ≠ 1 - | если система решается повторно с той же матрицей A, но с другой правой частью; в этом случае разложение (1) матрицы A не выполняется. |
Версии
asp0d_c - | нахождение нормального псевдорешения переопределенной системы линейных алгебраических уравнений полного ранга, заданной с удвоенной точностью, методом отражений. |
asp0c_c - | нахождение нормального псевдорешения комплексной переопределенной системы линейных алгебраических уравнений полного ранга методом отражений. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме asp0c_c параметры a, b, x, t имеют тип complex. | |
2. |
В подпрограмме asp0d_c параметры a, b, x, t имеют тип double. | |
3. | При повторном решении системы с той же матрицей, информация, полученная ранее в массивах a, t, is, не должна портиться. |
int main(void) { /* Initialized data */ static float a[20] /* was [5][4] */ = { 2520.f,1260.f,840.f,630.f,504.f, 1260.f,840.f,630.f,504.f,420.f,840.f,630.f,504.f,420.f,360.f, 630.f,504.f,420.f,360.f,315.f }; static float b[5] = { 840.f,630.f,504.f,420.f,360.f }; static float b1[5] = { 5250.f,3234.f,2394.f,1914.f,1599.f }; /* Local variables */ extern int asp0r_c(float *, float *, float *, float *, int *, int *, int *, int *); static int i__, j, k, p, s[4]; static float t[5], x[4], a1[20] /* was [5][4] */; #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] for (i__ = 1; i__ <= 5; ++i__) { for (j = 1; j <= 4; ++j) { /* l92: */ a1_ref(i__, j) = a_ref(i__, j); } } for (k = 1; k <= 2; ++k) { for (i__ = 1; i__ <= 5; ++i__) { printf("\n %12.4e %12.4e %12.4e %12.4e \n", a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3), a_ref(i__, 4)); } for (i__ = 1; i__ <= 5; ++i__) { printf("\n %12.4e \n", b[i__-1]); } p = 1; asp0r_c(a, b, x, t, s, &c__5, &c__4, &p); for (i__ = 1; i__ <= 5; ++i__) { printf("\n %16.7e %16.7e %16.7e %16.7e \n", a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3), a_ref(i__, 4)); } 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__ <= 5; ++i__) { printf("\n %16.7e \n", b[i__-1]); } for (i__ = 1; i__ <= 4; ++i__) { printf("\n %16.7e \n", x[i__-1]); } for (i__ = 1; i__ <= 5; ++i__) { b[i__ - 1] = b1[i__ - 1]; for (j = 1; j <= 4; ++j) { /* l91: */ a_ref(i__, j) = a1_ref(i__, j); } } /* l9: */ } return 0; } /* main */ Результат: x = (1.00000000005, 0.500000000016, 0.3333333334, 0.25000000003, 0.20000000001)