|
Текст подпрограммы и версий aeh5r_c.zip , aeh5d_c.zip |
Тексты тестовых примеров taeh5r_c.zip , taeh5d_c.zip |
Вычисление всех собственных значений и собственных векторов вещественной симметричной матрицы, заданной в компактной форме, с помощью QL - алгоpитма.
Заданная матрица ортогонaльными преобразованиями подобия
приводится к трехдиагональной симметричной форме,
собственные значения которой затем вычисляются с помощью неявного
QL - алгоpитма.
Информация о преобразованиях используется для вычисления
собственных вектopoв.
Уилкинсон, Pайнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра. М.: "Машиностроение", 1976.
int aeh5r_c (integer *n, integer *nv, real *a, real *ev, real *
v, real *r, integer *ierr)
Параметры
| n - | порядок исходной матрицы (тип: целый); |
| nv - | длина вектора a, nv ≥ n(n + 1)/2 (тип: целый); |
| a - | вещественный вектор длины nv, содержащий в своих первых n (n + 1)/2 компонентах исходную матрицу, заданную в компактной форме; |
| ev - | вещественный вектор длины n, содержащий вычисленные собственные значения, расположенные в порядке неубывания; |
| v - | вещественный двумерный массив размерности n на n, содержащий в своих столбцах ортонормированные собственные векторы; |
| r - | вещественный вектор длины 3 * n, используемый как рабочий; |
| ierr - | целочисленная переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом ierr имеет тот же смысл, что и в подпрограмме aee1r_c. |
Версии
| aeh5d_c - | вычисление с помощью QL - алгоpитма всех собственных значений и собственных векторов вещественной симметричной матрицы, заданной в компактной форме с удвоенной точностью. |
Вызываемые подпрограммы
| afh5r_c - | приведение вещественной симметричной матрицы, заданной в компактной форме, к симметричной трехдиагональной форме ортогональными преобразованиями подобия. |
| aee1r_c - | вычисление всех собственных значений и соответствующих собственных векторов вещественной симметричной трехдиагональной матрицы неявным QL - алгоpитмом. |
| afh5r1_c - | рабочая подпрограмма. |
| utae10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограмм aee1r_c и aee1d_c. |
Замечания по использованию
| 1. |
Подпрограмма aeh5r_c не сохраняет исходный вектор a. | |
| 2. |
В подпрограмме aeh5d_c параметры a, ev, v, r имеют тип double. | |
| 3. | Подпрограмма aeh5r1_c используется в качестве рабочей. |
int main(void)
{
/* Initialized data */
static float a[10] = { 43.f,0.f,68.f,0.f,24.f,82.f,24.f,0.f,0.f,57.f };
/* Local variables */
static int ierr;
extern int aeh5r_c(int *, int *, float *, float *,
float *, float *, int *);
static int i__;
static float r__[12], v[16] /* was [4][4] */, ev[4];
#define v_ref(a_1,a_2) v[(a_2)*4 + a_1 - 5]
aeh5r_c(&c__4, &c__10, a, ev, v, r__, &ierr);
printf("\n %5i \n", ierr);
printf("\n %16.7e %16.7e \n %16.7e %16.7e \n",
ev[0], ev[1], ev[2], ev[3]);
for (i__ = 1; i__ <= 4; ++i__) {
printf("\n %16.7e %16.7e %16.7e %16.7e \n",
v_ref(i__, 1), v_ref(i__, 2), v_ref(i__, 3), v_ref(i__, 4));
}
return 0;
} /* main */
Результаты:
ierr = 0
| - 0.8 1.8e -12 0.6 0. |
v_ref = | 0. - 0.8 0. - 0.6 |
| 1.8e -12 0.6 0. - 0.8 |
| 0.6 0. 0.8 0. |
ev = (25., 50., 75., 100.)