Текст подпрограммы и версий aet1c_c.zip |
Тексты тестовых примеров taet1c_c.zip |
Вычисление всех собственных значений и собственных векторов комплексной верхней матрицы Хессенберга QR - алгоpитмом.
Подпрограмма aet1c_c вычисляет собственные значения комплексной верхней матрицы Хессенберга QR - алгоpитмом со сдвигом; информация о выполняемых преобразованиях запоминается и используется потом для вычисления собственных векторов матрицы Хессенберга.
Если рассматриваемая матрица Хессенберга была получена в результате унитарного подобного преобразования некоторой комплексной матрицы общего вида с помощью подпрограммы afg7c_c, то подпрограмма aet1c_c может вычислить непосредственно собственные векторы исходной комплексной матрицы общего вида.
Уилкинсон Дж.Х. Алгебраическая проблема собственных значений. М.: "Наука", 1970.
int aet1c_c (integer *nm, integer *n, integer *low, integer * igh, real *ortr, real *orti, real *hr, real *hi, real *wr, real *wi, real *zr, real *zi, integer *ierr)
Параметры
nm - | число строк двумерных массивов hr, hi, zr, zi, указанное при описании этих массивов в вызывающей подпрограмме (тип: целый); |
n - | порядок исходной матрицы (тип: целый); |
low - igh | выходные параметры подпрограммы amb1c_c (тип: целый); если матрица не масштабировалась, то можно взять low = 1, igh = n; |
ortr - orti |
вещественные векторы длины igh; первые
low - 1 компонент этих векторов подпрограммой
aet1c_c не используются; если требуется
вычислить собственные векторы матрицы
Хессенберга, то на входе в подпрограмму должно выполняться ortr (i) = orti (i) = 0.0, i = low, low + 1, ..., igh; если требуется вычислить собственные векторы комплексной матрицы общего вида (к которой была предварительно применена подпрограмма afg7c_c), то ortr и orti являются выходными параметрами подпрограммы afg7c_c и содержат часть информации о выполненном унитарном преобразовании; |
hr, hi - | вещественные двумерные массивы размерности nm на n, содержащие на входе в подпрограмму в своих первых n строках соответственно вещественную и мнимые части исходной матрицы Хессенберга; если требуется вычислить собственные векторы матрицы Хессенберга, то остальные элементы массивов hr и hi (лежащие ниже поддиагонали) могут быть произвольными; если же требуется вычислить собственные векторы комплексной матрицы общего вида, то hr и hi - выходные параметры подпрограммы afg7c_c, которые кроме матрицы Хессенберга содержат еще оставшуюся информацию о выполненном унитарном преобразовании; |
wr, wi - | вещественные векторы длины n, содержащие на выходе из подпрограммы соответственно вещественные и мнимые части вычисленных собственных значений; |
zr, zi - | вещественные двумерные массивы размерности nm на n, содержащие на выходе из подпрограммы в своих столбцах соответственно вещественные и мнимые части вычисленных собственных векторов; собственные векторы не нормируются; |
ierr - | целочисленная переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; на выходе из подпрограммы ierr равно индексу собственного значения для вычисления которого требуется более 30 итераций, при этом собственные значения с индексами ierr + 1, ierr + 2, ..., n вычислены правильно, а собственные векторы не вычисляются; если вычислены все собственные значения и соответствующие собственные векторы, то ierr = 0. |
Версии
aet1p_c - | вычисление всех собственных значений и собственных векторов комплексной матрицы Хессенберга, заданной с двойной точностью, с помощью QR - алгоpитма со сдвигом. |
Вызываемые подпрограммы
utae12_c - | подпрограмма выдачи диагностических сообщений при работе подпрограмм aet1c_c и aet1p_c. |
Замечания по использованию
1. |
В подпрограмме aet1p_c параметры ortr, orti, hr, hi, wr, wi, zr, zi имеют тип double. | |
2. | Подпрограмма aet1c_c (aet1p_c) не сохраняет исходные массивы hr и hi. |
int main(void) { /* Initialized data */ static float hr[9] /* was [3][3] */ = { 6.f,0.f,0.f,0.f,3.f,1.f,0.f,1.f, 3.f }; static float hi[9] /* was [3][3] */ = { 1.f,0.f,0.f,-2.f,1.f,0.f,2.f,0.f, 1.f }; /* System generated locals */ int i__1; /* Local variables */ static int ierr; static float orti[3], ortr[3]; extern int aet1c_c(int *, int *, int *, int *, float *, float *, float *, float *, float *, float *, float *, float *, int *); static int i__, n; static float wi[3], zi[9] /* was [3][3] */, wr[3], zr[9] /* was [3][3] */; #define zi_ref(a_1,a_2) zi[(a_2)*3 + a_1 - 4] #define zr_ref(a_1,a_2) zr[(a_2)*3 + a_1 - 4] n = 3; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { ortr[i__ - 1] = 0.f; orti[i__ - 1] = 0.f; /* l10: */ } aet1c_c(&n, &n, &c__1, &n, ortr, orti, hr, hi, wr, wi, zr, zi, &ierr); printf("\n %5i \n", ierr); printf("\n %16.7e %16.7e %16.7e \n", wr[0], wr[1], wr[2]); printf("\n %16.7e %16.7e %16.7e \n", wi[0], wi[1], wi[2]); for (i__ = 1; i__ <= 3; ++i__) { printf("\n %16.7e %16.7e %16.7e \n", zr_ref(i__,1), zr_ref(i__,2), zr_ref(i__,3)); } for (i__ = 1; i__ <= 3; ++i__) { printf("\n %16.7e %16.7e %16.7e \n", zi_ref(i__,1), zi_ref(i__,2), zi_ref(i__,3)); } return 0; } /* main */ Результаты: ierr = 0 , wr = (6., 4., 2.) , wi = (1., 1., 1.) | 1. 0. 0. | zr_ref = | 0. a -a | | 0. a a | | 0. 0. -a | zi_ref = | 0. 0. 0. | | 0. 0. 0. | где a = 0.707106781187