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