|
Текст подпрограммы и версий aeb2r_c.zip , aeb2d_c.zip |
Тексты тестовых примеров taeb2r_c.zip , taeb2d_c.zip |
Вычисление собственных значений вещественной симметрической ленточной матрицы, принадлежащих заданному интервалу, их номеров и соответствующих собственных векторов.
Симметричная ленточная мaтpицa приводится ортогональными преобразованиями Гивенса к трехдиагональной форме, которая используется для вычисления методом бисекций собственных значений, принадлежащих данному интервалу, их номеров и соответствующих собственных векторов с помощью метода обратных итераций.
Дж.Х.Уилкинсон, Агебраическая проблема собственных значений, "Наука", М., 1970.
int aeb2r_c (integer *n, integer *nc, integer *mm, integer *m,
real *rlb, real *rub, real *a, real *ev, real *v, integer *irab,
real *rab1, real *rab2, integer *ierr)
Параметры
| n - | порядок исходной матрицы (тип: целый); |
| nc - | заданное число кодиагоналей исходной матрицы, включая главную диагональ (тип: целый); |
| mm - | оценка сверху числа собственных значений исходной матрицы, принадлежащих заданному интервалу (тип: целый); если фактическое число собственных значений m, принадлежащих заданному интервалу, больше, чем mm, то собственные значения не вычисляются; |
| m - | целая переменная, в которой запоминается вычисленное число собственных значений, принадлежащих заданному интервалу; |
|
rlb - rub | заданные нижняя и верхняя границы интервала собственных значений (тип: вещественный); если rlb > rub, то собственные значения не вычисляются; |
| a - | вещественный двумерный массив размера n*nc, в котором задается исходная симметричная ленточная матрица в компактной форме; |
| ev - | вещественный вектор длины mm, содержащий вычисленные в возрастающем порядке собственные значения; |
| v - | вещественный двумерный массив размерности n на mm, содержащий в своих первых m столбцах вычисленные ортонормированные собственные векторы; |
| irab - | целый вектор длины mm, содержащий индексы расположенных в возрастающем порядке m вычисленных собственных значений; |
| rab1 - | вещественный двумерный массив размерности n*nc, используемый как рабочий; |
| rab2 - | вещественный вектор длины n * (2*nc+4), используемый как рабочий; |
| ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом значение ierr |
| - равно 3*n+1, если значение mm меньше истинного числа собственных значений m на интервале; | |
| - равно - k, если для вычисления собственного вектора с индексом k не нашлось ни одного начального вектора, обеспечивающего приемлемое приближение; при этом компоненты этого собственного вектора полагаются равными нулю. Если таких собственных векторов несколько, то значение ierr равно индексу последнего из них. |
Версии
| aeb2d_c - | вычисление собственных значений вещественной симметрической ленточной матрицы, принадлежащих заданному интервалу, их номеров и соответствующих собственных векторов с двойной точностью. |
Вызываемые подпрограммы
| utae10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограмм aeb2r_c, aeb2d_c. |
Замечания по использованию
|
Подпрограммы aeb2r_c, aeb2d_c не сохраняют исходную ленточную матрицу, но в последних двух столбцах массива a запоминается ее трехдиагональная форма. | |
| В подпрограмме aeb2d_c параметры a, ev, v, rab1, rab2, rlb, rub имеют тип double . |
int main(void)
{
/* Builtin functions */
double pow_ri(float *, int *);
/* Local variables */
static int ierr;
extern int aeb2r_c(int *, int *, int *, int *, float *, float *,
float *, float *, float *, int *, float *, float *,
int *);
static int irab1[7];
static float a[21] /* was [7][3] */;
static int i__, m, n, j;
static float v[49] /* was [7][7] */;
static int mb, mm;
static float ev[7], rlb, rub, rab1[21] /* was [7][3] */, rab2[70];
int i__1;
#define a_ref(a_1,a_2) a[(a_2)*7 + a_1 - 8]
for (i__ = 1; i__ <= 7; ++i__) {
i__1 = 7 - i__;
a_ref(i__, 3) = (float)pow_ri(&c_b2, &i__1);
a_ref(i__, 2) = 10.f;
/* l1: */
a_ref(i__, 1) = 1.f;
}
n = 7;
mb = 3;
mm = 7;
rlb = -6.f;
rub = 1e7f;
aeb2r_c(&n, &mb, &mm, &m, &rlb, &rub, a, ev, v, irab1, rab1, rab2, &ierr);
for (j = 1; j <= 7; ++j) {
printf("\n %15.7e \n", ev[j-1]);
}
printf("\n %5i \n", ierr);
for (j = 0; j <= 44; j+=4) {
printf("\n %15.7e %15.7e %15.7e %15.7e \n",
v[j], v[j+1], v[j+2], v[j+3]);
}
printf("\n %15.7e \n", v[48]);
return 0;
} /* main */
Результаты:
Собственные значения в интервале (-6.d0, 10.d0**7)
| -5.67228961584d+00 |
| 1.55306282219d+01 |
| 1.01029236853d+02 |
ev = | 1.00010120030d+03 |
| 1.00000101020d+04 |
| 1.00000001010d+05 |
| 1.00000000011d+06 |
Собственные векторы, соответствующие вычисленным в интервале ( - 6.d0, 10.d0**7) собственным значениям:
| -0.4602311d-11 | | 1.0165937d-11 |
| 6.1941045d-10 | | 3.2304868d-09 |
| 4.5962454d-06 | | -1.0198015d-05 |
v1 = | -1.0790686d-04 | , v2 = | -2.2101839d-04 | ,
| -4.4909463d-02 | | 1.0403192d-01 |
| 5.5756761d-01 | | -8.2263142d-01 |
| -8.2891585d-01 | | -5.5897666d-01 |
| -8.7876556d-11 | | 1.2133718d-09 |
| -1.2077304d-07 | | -9.9880319d-06 |
| 8.9075420d-05 | | -1.1122780d-03 |
v3 = | 1.1174350d-02 | , v4 = | 9.9993692d-01 | ,
| -9.9349727d-01 | | 1.1120421d-02 |
| -1.1133146d-01 | | 1.1224759d-03 |
| -2.1061961d-02 | | 2.2365282d-05 |
| -1.0089779d-06 | | 1.1111235d-05 |
| -1.1112329d-04 | | -9.9999999d-01 |
| 9.9999937d-01 | | -1.1111211d-04 |
v5 = | 1.1112103d-03 | , v6 = | -1.0112234d-05 | ,
| 1.0213258d-04 | | -2.1244794d-09 |
| 2.1347731d-07 | | -0.1013453d-11 |
| 1.0427767d-08 | | -3.1713216d-12 |
| 1.0000000d+00 |
| 1.1111122d-05 |
| 1.0102132d-06 |
v7 = | 2.1234289d-11 | ,
| 0.1010306d-11 |
| -2.1027951d-16 |
| -3.1713216d-14 |
ierr = 0