|
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.su/lib_na/cat/ae_htm_c/aet1c_c.htm
Дата изменения: Wed Dec 2 10:51:25 2015 Дата индексирования: Sun Apr 10 01:38:03 2016 Кодировка: Windows-1251 |
|
Текст подпрограммы и версий 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