Текст подпрограммы и версий
afg3c_c.zip
Тексты тестовых примеров
tafg3c_c.zip

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

Назначение

Приведение пары комплексных матриц к верхней почти треугольной форме элементарными преобразованиями с помощью LZ - алгоритма.

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

Для заданных комплексных матриц А и В размера N*N вычисляются такие элементарные матрицы L и Z размера N*N, что матрица LAZ является верхней почти треугольной, а матрица LВZ - верхней треугольной.

В результате работы подпрограммы afg3c_c матрица LAZ помещается на место матрицы А, матрица LВZ - на место матрицы В. Левостороннее преобразование L не сохраняется, правостороннее преобразование Z по желанию пользователя может сохраняться.

R.S.Мartin, J.Н.Wilkinson, Tне Мodified LR - Аlgorithm for Сomplex Нessenberg Мatrices, Numer.Мath., 12, 1968.

С.В.Мoler, G.W.Stewart, Аn Аlgorithm for тне Generalized Мatrix Еigenvalue Рrodlems, siam J. Numer. Аnal., 10, 1973.

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

    int afg3c_c (complex *a, complex *b, complex *z, integer *n,
            integer *m)

Параметры

a, b - комплексные двумерные массивы размера n*n, в которых задаются исходные матрицы a и b; в результате работы подпрограммы в массивы a и b записываются соответственно верхняя почти треугольная матрица laz и верхняя треугольная матрица lbz;
z - комплексный двумерный массив размера n*n, который содержит вычисленное правостороннее преобразование z; если преобразование не нужно, то параметр z в подпрограмме не используется;
n - заданный порядок матриц a, b и z (тип: целый);
m - задает режим работы подпрограммы (тип: целый); причем
m = 0 - если преобразование z сохраняется,
m = 1 - если преобразование z не сохраняется.

Версии: нет

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

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

  1. 

Матрица преобразования z необходима для вычисления собственных векторов обобщенной проблемы ax = λbx по правилу x = zy, где y - собственные векторы обобщенной проблемы lazy =λlbzy .

  2.  Если матрица преобразования z не нужна, т.е. когда m = 1, то в качестве фактического параметра z можно использовать параметр a.

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

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

    /* Local variables */
    static int ierr;
    extern int afg3c_c(complex *, complex *, complex *, int *, int *);
    static int i__, m, n;
    static complex z__[9] /* was [3][3] */;

#define a_subscr(a_1,a_2) (a_2)*3 + a_1 - 4
#define a_ref(a_1,a_2) a[a_subscr(a_1,a_2)]
#define b_subscr(a_1,a_2) (a_2)*3 + a_1 - 4
#define b_ref(a_1,a_2) b[b_subscr(a_1,a_2)]
#define z___subscr(a_1,a_2) (a_2)*3 + a_1 - 4
#define z___ref(a_1,a_2) z__[z___subscr(a_1,a_2)]

    for (i__ = 1; i__ <= 3; ++i__) {
        printf("\n  %14.5f %14.5f %14.5f %14.5f \n",
         a_ref(i__, 1).r, a_ref(i__, 1).i, a_ref(i__, 2).r, a_ref(i__, 2).i);
        printf("\n  %14.5f %14.5f \n",
         a_ref(i__, 3).r, a_ref(i__, 3).i);
    }
    for (i__ = 1; i__ <= 3; ++i__) {
        printf("\n  %14.5f %14.5f %14.5f %14.5f \n",
         b_ref(i__, 1).r, b_ref(i__, 1).i, b_ref(i__, 2).r, b_ref(i__, 2).i);
        printf("\n  %14.5f %14.5f \n",
         b_ref(i__, 3).r, b_ref(i__, 3).i);
    }
    n = 3;
    m = 0;
    afg3c_c(a, b, z__, &n, &m);

    for (i__ = 1; i__ <= 3; ++i__) {
        printf("\n  %14.5f %14.5f %14.5f %14.5f \n",
         a_ref(i__, 1).r, a_ref(i__, 1).i, a_ref(i__, 2).r, a_ref(i__, 2).i);
        printf("\n  %14.5f %14.5f \n",
         a_ref(i__, 3).r, a_ref(i__, 3).i);
    }
    for (i__ = 1; i__ <= 3; ++i__) {
        printf("\n  %14.5f %14.5f %14.5f %14.5f \n",
         b_ref(i__, 1).r, b_ref(i__, 1).i, b_ref(i__, 2).r, b_ref(i__, 2).i);
        printf("\n  %14.5f %14.5f \n",
         b_ref(i__, 3).r, b_ref(i__, 3).i);
    }
    for (i__ = 1; i__ <= 3; ++i__) {
        printf("\n  %14.5f %14.5f %14.5f %14.5f \n",
  z___ref(i__, 1).r, z___ref(i__, 1).i, z___ref(i__, 2).r, z___ref(i__, 2).i);
        printf("\n  %14.5f %14.5f \n",
         z___ref(i__, 3).r, z___ref(i__, 3).i);
    }
    printf("\n  %5i \n", ierr);
    return 0;
} /* main */


Результаты:

                    |   5.00000 + 0.0 i    1.03125 + 0.0 i      0.50000 + 0.0 i |
      a_ref  =  |-13.75000 + 0.0 i    1.22056 + 0.0 i     -0.37500 + 0.0 i |
                    |    0.0        + 0.0 i     0.40455 + 0.0 i    -0.07273 + 0.0 i |

                    | 4.00000 + 0.0 i     0.56250 + 0.0 i     1.00000 + 0.0 i |
      b_ref  =  | 0.0         + 0.0 i     2.57812 + 0.0 i    -0.75000 + 0.0 i |
                    | 0.50000 + 0.0 i     0.0         + 0.0 i    -0.14545 + 0.0 i |

                        | 1.0     + 0.0 i     0.0        + 0.0 i     0.0     + 0.0 i |
      z___ref  =  | 0.0     + 0.0 i     1.0         + 0.0 i     0.0     + 0.0 i |
                        | 0.0     + 0.0 i     0.06250 + 0.0 i     1.0     + 0.0 i |