Текст подпрограммы и версий aet3c_c.zip , aet3p_c.zip |
Тексты тестовых примеров taet3c_c.zip , taet3p_c.zip |
Вычисление собственных вектоpов верхней комплексной матрицы Хессенберга, соответствующих указанным собственным значениям.
Подпрограмма aet3c_c по заданным собственным значениям верхней комплексной матрицы Хессенберга A вычисляет соответствующие собственные векторы с помощью метода обратных итераций.
Возникающие в методе обратных итераций системы
( A - λ I ) x = y ,
где λ - задаваемое приближение к собственному значению матрицы A, решаются методом Гаусса с выбором ведущего элемента по столбцу.
Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра. M.: "Машиностроение", 1976.
int aet3c_c (integer *nm, integer *n, real *ar, real *ai, real *wr, real *wi, logical *select, integer *mm, integer *m, real *zr, real *zi, real *rm1, real *rm2, real *rv1, real *rv2, integer *ierr)
Параметры
nm - | число стpок двумерных массивов ar, ai, zr и zi, указанное при описании этих массивов в вызывающей подпрограмме (тип: целый); |
n - | порядок исходной матрицы, n ≤ nm (тип: целый); |
ar, ai - | вещественные двумерные массивы размерности nm на n, содержащие в своих первых n стpоках соответственно вещественную и мнимые части исходной матрицы Хессенберга; |
wr, wi - | вещественные векторы длины n, содержащие на входе в подпрограмму соответственно вещественные и мнимые части собственных значений исходной матрицы Хессенберга; если исходная матрица является правой квазитреугольной, то требуется, чтобы собственные значения каждой диагональной клетки исходной матрицы имели бы в массивах wr и wi индексы, заключенные между граничными индексами соответствующей диагональной клетки; этому условию удовлетворяют собственные значения, вычисленные подпрограммой aet2r_c; |
select - | логический вектоp длины n, служащий для выделения тех собственных значений, для которых нужно вычислить собственные векторы, при этом, если требуется вычислить собственный вектоp, соответствующий собственному значению, имеющему индекс I в массивах wr и wi, то select (i) = true; |
mm - | задаваемая оценка свеpху для числа столбцов, требующихся для хранения вычисляемых собственных вектоpов (тип: целый); |
m - | целая переменная равная на выходе из подпрограммы числу столбцов, действительно использованных для хранения вычисленных собственных вектоpов; |
zr, zi - | вещественные двумерные массивы размерности nm на mm, содержащие на выходе из подпрограммы в своих первых m столбцах соответственно вещественные и мнимые части вычисленных собственных вектоpов; |
rm1 - rm2 | вещественные рабочие векторы длины n2; |
rv1 - rv2 | вещественные рабочие векторы длины n; |
ierr - | целочисленная переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
ierr = - (2*n + 1) - | если для хранения искомых собственных вектоpов требуется более mm столбцов, в этом случае на выходе из подпрограммы m = mm; |
ierr = - k - | если для собственного значения с индексом K не было получено приемлемого приближения к собственному вектоpу; в этом случае компоненты этого вектоpа приравниваются нулю; если таких собственных вектоpов несколько, то в качестве K берется индекс последнего из них; |
ierr = - (n + k) - | если обе описанные выше ошибки имели место; |
ierr= 0 - | в случае нормального выхода из подпрограммы. |
Версии
aet3p_c - | вычисление собственных вектоpов верхней комплексной матрицы Хессенберга, заданной с двойной точностью, по заданным собственным значениям. |
Вызываемые подпрограммы
utae12_c - | подпрограмма выдачи диагностических сообщений при работе подпрограмм aet3c_c и aet3p_c. |
Замечания по использованию
1. |
Подпрограмма aet3c_c сохраняет исходную матрицу (массив a) и заданные собственные значения (массивы wr и wi), если не считать незначительные возмущения вещественных частей некоторых близких собственных значений (массив wr), произведенные с целью получения независимых собственных вектоpов. | |
2. | B подпрограмме aet3p_c параметры ar, ai, wr, wi, zr, zi, rm1, rm2, rv1, rv2 имеют тип double. |
int main(void) { /* Initialized data */ static float ar[9] /* was [3][3] */ = { 2.f,0.f,0.f,-2.f,0.f,-1.f,4.f, 2.f,3.f }; static float ai[9] /* was [3][3] */ = { 2.f,0.f,0.f,-2.f,1.f,0.f,4.f,0.f, 1.f }; static float wr[3] = { 2.f,1.f,2.f }; static float wi[3] = { 2.f,1.f,1.f }; /* Local variables */ static int ierr; extern int aet3c_c(int *, int *, float *, float *, float *, float *, logical *, int *, int *, float *, float *, float *, float *, float *, float *, int *); static int i__, m, n, mm; static float zi[6] /* was [3][2] */, zr[6] /* was [3][2] */; static logical select[3]; static float rm1[9] /* was [3][3] */, rm2[9] /* was [3][3] */, rv1[3], rv2[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] mm = 2; n = 3; select[0] = TRUE_; select[1] = FALSE_; select[2] = TRUE_; aet3c_c(&c__3, &c__3, ar, ai, wr, wi, select, &mm, &m, zr, zi, rm1, rm2, rv1, rv2, &ierr); printf("\n %5i %5i \n", ierr, m); 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 \n", zr_ref(i__,1), zr_ref(i__,2)); } for (i__ = 1; i__ <= 3; ++i__) { printf("\n %16.7e %16.7e \n", zi_ref(i__,1), zi_ref(i__,2)); } /* l20: */ return 0; } /* main */ Результаты: m = 2 , ierr = 0 , | 1. 1. | zr_ref = | 0. -0.25 | | 0. -0.25 | | 0. 0. | zi_ref = | 0. -0.25 | | 0. -0.25 |