Текст подпрограммы и версий asp5a_c.zip , asp5d_c.zip , asp5e_c.zip |
Тексты тестовых примеров tasp5a_c.zip , tasp5d_c.zip , tasp5e_c.zip |
Нахождение нормального решения недоопределенной системы линейных алгебраических уравнений полного ранга методом вращений.
Находится нормальное решениe cиcтемы Аx = b, где А - матрица полного ранга размера N на М (N ≤ М), b - заданный вектор длины N. Для решения используется приведение матрицы системы к нижней треугольной форме с помощью последовательности преобразований вращения
AR1 2...RN M = T ,
где Ri j, i < j, i = 1, ..., N, j = 2, ..., М, - соответствующие матрицы вращения, Т - нижняя треугольная матрица размера N на М. Из полученной треугольной системы
Ty = b
находится нормальное решение y, по которому затем определяется искомое решение x = R1 2 ... RN Мy .
В.В.Воеводин, Вычислительные основы линейной алгебры, М., 1977.
int asp5a_c (real *a, real *b, real *x, integer *n, integer *m, integer *l)
Параметры
a - | вещественный двумерный массив размера n на m (n ≤ m), в котором задается исходная матрица; в pезультате работы подпрограммы в массиве a на соответствующих местах запоминаются элементы вычисленной нижней треугольной матрицы T; в остальной части массива запоминается информация о матрицах вращения Ri j; |
b - | вещественный вектор длины n, в котором задается правая часть системы; |
x - | вещественный вектор длины m, в котором запоминается найденное решение системы; |
n, m - | число строк и столбцов исходной матрицы A, причем n ≤ m (тип: целый); |
l - | задает режим работы подпрограммы (тип: целый), а именно: |
l = 1 - | если система с данной матрицей решается в первый раз; |
l ≠ 1 - | если система повторно решается с другой правой частью и с той же матрицей (не выполняется заново приведение матрицы к нижней треугольной форме). |
Версии
asp5d_c - | нахождение нормального решения недоопределенной системы линейных алгебраических уравнений полного ранга, заданной с удвоенной точностью, методом вращений. |
asp5e_c - | нахождение нормального решения недоопределенной комплексной системы линейных алгебраических уравнений полного ранга методом вращений. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме asp5d_c параметры a, b, x имеют тип double. | |
2. |
В подпрограмме asp5e_c параметры a, b, x имеют тип complex. | |
3. | При повторном решении системы с той же матрицей информация, полученная ранее в массиве a, не должна портиться. |
int main(void) { /* Local variables */ extern int asp5a_c(float *, float *, float *, int *, int *, int *); static float a[30] /* was [5][6] */, b[6]; static int i__, j; static float x[6]; #define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6] for (i__ = 1; i__ <= 5; ++i__) { for (j = 1; j <= 6; ++j) { /* l2: */ a_ref(i__, j) = 0.f; } } for (i__ = 1; i__ <= 5; ++i__) { for (j = i__; j <= 5; ++j) { /* l3: */ a_ref(i__, j) = 1.f; } } for (i__ = 1; i__ <= 6; ++i__) { /* l4: */ b[i__ - 1] = (float) (6 - i__); } asp5a_c(a, b, x, &c__5, &c__6, &c__1); for (i__ = 0; i__ <= 4; i__+= 2) { printf("\n %15.7e %15.7e \n", x[i__], x[i__+1]); } for (i__ = 0; i__ <= 4; i__+= 2) { printf("\n %15.7e %15.7e \n", b[i__], b[i__+1]); } for (i__ = 0; i__ <= 28; i__+= 2) { printf("\n %15.7e %15.7e \n", a[i__], a[i__+1]); } return 0; } /* main */ Результат: x = ( 1., 1., 1., 1., 1., 0. )