Текст подпрограммы и версий
afp5r_c.zip , afp5c_c.zip , afp5d_c.zip
Тексты тестовых примеров
tafp5r_c.zip , tafp5c_c.zip , tafp5d_c.zip

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

Назначение

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

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

Для прямоугольной N*М (N ≤ М) матрицы А строятся две последовательности матриц отражения Q1, Q2, ..., QN - 2, R1, R2, ..., Rn тakие, что

      QN-2 ... Q2Q1AR1R2 ... RN = D , 

где D - нижняя двухдиагональная матрица.

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

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

    int afp5r_c (real *a, integer *n, integer *m, real *d1,
            real *d2)

Параметры

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

Версии

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

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

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

  1. 

В подпрограмме afp5c_c массивы a, d1, d2 имеют тип complex.

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

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

int main(void)
{
    /* Initialized data */
    static float a[24] /* was [4][6] */ = { 1.f,4.f,3.f,2.f,0.f,1.f,1.f,-1.f,
            -3.f,1.f,5.f,6.f,2.f,-1.f,1.f,1.f,-1.f,2.f,-1.f,0.f,-6.f,0.f,2.f,
            -1.f };
    /* Local variables */
    extern int afp5r_c(float *, int *, int *, float *, float *);
    static float d1[6], d2[4];
    int i__;

    for (i__ = 0; i__ <= 21; i__+=3) {
        printf("\n %16.7e %16.7e %16.7e \n",
              a[i__], a[i__+1], a[i__+2]);
    }
    afp5r_c(a, &c__4, &c__6, d1, d2);

    for (i__ = 0; i__ <= 21; i__+=3) {
        printf("\n %16.7e %16.7e %16.7e \n",
              a[i__], a[i__+1], a[i__+2]);
    }
    for (i__ = 0; i__ <=3; i__+=3) {
        printf("\n %16.7e %16.7e %16.7e \n",
              d1[i__], d1[i__+1], d1[i__+2]);
    }
    for (i__ = 0; i__ <=2; i__+=2) {
        printf("\n %16.7e %16.7e \n", d2[i__], d2[i__+1]);
    }
    return 0;
} /* main */


Результат:

                 | 1.068    0.000  -0.393    0.262  -0.131  -0.787 |
                 | 1.064   -1.045  -0.904  -0.118   0.070  -0.266 |
      a  =    | 0.870     1.310   1.279  -0.252   0.501  -0.221 |  , 
                 | 0.332   -0.534   0.000    1.257  -0.518  -0.391 |

     d1  =   (-7.141,  7.608,  -2.625,  -4.142,  -0.518,  -0.391) ,

     d2  =   (-3.175,  -3.851,  0.412,  -0.534) .

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

                 | -7.141   0.000   0.000   0.000  0.000  0.000 |
                 | -3.175   7.608   0.000   0.000  0.000  0.000 |
      d  =    |  0.000  -3.851  -2.625   0.000  0.000  0.000 |  , 
                 |  0.000   0.000   0.412  -4.142  0.000  0.000 |

        qi  =  i - wi*wit ,    i = 1, 2 ,
где
      w1t  =   (0.000,  1.064,  0.870,  0.332) ,

      w2t  =   (0.000,  0.000,  1.310,  -0.534) ;

        ri =  i - ui*uit ,    i = 1, 2, 3, 4 ,
где
      u1t  =   (1.068,  0.000,  -0.393,  0.262, -0.131,  -0.787) ,

      u2t  =   (0.000,  -1.045,  -0.904, -0.118,  0.070, -0.266) ,

      u3t  =   (0.000,  0.000,  1.279,  -0.252,  0.501,  -0.221) ,

      u4t  =   (0.000,  0.000,  0.000,  1.257,  -0.518,  -0.391) .