Текст подпрограммы и версий
aeh6r_c.zip , aeh6d_c.zip
Тексты тестовых примеров
taeh6r_c.zip , taeh6d_c.zip

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

Назначение

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

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

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

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

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

    int aeh6r_c (integer *n, integer *nv, real *a, real *ev, real *
        r, integer *ierr)

Параметры

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

Версии

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

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

aee2r_c - вычисление всех собственных значений вещественной симметричной трехдиагональной матрицы при помощи неявного QL - алгоpитма.
afh5r_c - приведение вещественной симметричной матрицы, заданной в компактной форме, к симметричной трехдиагональной матрице ортогональными преобразованиями подобия.
utae10_c - подпрограмма выдачи диагностических сообщений при работе подпрограмм aee2r_c и aee2d_c.

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

  1. 

Подпрограмма aeh6r_c не сохраняет исходный вектор  a.

  2.  В подпрограмме aeh6d_c параметры a, ev, r имеют тип double.

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

int main(void)
{
    /* Initialized data */
    static float a[6] = { 294.f,-180.f,-25.f,108.f,240.f,231.f };

    /* Local variables */
    static int ierr;
    extern int aeh6r_c(int *, int *, float *, float *, float *, int *);
    static float r__[6], ev[3];

    aeh6r_c(&c__3, &c__6, a, ev, r__, &ierr);

    printf("\n %5i \n", ierr);
    printf("\n %16.7e %16.7e %16.7e \n", ev[0], ev[1], ev[2]);
    return 0;
} /* main */


Результаты:

       ierr  =  0

       ev  =  (- 250., 375., 375.)