Текст подпрограммы и версий
afp1r_c.zip , afp1c_c.zip , afp1d_c.zip
Тексты тестовых примеров
tafp1r_c.zip , tafp1c_c.zip , tafp1d_c.zip

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

Назначение

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

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

Выполняется факторизация мaтpицы А вида А = LQ, где Q - унитарная, L - нижняя треугольная матрица. Матрица L получается в результате умножения матрицы А нa последовательность преобразований отражения Q1, Q2, ..., QN тakиx, чтo АQ1Q2... QN = L , при этом

     Q = QNT ... Q2TQ1T . 

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

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

    int afp1r_c (real *a, integer *n, integer *m, real *w)

Параметры

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

Версии

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

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

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

  1. 

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

  2.  В подпрограмме afp1d_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 afp1r_c(float *, int *, int *, float *);
    static int i__;
    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]);
    }
    afp1r_c(a, &c__3, &c__5, v);

    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]);
    return 0;
} /* main */


Результат:

                 |  1.174   0.644   0.000   0.322  -0.322 |
      a  =    | -1.134   1.076   0.389   0.657   0.510 |  , 
                 | -2.646  -0.418  1.118  -0.853   0.150 |

       (v(i), i = 1, 3)  =  -2.646, -2.390, -1.956.

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

                 | -2.646   0.          0.         0.  0.|
      r  =    | -1.134  -2.390    0.         0.  0.|  , 
                 | -2.646  -0.418  -1.956   0.  0.|

      qi  =  i - wi * wit ,   i = 1, 2, 3 ,
 где
      w1t  =   (1.174,  0.644,  0.,  0.322,  -0.322) ,

      w2t  =   (0.,  1.076,  0.389,  0.657,  0.150) , 

      w3t  =   (0.,  0.,  1.118,  -0.853,  0.150) .