Текст подпрограммы и версий
afp3r_c.zip , afp3c_c.zip , afp3d_c.zip
Тексты тестовых примеров
tafp3r_c.zip , tafp3c_c.zip , tafp3d_c.zip

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

Назначение

LQ - разложение вещественной прямоугольной матрицы размера n*m (n ≤ m) нормализованным процессом метода отражений.

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

Выполняется факторизация матрицы А вида РА = LQ, где Q - унитарная матрица, L - нижняя треугольная матрица, Р - матрица перестановок. Матрица Р осуществляет перестановку строк матрицы А и обеспечивает выполнение нормализованного процесса. Матрица Q строится как произведение матриц QNT, ..., Q2T, Q1T, где Q1, Q2, ... QN - преобразования отражения, приводящие матрицу РА к нижнему треугольному виду:

     paq1Q2 ... QN = L . 

В.В.Воеводин, Л.И.Карышева, Г.Д.Ким, Р.В.Петрина, Комплекс алгоритмов, основанных на преобразованиях отражения, в пакете линейной алгебры, Сб. "Численный анализ на ФОРТРАНе", вып.3, Изд. МГУ, 1973.

Использование

    int afp3r_c (real *a, integer *n, integer *m, real *w,
            integer *s)

Параметры

a - двумерный n*m массив, в котором задается исходная матрица (тип: real); в результате работы подпрограммы в массиве a на соответствующих местах запоминаются поддиагональные элементы матрицы L, в остальной части массива в последовательных строках запоминаются векторы, порождающие матрицы отражения Q1, Q2, ..., Qn ;
n, m - заданные размеры исходной матрицы, причем n ≤ m (тип: целый);
w - одномерный массив длины m, используемый подпрограммой как рабочий (тип: real); в результате работы подпрограммы в первых n компонентах w запоминаются диагональные элементы матрицы l;
s - одномерный массив длины n, в котором запоминается вектор, порождающий матрицу перестановок (тип: целый); в s (k) запоминается номер строки, переставленной с K - ой строкой текущей матрицы на K - ом шаге преобразования.

Версии

afp3c_c - LQ - разложение нормализованным процессом метода отражений для прямоугольной n*m (n ≤ m) комплексной матрицы;
afp3d_c - LQ - разложение нормализованным процессом метода отражений для прямоугольной n*m (n ≤ m) вещественной матрицы, заданной с удвоенной точностью.

Вызываемые подпрограммы: нет

Замечания по использованию

  1. 

В подпрограмме afp3c_c массивы a, w имеют тип complex.

  2.  В подпрограмме afp3d_c массивы a, w имеют тип double.

Пример использования

int main(void)
{
    /* Initialized data */
    static float a[15] /* was [3][5] */ = { 1.f,0.f,1.f,2.f,1.f,3.f,0.f,1.f,
                                            1.f,1.f,2.f,0.f,-1.f,1.f,0.f };
    /* Local variables */
    extern int afp3r_c(float *, int *, int *, float *, int *);
    static int i__, l[3];
    static float v[5];

    for (i__ = 0; i__ <=12; i__+=3) {
        printf("\n %12.4e %12.4e %12.4e \n",
          a[i__], a[i__+1], a[i__+2]);
    }
    afp3r_c(a, &c__3, &c__5, v, l);

    for (i__ = 0; i__ <=12; i__+=3) {
        printf("\n %16.7e %16.7e %16.7e \n",
          a[i__], a[i__+1], a[i__+2]);
    }
    printf("\n %16.7e %16.7e %16.7e \n", v[0], v[1], v[2]);
    printf("\n %5i %5i %5i \n", l[0], l[1], l[2]);
    return 0;
} /* main */


Результат:

                 |  1.141    0.793   0.264  0.000    0.000 |
      a  =    | -1.206    1.034   0.296  0.822   0.411 |   , 
                 | -2.111  -0.193  -1.209  0.509  -0.529 |

       ( (v(i), i = 1, 3)  =  -3.317,  -2.355,  1.584) , 

      l  =   (3,  2,  3) .

Это означает, что

                 | -3.317   0.        0.        0.  0. |
      r  =    | -1.206  -2.355  0.        0.  0. |  , 
                 | -2.111  -0.193  1.584  0.  0. |

      qi =  i - wi * wit ,    i = 1, 2, 3 ,
 где
      w1t  =   (1.141,  0.793,  0.264,  0.,  0.) ,

      w2t  =   (0.,  1.034,  0.296,  0.822,  0.411) ,

      w3t  =   (0.,  0.,  -1.209,  0.509,  -0.529) .