Текст подпрограммы и версий aet1r_c.zip , aet1d_c.zip |
Тексты тестовых примеров taet1r_c.zip , taet1d_c.zip |
Вычисление всех собственных значений и собственных векторов вещественной верхней матирцы Хессенберга qr - алгоpитмом с двойным сдвигом.
Подпрограмма aet1r_c вычисляет собственные значения верхней матрицы Хессенберга QR - алгоpитмом с двойным сдвигом, информация о выполняемых преобразованиях запоминается и используется потом для вычисления собственных векторов матрицы Хессенберга.
Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра, М.: "Машиностроение", 1976.
int aet1r_c (integer *nm, integer *n, integer *low, integer * igh, real *h, real *wr, real *wi, real *z, integer *ierr)
Параметры
nm - | число строк двумерных массивов h и z, указанное при описании этих массивов в вызывающей подпрограмме (тип: целый); |
n - | порядок исходной матрицы (тип: целый); |
low - igh | выходные параметры подпрограммы amb1r_c (тип: целый); если матрица не масштабировалась, то можно взять low = 1, igh = n; |
h - | вещественный двумерный массив размерности nm на n, содержащий на входе в подпрограмму в своих первых n строках исходную матрицу Хессеберга; |
wr, wi - | вещественные векторы длины n, содержащие на выходе из подпрограммы соответственно вещественные и мнимые части вычисленных собственных значений, при этом комплексно - сопряженные собственные значения располагаются последовательно, причем первым идет собственное значение с положительной мнимой частью; |
z - | вещественный двумерный массив размерности nm на n, содержащий на выходе из подпрограммы вычисленные собственные векторы, при этом: |
если wi (j) = 0 , | то соответствующий собственный вектор расположен в j - ом столбце массива z; |
если wi (j) > 0 , | то в j - ом и (j + 1) - ом столбцах располагаются соответственно вещественная и мнимая части собственного вектора; |
если wi (j) < 0 , | то собственный вектор не запоминается, т.к. может быть получен как сопряженный собственному вектору, соответствующему (j - 1) - ому собственному значению; |
собственные векторы не нормируются; | |
ierr - | целочисленная переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; на выходе из подпрограммы ierr равно индексу собственного значения для вычисления которого требуется более 30 итераций, при этом собственные значения с индексами ierr + 1, ierr + 2, ...,n вычислены правильно, а собственные векторы не вычисляются; если вычислены все собственные значения и собственные векторы, то ierr = 0. |
Версии
aet1d_c - | вычисление всех собственных значений и собственных векторов вещественной матрицы Хессенберга, заданной с двойной точностью, с помощью qr - алгоритма с двойным сдвигом. |
Вызываемые подпрограммы
utae12_c - | подпрограмма выдачи диагностических сообщений при работе подпрограмм aet1r_c и aet1d_c. |
Замечания по использованию
1. |
В подпрограмме aet1d_c параметры h, wr, wi, z имеют тип double. | |
2. | Подпрограмма aet1r_c (aet1d_c) не сохраняет исходный массив z. |
int main(void) { /* Initialized data */ static float h__[9] /* was [3][3] */ = { 2.f,0.f,0.f,4.f,3.f,1.f,4.f,1.f, 3.f }; /* System generated locals */ int i__1, i__2; /* Local variables */ static int ierr; extern int aet1r_c(int *, int *, int *, int *, float *, float *, float *, float *, int *); static int i__, n; static float z__[9] /* was [3][3] */, wi[3], wr[3]; #define z___ref(a_1,a_2) z__[(a_2)*3 + a_1 - 4] n = 3; aet1r_c(&n, &n, &c__1, &n, h__, wr, wi, z__, &ierr); printf("\n %5i \n", ierr); printf("\n %15.7e %15.7e %15.7e \n", wr[0], wr[1], wr[2]); printf("\n %15.7e %15.7e %15.7e \n", wi[0], wi[1], wi[2]); for (i__ = 1; i__ <= 3; ++i__) { printf("\n %15.7e %15.7e %15.7e \n", z___ref(i__,1), z___ref(i__,2), z___ref(i__,3)); } return 0; } /* main */ Результаты: ierr = 0 , wr = (2., 4., 2.) , wi = (0., 0., 0.) | 1 4a 0 | z__ = | 0 a -a | | 0 a a | где a = 0.707106781187