Текст подпрограммы и версий
asp4a_c.zip , asp4d_c.zip , asp4e_c.zip
Тексты тестовых примеров
tasp4a_c.zip , tasp4d_c.zip , tasp4e_c.zip

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

Назначение

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

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

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