Текст подпрограммы и версий
afp4r_c.zip , afp4c_c.zip , afp4d_c.zip
Тексты тестовых примеров
tafp4r_c.zip , tafp4c_c.zip , tafp4d_c.zip

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

Назначение

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

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

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

     QM ... Q1AR1 ... RM-2 = D , 

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

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

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

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

Параметры

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

Версии

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

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

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

  1. 

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

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

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

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

    /* Local variables */
    extern int afp4r_c(float *, int *, int *, float *, float *);
    static int i__;
    static float d1[6], d2[4];

#define a_ref(a_1,a_2) a[(a_2)*6 + a_1 - 7]

    afp4r_c(a, &c__6, &c__4, d1, d2);

    for (i__ = 1; i__ <= 6; ++i__) {
        printf("\n %16.7e %16.7e %16.7e %16.7e \n",
              a_ref(i__,1), a_ref(i__,2), a_ref(i__,3), a_ref(i__,4));
    }
    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   1.064    0.870    0.332 |
                     |  0.000  -1.045    1.310  -0.534 |
     a_ref  =    | -0.393  -0.904    1.279   0.000 |
                     |  0.262  -0.118   -0.252   1.257 |
                     | -0.131   0.070    0.501  -0.518 |
                     | -0.787  -0.266  -0.221  -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  -3.175   0.000    0.000 |
                 |  0.000   7.608  -3.851    0.000 |
      d  =    |  0.000   0.000  -2.625    0.412 |
                 |  0.000   0.000   0.000   -4.142 |
                 |  0.000   0.000   0.000     0.000 |
                 |  0.000   0.000   0.000     0.000 |

      qi  =  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)

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

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