|
Текст подпрограммы и версий asp4a_c.zip , asp4d_c.zip , asp4e_c.zip |
Тексты тестовых примеров tasp4a_c.zip , tasp4d_c.zip , tasp4e_c.zip |
Нахождение нормального псевдорешения переопределенной системы линейных алгебраических уравнений полного ранга методом вращений.
Находится нормальное псевдopeшeние системы Аx = b, где А - матрица полного ранга размера N на М (N≥ М), b - заданный вектор длины N. Для решения используется приведение матрицы системы к верхней треугольной форме с помощью последовательности преобразований вращения
RN M...R2 1A = T ,
где Ri j, i > j, i = 2, 3, ..., N, j = 1, 2, ..., М, - соответствующие матрицы вращения, Т - верхняя треугольная матрица размера N на М. Тем самым исходная задача сводится к решению треугольной системы
Tx = RN M ... R2 1b .
В.В.Воеводин, Вычислительные основы линейной алгебры, М., 1977.
int asp4a_c (real *a, real *b, real *x, integer *n, integer *m,
integer *l)
Параметры
| a - | вещественный двумерный массив размера n на m (n ≥ m), в котором задается исходная матрица A; в результате работы подпрограммы в массиве a на соответствующих местах запоминаются элементы вычисленной верхней треугольной матрицы T; в остальной части массива a запоминается информация о матрицах вращения Ri j; |
| b - | вещественный вектор длины n, в котором задается правая часть системы; |
| x - | вещественный вектор длины n, в первых m компонентах которого запоминается найденное псевдорешение; |
| n, m - | число строк и столбцов матрицы A, причем n ≥ m (тип: целый); |
| l - | задает режим работы подпрограммы (тип:целый); a именно: |
| l = 1 - | если система с данной матрицей решается в первый раз; |
| l ≠ 1 - | если система повторно решается с другой правой частью и с той же матрицей (не выполняется заново приведение матрицы к верхней треугольной форме). |
Версии
| asp4d_c - | нахождение нормального псевдорешения переопределенной системы линейных алгебраических уравнений полного ранга, заданных с удвоенной точностью, методом вращений. |
| asp4e_c - | нахождение нормального псевдорешения переопределенной комплексной системы линейных алгебраических уравнений полного ранга методом вращений. |
Вызываемые подпрограммы: нет
Замечания по использованию
| 1. |
В подпрограмме asp4d_c параметры a, b, x имеют тип double. | |
| 2. |
В подпрограмме asp4e_c параметры a, b, x имеют тип complex. | |
| 3. | При повторном решении системы с той же матрицей информация, полученная ранее в массиве a, не должна портиться. |
int main(void)
{
/* System generated locals */
int i__1;
/* Local variables */
extern int asp4a_c(float *, float *, float *, int *, int *, int *);
static float a[30] /* was [6][5] */, b[6];
static int i__, j;
static float x[6];
#define a_ref(a_1,a_2) a[(a_2)*6 + a_1 - 7]
for (i__ = 1; i__ <= 6; ++i__) {
for (j = 1; j <= 5; ++j) {
/* l2: */
a_ref(i__, j) = 0.f;
}
}
for (i__ = 1; i__ <= 5; ++i__) {
i__1 = i__;
for (j = 1; j <= i__1; ++j) {
/* l3: */
a_ref(i__, j) = 1.f;
}
}
for (i__ = 1; i__ <= 6; ++i__) {
/* l4: */
b[i__ - 1] = (float) i__;
}
asp4a_c(a, b, x, &c__6, &c__5, &c__1);
for (i__ = 0; i__ <= 3; i__+= 3) {
printf("\n %15.7e %15.7e %15.7e \n",
x[i__], x[i__+1], x[i__+2]);
}
for (i__ = 0; i__ <= 3; i__+= 3) {
printf("\n %15.7e %15.7e %15.7e \n",
b[i__], b[i__+1], b[i__+2]);
}
for (i__ = 0; i__ <= 25; i__+= 5) {
printf("\n %15.7e %15.7e %15.7e %15.7e %15.7e \n",
a[i__], a[i__+1], a[i__+2], a[i__+3], a[i__+4]);
}
return 0;
} /* main */
Результат:
x = ( 1., 1., 1., 1., 1. )