Текст подпрограммы и версий
asp5a_c.zip , asp5d_c.zip , asp5e_c.zip
Тексты тестовых примеров
tasp5a_c.zip , tasp5d_c.zip , tasp5e_c.zip

Подпрограмма:  asp5a_c

Назначение

Нахождение нормального решения недоопределенной системы линейных алгебраических уравнений полного ранга методом вращений.

Математическое описание

Находится нормальное решени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. )