Текст подпрограммы и версий
aeb0r_c.zip , aeb0d_c.zip
Тексты тестовых примеров
taeb0r_c.zip , taeb0d_c.zip

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

Назначение

Вычисление собственных значений и собственных векторов вещественной симметрической ленточной матрицы с помощью QL - алгоритма.

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

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

Дж.Х.Уилкинсон, Агебраическая проблема собственных значений, "Наука", М., 1970.

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

    int aeb0r_c (integer *n, integer *nc, real *a, real *ev, real *
        v, real *rab, integer *ierr)

Параметры

n - порядок исходной матрицы (тип: целый);
nc - заданное число кодиагоналей исходной матрицы, включая главную диагональ (тип: целый);
a - вещественный двумерный массив размера n*nc, в котором задается исходная симметричная ленточная матрица в компактной форме;
ev - вещественный вектор длины n, содержащий вычисленные в возрастающем порядке собственные значения;
v - вещественный двумерный массив размерности n на n, содержащий вычисленные ортонормированные собственные векторы исходной матрицы;
rab - вещественный вектор длины n, используемый как рабочий;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом значение ierr полагается равным номеру собственного значения, для вычисления которого потребовалось более 30 итераций; в этом случае будут вычислены правильно, но не упорядочены, собственные значения с индексами  1, 2,  ..., ierr - 1 и соответствующие собственные векторы.

Версии

aeb0d_c - вычисление собственных значений и собственных векторов вещественной симметрической ленточной матрицы с помощью QL - алгоритма с двойной точностью.

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

utae10_c - подпрограмма выдачи диагностических сообщений при работе подпрограмм aeb0r_c, aeb0d_c.

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

 

Подпрограммы aeb0r_c, aeb0d_c не сохраняют исходную ленточную матрицу, но в последних двух столбцах массива a запоминается ее трехдиагональная форма.

  В подпрограмме aeb0d_c параметры a, v, ev, rab имеют тип double.

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

int main(void)
{
    /* Builtin functions */
    double pow_ri(float *, int *);

    /* Local variables */
    static int ierr;
    extern int aeb0r_c(int *, int *, float *, float *, float *, float *,
                       int *);
    static float a[21] /* was [7][3] */;
    static int i__, n;
    static float v[49] /* was [7][7] */;
    static int nc;
    static float ev[7], rab[7];
    int i__1;

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

    for (i__ = 1; i__ <= 7; ++i__) {
        i__1 = 7 - i__;
        a_ref(i__, 3) = (float)pow_ri(&c_b2, &i__1);
        a_ref(i__, 2) = 10.f;
/* l11: */
        a_ref(i__, 1) = 1.f;
    }
    nc = 3;
    n = 7;
    aeb0r_c(&n, &nc, a, ev, v, rab, &ierr);

    for (i__ = 0; i__ <= 18; i__+= 3) {
        printf("\n  %16.7e %16.7e %16.7e \n",a[i__], a[i__ + 1], a[i__ + 2]);
    }
    printf("\n  %5i \n",ierr);
    for (i__ = 1; i__ <= 7; ++i__) {
        printf("\n  %16.7e \n",ev[i__ - 1]);
    }
    for (i__ = 0; i__ <= 46; i__+= 2) {
        printf("\n  %16.7e %16.7e \n",v[i__], v[i__ + 1]);
    }
    printf("\n  %16.7e \n",v[48]);
    return 0;
} /* main */


Результаты:

Собственные значения:

                   | -5.6722919995d+00 |
                   |  1.5530623348d+01 |
                   |  1.0102923192d+02 |
        ev  =  |  1.0001011975d+03 |
                   |  1.0000010098d+04 |
                   |  1.0000000100d+05 |
                   |  1.0000000001d+06 |

Собственные векторы:

                    |  4.60241432d-12 |                  | -1.01658674d-11 |
                    | -6.19409164d-10 |                  | -3.23048617d-09 |
                    | -4.59624634d-6   |                  |  1.01980144d-05 |
         v1  =  |  1.07906847d-4  |  ,      v2  =  |  2.21018403d-04 |  , 
                    |  4.49094723d-2  |                    | -1.04031614d-01 |
                    | -5.57567694d-1  |                    |  8.22631335d-01 |
                    |  8.28915795d-1  |                    |  5.58976743d-01 |

                    |  8.78765679d-11 |                         |  1.21337184d-09 |
                    |  1.20773046d-07 |                         | -9.98803192d-06 |
                    | -8.90754203d-05 |                         | -1.11227803d-03 |
         v3  =  | -1.11743497d-02 |  ,            v4  =  |  9.99936917d-01 |  , 
                    |  9.93497270d-01 |                         |  1.11204209d-02 |
                    |  1.11331459d-01 |                         |  1.12247594d-03 |
                    |  2.10619612d-02 |                         |  2.23652822d-05 |

                    | -1.00897793d-06 |                         | -1.11112345d-05 |
                    | -1.11123288d-04 |                         |  9.99999994d-01 |
                    |  9.99999371d-01 |                         |  1.11112108d-04 |
         v5  =  |  1.11121032d-03 |  ,            v6  =  |  1.01122336d-05 |  , 
                    |  1.02132585d-04 |                         |  2.12447903d-09 |
                    |  2.13477306d-07 |                         |  1.01344920d-10 |
                    |  1.04277680d-08 |                         |  3.13795946d-14 |

                    |  1.00000000d+00 |
                    |  1.11111223d-05 |
                    |  1.01021324d-06 |
         v7  =  |  2.12344994d-11 |  , 
                    |  1.01052664d-12 |
                    |  3.13400892d-17 |
                    |  1.01084105d-18 |

         ierr  =  0