Подпрограмма: afe1r_c
Назначение
Одновременное приведение вещественной симметрической
трехдиагональной матрицы и диагональной положительно определенной
матрицы двусторонним диагональным преобразованием
соответственно к вещественной симметрической трехдиагональной и
единичной матрицам.
Математическое описание
Пусть Т - заданная вещественная симметрическая
трехдиагональная матрица, D - диагональная положительно
определенная матрица. Подпрограмма afe1r_c получает вещественную
симметрическую трехдиагональную матрицу Н и диагональную матрицу
D1 = D - 1/2,
такие что Н = D1ТD1
и D1DD1 = Е .
Эта подпрограмма может быть использована для сведения
обобщенной проблемы собственных значений вида
Тx = λDx ,
где Т - вещественная симметрическая трехдиагональная, D -
диагональная, D > 0, к стандартной проблеме
Нz = λz с
вещественной симметрической трехдиагональной матрицей Н; при
этом собственные значения этих задач совпадают, а
соответствующие собственные векторы связаны следующим образом :
x = D1z .
Использование
int afe1r_c (real *a, real *b, real *d, integer *n, integer *
ierr)
Параметры
a -
|
вещественный вектор длины n, содержащий
диагональные элементы исходной трехдиагональной
матрицы T; на выходе из подпрограммы на
соответствующих местах вектора a запоминаются вычисленные
диагональные элементы матрицы H;
|
b -
|
вещественный вектор длины n, в последних n - 1
компонентах которого содержатся наддиагональные
элементы исходной трехдиагональной матрицы T; на
выходе из подпрограммы на соответствующих местах
вектора b запоминаются вычисленные
наддиагональные элементы вещественной симметрической
трехдиагональной матрицы H;
|
d -
|
вещественный вектор длины n, содержащий
диагональные элементы исходной диагональной матрицы
D; на выходе из подпрограммы на соответствующих
местах вектора d запоминаются вычисленные
диагональные элементы матрицы D1;
|
n -
|
заданный порядок исходных матриц T и D (тип: целый);
|
ierr -
|
целая переменная, служащая для сообщения об
ошибках, обнаруженных в ходе работы подпрограммы; при этом:
|
ierr=65 -
|
если исходная диагональная матрица D не
является положительно определенной.
|
Версии
afe1d_c -
|
одновременное приведение вещественной
симметрической трехдиагональной и диагональной
положительно определенной матриц, заданных с двойной
точностью, двусторонним диагональным
преобразованием к вещественной симметрической
трехдиагональной и единичной матрицам.
|
Вызываемые подпрограммы
utaf12_c -
|
подпрограмма выдачи диагностических сообщений
при работе подпрограмм afe1r_c и afe1d_c.
|
Замечания по использованию
|
В подпрограмме afe1d_c параметры a, b, d должны иметь тип
double.
|
Пример использования
int main(void)
{
/* Initialized data */
static float a[5] = { 1.f,2.f,2.f,2.f,1.f };
static float b[5] = { 0.f,2.f,2.f,2.f,2.f };
static float d__[5] = { 1.f,4.f,4.f,4.f,4.f };
/* Local variables */
static int ierr, i__;
extern int afe1r_c(float *, float *, float *, int *, int *);
afe1r_c(a, b, d__, &c__5, &ierr);
for (i__ = 1; i__ <= 5; ++i__) {
printf("\n %15.7e \n", a[i__-1]);
}
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", d__[i__-1]);
}
printf("\n %5i \n", ierr);
return 0;
} /* main */
Результаты:
a = (1., 0.5, 0.5, 0.5, 0.25) ,
b = (0., 1., 0.5, 0.5, 0.5) ,
d__ = (1., 0.5, 0.5, 0.5, 0.5) ,
ierr = 0 .