Подпрограмма: afj0r_c
Назначение
Приведение матрицы Якоби к симметрической трехдиагональной
матрице преобразованием подобия.
Математическое описание
Пусть Т - матрица Якоби, т.е. трехдиагональная матрица,
произведения пар внедиагональных элементов которой все
неотрицательны и равны нулю только тогда, когда оба сомножителя
равны нулю.
Подпрограмма afj0r_c приводит матрицу Т к симметричной матрице
Н преобразованием подобия
Н = D - 1ТD , где D -
диагональная матрица. При этом используются лишь внедиагональные
элементы матрицы Т, поскольку диагональные элементы матриц Т и
Н совпадают.
Использование
int afj0r_c (real *b, real *c, integer *n, integer *ierr)
Параметры
b -
|
вещественный вектор длины n, содержащий в
последних n - 1 компонентах наддиагональные элементы
матрицы Якоби T; на выходе подпрограммы в
последних n - 1 компонентах вектора в запоминаются
вычисленные наддиагональные элементы матрицы H;
|
c -
|
вещественный вектор длины n, в последних n - 1
компонентах которого содержатся поддиагональные
элементы исходной матрицы Якоби; на выходе
подпрограммы на месте вектора с запоминаются
вычисленные диагональные элементы диагональной матрицы D;
|
n -
|
заданный порядок исходной матрицы Якоби T (тип: целый);
|
ierr -
|
целая переменная, служащая для сообщения об
ошибках, обнаруженных в ходе работы подпрограммы; при этом:
|
ierr=66 -
|
если не все попарные произведения
соответствующих элементов побочных
диагоналей исходной матрицы неотрицательны;
|
ierr=67 -
|
если имеется равное нулю произведение
соответствующих элементов побочных
диагоналей, причем сомножители равны нулю неодновременно;
|
ierr=68 -
|
если матрица H получена, но матрица
преобразования D не вычислена, т.к. она
или обратная к ней матрица алгоритмически вырождена.
|
Версии
aej0d_c -
|
приведение матрицы Якоби, заданной с двойной
точностью, к симметрической трехдиагональной
матрице преобразованием подобия.
|
Вызываемые подпрограммы
utaf12_c -
|
подпрограмма выдачи диагностических сообщений
при работе подпрограмм afj0r_c и afj0d_c.
|
Замечания по использованию
|
В подпрограмме afj0d_c параметры b, c должны иметь тип
double.
|
Пример использования
int main(void)
{
/* Initialized data */
static float b[5] = { 0.f,1.f,1.f,-4.f,-4.f };
static float c__[5] = { 0.f,4.f,16.f,-4.f,-4.f };
/* Local variables */
static int ierr, i__;
extern int afj0r_c(float *, float *, int *, int *);
afj0r_c(b, c__, &c__5, &ierr);
for (i__ = 1; i__ <= 5; ++i__) {
printf("\n %15.7e \n", b[i__-1]);
}
for (i__ = 1; i__ <= 5; ++i__) {
printf("\n %15.7e \n", c__[i__-1]);
}
printf("\n %5i \n", ierr);
return 0;
} /* main */
Результаты:
b = (0., 2., 4., 4.),
c__ = (1., 2., 8., -8., 8.),
ierr = 0