Подпрограмма: aej2r_c
Назначение
Вычисление всех собственных значений вещественной матрицы
Якоби при помощи неявного Q*L - алгоpитма.
Математическое описание
Исходная вещественная трехдиaгoнaльная матрица обладает
следующим свойством: произведения пар соответствующих элементов
побочных диагоналей все неотрицательны. Вычисленные
собственные значения располагаются в возрастающем порядке.
Дж.Х.Уилкинсон, Алгебраичeckaя проблема собственных
значений, "Наука", М., 1970.
Использование
int aej2r_c (integer *n, real *a, real *ev, real *rab,
integer *ierr)
Параметры
n -
|
порядок исходной матрицы (тип: целый);
|
a -
|
вещественный двумерный массив размерности n на 3,
содержащий в последних n - 1 компонентах
первого столбца элементы нижней диагонали, во втором столбце
- элементы главной диагонали, в первых
n - 1 компонентах третьего столбца - элементы
верхней диагонали;
|
ev -
|
вещественный одномерный массив размерности n,
содержащий вычисленные собственные значения в
возрастающем порядке;
|
rab -
|
вещественный одномерный массив размерности 2*n,
используемый как рабочий;
|
ierr -
|
целая переменная, служащая для сообщения об
ошибках, обнаруженных в ходе работы подпрограммы,
при этом:
|
|
а) значение ierr больше n, если не все попарные
произведения соответствующих элементов
побочных диагоналей неотрицательны,
|
|
б) значение ierr полагается равным номеру
собственного значения, для вычисления которого
потребовалось более 30 итераций, при этом
собственные значения с индексами 1, 2, ..., ierr - 1
вычислены правильно и расположены в
возрастающем порядке, но они не обязательно являются
самыми меньшими из всех n собственных значений.
|
Версии
aej2d_c -
|
вычисление всех собственных значений
вещественной матрицы Якоби с повышенной точностью.
Массивы a,ev, rab имеют тип double.
|
Вызываемые подпрограммы
utae10_c -
|
подпрограмма выдачи диагностических сообщений
при работе подпрограмм aej2r_c и aej2d_c.
|
Замечания по использованию
|
Подпрограмма aej2r_c сохраняет исходную информацию.
|
Пример использования
int main(void)
{
/* Initialized data */
static float a[15] /* was [5][3] */ = { 0.f,1.f,1.f,1.f,1.f,0.f,0.f,0.f,
0.f,0.f,1.f,1.f,1.f,1.f,0.f };
/* Local variables */
static int ierr;
extern int aej2r_c(int *, float *, float *, float *, int *);
static int i__;
static float ev[5], rab[10];
#define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6]
for (i__ = 1; i__ <= 5; ++i__) {
printf("\n %14.4e %14.4e %14.4e \n",
a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3));
}
aej2r_c(&c__5, a, ev, rab, &ierr);
for (i__ = 1; i__ <= 5; ++i__) {
printf("\n %14.4e %14.4e %14.4e \n",
a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3));
}
printf("\n %16.7e %16.7e %16.7e ", ev[0], ev[1], ev[2]);
printf("\n %16.7e %16.7e \n", ev[3], ev[4]);
printf("\n %5i \n", ierr);
return 0;
} /* main */
Результаты:
ev(1) = -1.7320508 ,
ev(2) = -1.0 ,
ev(3) = 6.28*10-12 ,
ev(4) = 1.0 ,
ev(5) = 1.7320508 ;
ierr = 0