Текст подпрограммы и версий afe0c_c.zip , afe0p_c.zip |
Тексты тестовых примеров tafe0c_c.zip , tafe0p_c.zip |
Приведение комплексной эрмитовой трехдиагональной матрицы к вещественной симметрической трехдиагональной матрице унитарным диагональным преобразованием подобия.
Подпрограмма afe0c_c приводит комплексную эрмитову трехдиагональную матрицу Н к вещественной симметрической матрице Т преобразованием подобия вида Т = D - 1НD, где D - комплексная диагональная матрица, диагональные элементы которой удовлетворяют условию | di | = 1. При этом диагональные элементы матрицы Т вычислять не требуется, т.к. они совпадают с диагональными элементами исходной матрицы Н.
Подпрограмма afe0c_c по заданным поддиагональным элементам ci эрмитовой матрицы Н вычисляет поддиагональные элементы bi матрицы Т и элементы диагональной матрицы D по следующим формулам
bi = | ci | , i = 2,...,N d1 = 1. , di + 1 = di * ci / | ci | , если сi ≠ 0 ; di + 1 = 1. , если сi = 0. , i = 1,...,N-1
Дж.Х.Уилкинсон, Алгебраическая проблема собственных значений, "Наука", М., 1970.
int afe0c_c (real *cr, real *ci, real *b, integer *n)
Параметры
cr, ci - | вещественные векторы длины n, содержащие в последних n - 1 компонетах соответственно вещественные и мнимые части поддиагональных элементов исходной эрмитовой матрицы H; на выходе подпрограммы векторы cr и ci содержат соответственно вещественные и мнимые части диагональных элементов матрицы преобразования D; |
b - | вещественный вектор длины n, содержащий в последних n - 1 компонентах вычисленные поддиагональные элементы трехдиагональной матрицы T; |
n - | заданный порядок исходной трехдиагональной матрицы (тип: целый). |
Версии
afe0p_c - | приведение комплексной эрмитовой трехдиагональной матрицы, заданной с двойной точностью, к вещественной симметрической трехдиагональной матрице унитарным диагональным преобразованием подобия. |
Вызываемые подпрограммы: нет
Замечания по использованию
В подпрограмме afe0p_c параметры cr, ci, b имеют тип double. |
int main(void) { /* Initialized data */ static float cr[5] = { 0.f,3.f,1.f,0.f,0.f }; static float ci[5] = { 0.f,4.f,0.f,1.f,0.f }; /* Local variables */ extern int afe0c_c(float *, float *, float *, int *); static float b[5]; static int i__; afe0c_c(cr, ci, b, &c__5); for (i__ = 1; i__ <= 5; ++i__) { printf("\n %15.7e \n", cr[i__-1]); } for (i__ = 1; i__ <= 5; ++i__) { printf("\n %15.7e \n", ci[i__-1]); } for (i__ = 1; i__ <= 5; ++i__) { printf("\n %15.7e \n", b[i__-1]); } return 0; } /* main */ Результаты: cr = (1., 0.6, 0.6, -0.8, 1.) , ci = (0., 0.8, 0.8, 0.6, 0.) , b = (0., 5., 1., 1., 0.) .