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