|
Текст подпрограммы и версий 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 |