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