Текст подпрограммы и версий aeh6r_c.zip , aeh6d_c.zip |
Тексты тестовых примеров taeh6r_c.zip , taeh6d_c.zip |
Вычисление всех собственных значений вещественной симметричной матрицы, заданной в компактной форме, с помощью 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.)