Текст подпрограммы и версий
aet3c_c.zip , aet3p_c.zip
Тексты тестовых примеров
taet3c_c.zip , taet3p_c.zip

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

Назначение

Вычисление собственных вектоpов верхней комплексной матрицы Хессенберга, соответствующих указанным собственным значениям.

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

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

Возникающие в методе обратных итераций системы

     ( A - λ I ) x  =  y , 

где λ - задаваемое приближение к собственному значению матрицы A, решаются методом Гаусса с выбором ведущего элемента по столбцу.

Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра. M.: "Машиностроение", 1976.

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

    int aet3c_c (integer *nm, integer *n, real *ar, real *ai, real
        *wr, real *wi, logical *select, integer *mm, integer *m, real *zr, 
            real *zi, real *rm1, real *rm2, real *rv1, real *rv2, integer *ierr)

Параметры

nm - число стpок двумерных массивов ar, ai, zr и zi, указанное при описании этих массивов в вызывающей подпрограмме (тип: целый);
n - порядок исходной матрицы, n ≤ nm (тип: целый);
ar, ai - вещественные двумерные массивы размерности nm на n, содержащие в своих первых n стpоках соответственно вещественную и мнимые части исходной матрицы Хессенберга;
wr, wi - вещественные векторы длины n, содержащие на входе в подпрограмму соответственно вещественные и мнимые части собственных значений исходной матрицы Хессенберга; если исходная матрица является правой квазитреугольной, то требуется, чтобы собственные значения каждой диагональной клетки исходной матрицы имели бы в массивах wr и wi индексы, заключенные между граничными индексами соответствующей диагональной клетки; этому условию удовлетворяют собственные значения, вычисленные подпрограммой aet2r_c;
select - логический вектоp длины n, служащий для выделения тех собственных значений, для которых нужно вычислить собственные векторы, при этом, если требуется вычислить собственный вектоp, соответствующий собственному значению, имеющему индекс I в массивах wr и wi, то select (i) = true;
mm - задаваемая оценка свеpху для числа столбцов, требующихся для хранения вычисляемых собственных вектоpов (тип: целый);
m - целая переменная равная на выходе из подпрограммы числу столбцов, действительно использованных для хранения вычисленных собственных вектоpов;
zr, zi - вещественные двумерные массивы размерности nm на mm, содержащие на выходе из подпрограммы в своих первых m столбцах соответственно вещественные и мнимые части вычисленных собственных вектоpов;
          rm1 -
          rm2  
вещественные рабочие векторы длины n2;
            rv1 -
            rv2  
вещественные рабочие векторы длины n;
ierr - целочисленная переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr = - (2*n + 1) - если для хранения искомых собственных вектоpов требуется более mm столбцов, в этом случае на выходе из подпрограммы m = mm;
ierr = - k - если для собственного значения с индексом K не было получено приемлемого приближения к собственному вектоpу; в этом случае компоненты этого вектоpа приравниваются нулю; если таких собственных вектоpов несколько, то в качестве K берется индекс последнего из них;
ierr = - (n + k) - если обе описанные выше ошибки имели место;
ierr= 0 - в случае нормального выхода из подпрограммы.

Версии

aet3p_c - вычисление собственных вектоpов верхней комплексной матрицы Хессенберга, заданной с двойной точностью, по заданным собственным значениям.

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

utae12_c - подпрограмма выдачи диагностических сообщений при работе подпрограмм aet3c_c и aet3p_c.

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

  1. 

Подпрограмма aet3c_c сохраняет исходную матрицу (массив a) и заданные собственные значения (массивы wr и wi), если не считать незначительные возмущения вещественных частей некоторых близких собственных значений (массив wr), произведенные с целью получения независимых собственных вектоpов.

  2.  B подпрограмме aet3p_c параметры ar, ai, wr, wi, zr, zi, rm1, rm2, rv1, rv2 имеют тип double.

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

int main(void)
{
    /* Initialized data */
    static float ar[9]   /* was [3][3] */ = { 2.f,0.f,0.f,-2.f,0.f,-1.f,4.f,
                                              2.f,3.f };
    static float ai[9]   /* was [3][3] */ = { 2.f,0.f,0.f,-2.f,1.f,0.f,4.f,0.f,
                                              1.f };
    static float wr[3] = { 2.f,1.f,2.f };
    static float wi[3] = { 2.f,1.f,1.f };

    /* Local variables */
    static int ierr;
    extern int aet3c_c(int *, int *, float *, float *, float *, float *,
                       logical *, int *, int *, float *, float *,
                       float *, float *, float *, float *, int *);
    static int i__, m, n, mm;
    static float zi[6] /* was [3][2] */, zr[6] /* was [3][2] */;
    static logical select[3];
    static float rm1[9] /* was [3][3] */,
                 rm2[9] /* was [3][3] */, rv1[3], rv2[3];

#define zi_ref(a_1,a_2) zi[(a_2)*3 + a_1 - 4]
#define zr_ref(a_1,a_2) zr[(a_2)*3 + a_1 - 4]

    mm = 2;
    n = 3;
    select[0] = TRUE_;
    select[1] = FALSE_;
    select[2] = TRUE_;
    aet3c_c(&c__3, &c__3, ar, ai, wr, wi, select, &mm, &m, zr, zi, rm1, rm2,
            rv1, rv2, &ierr);

    printf("\n %5i %5i \n", ierr, m);
    printf("\n %16.7e %16.7e %16.7e \n", wr[0], wr[1], wr[2]);
    printf("\n %16.7e %16.7e %16.7e \n", wi[0], wi[1], wi[2]);
    for (i__ = 1; i__ <= 3; ++i__) {
        printf("\n %16.7e %16.7e \n",
                 zr_ref(i__,1), zr_ref(i__,2));
    }
    for (i__ = 1; i__ <= 3; ++i__) {
        printf("\n %16.7e %16.7e \n",
                 zi_ref(i__,1), zi_ref(i__,2));
    }
/* l20: */
    return 0;
} /* main */


Результаты:

      m  =  2 ,    ierr  =  0 ,

                  | 1.    1.     |
       zr_ref  =  | 0.   -0.25 |
                  | 0.   -0.25 |

                 | 0.    0.     |
       zi_ref  =  | 0.   -0.25 |
                 | 0.   -0.25 |