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