|
Текст подпрограммы и версий aeb0r_c.zip , aeb0d_c.zip |
Тексты тестовых примеров taeb0r_c.zip , taeb0d_c.zip |
Вычисление собственных значений и собственных векторов вещественной симметрической ленточной матрицы с помощью QL - алгоритма.
Симметричная ленточная матрица приводится ортогональными преобразованиями Гивенса к симметрической трехдиагональной форме, которая используется для вычисления собственных значений и соответствующих собственных векторов исходной матрицы.
Дж.Х.Уилкинсон, Агебраическая проблема собственных значений, "Наука", М., 1970.
int aeb0r_c (integer *n, integer *nc, real *a, real *ev, real *
v, real *rab, integer *ierr)
Параметры
| n - | порядок исходной матрицы (тип: целый); |
| nc - | заданное число кодиагоналей исходной матрицы, включая главную диагональ (тип: целый); |
| a - | вещественный двумерный массив размера n*nc, в котором задается исходная симметричная ленточная матрица в компактной форме; |
| ev - | вещественный вектор длины n, содержащий вычисленные в возрастающем порядке собственные значения; |
| v - | вещественный двумерный массив размерности n на n, содержащий вычисленные ортонормированные собственные векторы исходной матрицы; |
| rab - | вещественный вектор длины n, используемый как рабочий; |
| ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом значение ierr полагается равным номеру собственного значения, для вычисления которого потребовалось более 30 итераций; в этом случае будут вычислены правильно, но не упорядочены, собственные значения с индексами 1, 2, ..., ierr - 1 и соответствующие собственные векторы. |
Версии
| aeb0d_c - | вычисление собственных значений и собственных векторов вещественной симметрической ленточной матрицы с помощью QL - алгоритма с двойной точностью. |
Вызываемые подпрограммы
| utae10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограмм aeb0r_c, aeb0d_c. |
Замечания по использованию
|
Подпрограммы aeb0r_c, aeb0d_c не сохраняют исходную ленточную матрицу, но в последних двух столбцах массива a запоминается ее трехдиагональная форма. | |
| В подпрограмме aeb0d_c параметры a, v, ev, rab имеют тип double. |
int main(void)
{
/* Builtin functions */
double pow_ri(float *, int *);
/* Local variables */
static int ierr;
extern int aeb0r_c(int *, int *, float *, float *, float *, float *,
int *);
static float a[21] /* was [7][3] */;
static int i__, n;
static float v[49] /* was [7][7] */;
static int nc;
static float ev[7], rab[7];
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;
/* l11: */
a_ref(i__, 1) = 1.f;
}
nc = 3;
n = 7;
aeb0r_c(&n, &nc, a, ev, v, rab, &ierr);
for (i__ = 0; i__ <= 18; i__+= 3) {
printf("\n %16.7e %16.7e %16.7e \n",a[i__], a[i__ + 1], a[i__ + 2]);
}
printf("\n %5i \n",ierr);
for (i__ = 1; i__ <= 7; ++i__) {
printf("\n %16.7e \n",ev[i__ - 1]);
}
for (i__ = 0; i__ <= 46; i__+= 2) {
printf("\n %16.7e %16.7e \n",v[i__], v[i__ + 1]);
}
printf("\n %16.7e \n",v[48]);
return 0;
} /* main */
Результаты:
Собственные значения:
| -5.6722919995d+00 |
| 1.5530623348d+01 |
| 1.0102923192d+02 |
ev = | 1.0001011975d+03 |
| 1.0000010098d+04 |
| 1.0000000100d+05 |
| 1.0000000001d+06 |
Собственные векторы:
| 4.60241432d-12 | | -1.01658674d-11 |
| -6.19409164d-10 | | -3.23048617d-09 |
| -4.59624634d-6 | | 1.01980144d-05 |
v1 = | 1.07906847d-4 | , v2 = | 2.21018403d-04 | ,
| 4.49094723d-2 | | -1.04031614d-01 |
| -5.57567694d-1 | | 8.22631335d-01 |
| 8.28915795d-1 | | 5.58976743d-01 |
| 8.78765679d-11 | | 1.21337184d-09 |
| 1.20773046d-07 | | -9.98803192d-06 |
| -8.90754203d-05 | | -1.11227803d-03 |
v3 = | -1.11743497d-02 | , v4 = | 9.99936917d-01 | ,
| 9.93497270d-01 | | 1.11204209d-02 |
| 1.11331459d-01 | | 1.12247594d-03 |
| 2.10619612d-02 | | 2.23652822d-05 |
| -1.00897793d-06 | | -1.11112345d-05 |
| -1.11123288d-04 | | 9.99999994d-01 |
| 9.99999371d-01 | | 1.11112108d-04 |
v5 = | 1.11121032d-03 | , v6 = | 1.01122336d-05 | ,
| 1.02132585d-04 | | 2.12447903d-09 |
| 2.13477306d-07 | | 1.01344920d-10 |
| 1.04277680d-08 | | 3.13795946d-14 |
| 1.00000000d+00 |
| 1.11111223d-05 |
| 1.01021324d-06 |
v7 = | 2.12344994d-11 | ,
| 1.01052664d-12 |
| 3.13400892d-17 |
| 1.01084105d-18 |
ierr = 0