Текст подпрограммы и версий afg3c_c.zip |
Тексты тестовых примеров tafg3c_c.zip |
Приведение пары комплексных матриц к верхней почти треугольной форме элементарными преобразованиями с помощью LZ - алгоритма.
Для заданных комплексных матриц А и В размера N*N вычисляются такие элементарные матрицы L и Z размера N*N, что матрица LAZ является верхней почти треугольной, а матрица LВZ - верхней треугольной.
В результате работы подпрограммы afg3c_c матрица LAZ помещается на место матрицы А, матрица LВZ - на место матрицы В. Левостороннее преобразование L не сохраняется, правостороннее преобразование Z по желанию пользователя может сохраняться.
R.S.Мartin, J.Н.Wilkinson, Tне Мodified LR - Аlgorithm for Сomplex Нessenberg Мatrices, Numer.Мath., 12, 1968.
С.В.Мoler, G.W.Stewart, Аn Аlgorithm for тне Generalized Мatrix Еigenvalue Рrodlems, siam J. Numer. Аnal., 10, 1973.
int afg3c_c (complex *a, complex *b, complex *z, integer *n, integer *m)
Параметры
a, b - | комплексные двумерные массивы размера n*n, в которых задаются исходные матрицы a и b; в результате работы подпрограммы в массивы a и b записываются соответственно верхняя почти треугольная матрица laz и верхняя треугольная матрица lbz; |
z - | комплексный двумерный массив размера n*n, который содержит вычисленное правостороннее преобразование z; если преобразование не нужно, то параметр z в подпрограмме не используется; |
n - | заданный порядок матриц a, b и z (тип: целый); |
m - | задает режим работы подпрограммы (тип: целый); причем |
m = 0 - | если преобразование z сохраняется, |
m = 1 - | если преобразование z не сохраняется. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
Матрица преобразования z необходима для вычисления собственных векторов обобщенной проблемы ax = λbx по правилу x = zy, где y - собственные векторы обобщенной проблемы lazy =λlbzy . | |
2. | Если матрица преобразования z не нужна, т.е. когда m = 1, то в качестве фактического параметра z можно использовать параметр a. |
int main(void) { /* Initialized data */ static complex a[9] /* was [3][3] */ = { {1.f,0.f},{-10.f,0.f},{5.f,0.f}, {.5f,0.f},{2.f,0.f},{1.f,0.f},{0.f,0.f},{0.f,0.f},{.5f,0.f} }; static complex b[9] /* was [3][3] */ = { {.5f,0.f},{3.f,0.f},{4.f,0.f}, {0.f,0.f},{3.f,0.f},{.5f,0.f},{0.f,0.f},{0.f,0.f},{1.f,0.f} }; /* Local variables */ static int ierr; extern int afg3c_c(complex *, complex *, complex *, int *, int *); static int i__, m, n; static complex z__[9] /* was [3][3] */; #define a_subscr(a_1,a_2) (a_2)*3 + a_1 - 4 #define a_ref(a_1,a_2) a[a_subscr(a_1,a_2)] #define b_subscr(a_1,a_2) (a_2)*3 + a_1 - 4 #define b_ref(a_1,a_2) b[b_subscr(a_1,a_2)] #define z___subscr(a_1,a_2) (a_2)*3 + a_1 - 4 #define z___ref(a_1,a_2) z__[z___subscr(a_1,a_2)] for (i__ = 1; i__ <= 3; ++i__) { printf("\n %14.5f %14.5f %14.5f %14.5f \n", a_ref(i__, 1).r, a_ref(i__, 1).i, a_ref(i__, 2).r, a_ref(i__, 2).i); printf("\n %14.5f %14.5f \n", a_ref(i__, 3).r, a_ref(i__, 3).i); } for (i__ = 1; i__ <= 3; ++i__) { printf("\n %14.5f %14.5f %14.5f %14.5f \n", b_ref(i__, 1).r, b_ref(i__, 1).i, b_ref(i__, 2).r, b_ref(i__, 2).i); printf("\n %14.5f %14.5f \n", b_ref(i__, 3).r, b_ref(i__, 3).i); } n = 3; m = 0; afg3c_c(a, b, z__, &n, &m); for (i__ = 1; i__ <= 3; ++i__) { printf("\n %14.5f %14.5f %14.5f %14.5f \n", a_ref(i__, 1).r, a_ref(i__, 1).i, a_ref(i__, 2).r, a_ref(i__, 2).i); printf("\n %14.5f %14.5f \n", a_ref(i__, 3).r, a_ref(i__, 3).i); } for (i__ = 1; i__ <= 3; ++i__) { printf("\n %14.5f %14.5f %14.5f %14.5f \n", b_ref(i__, 1).r, b_ref(i__, 1).i, b_ref(i__, 2).r, b_ref(i__, 2).i); printf("\n %14.5f %14.5f \n", b_ref(i__, 3).r, b_ref(i__, 3).i); } for (i__ = 1; i__ <= 3; ++i__) { printf("\n %14.5f %14.5f %14.5f %14.5f \n", z___ref(i__, 1).r, z___ref(i__, 1).i, z___ref(i__, 2).r, z___ref(i__, 2).i); printf("\n %14.5f %14.5f \n", z___ref(i__, 3).r, z___ref(i__, 3).i); } printf("\n %5i \n", ierr); return 0; } /* main */ Результаты: | 5.00000 + 0.0 i 1.03125 + 0.0 i 0.50000 + 0.0 i | a_ref = |-13.75000 + 0.0 i 1.22056 + 0.0 i -0.37500 + 0.0 i | | 0.0 + 0.0 i 0.40455 + 0.0 i -0.07273 + 0.0 i | | 4.00000 + 0.0 i 0.56250 + 0.0 i 1.00000 + 0.0 i | b_ref = | 0.0 + 0.0 i 2.57812 + 0.0 i -0.75000 + 0.0 i | | 0.50000 + 0.0 i 0.0 + 0.0 i -0.14545 + 0.0 i | | 1.0 + 0.0 i 0.0 + 0.0 i 0.0 + 0.0 i | z___ref = | 0.0 + 0.0 i 1.0 + 0.0 i 0.0 + 0.0 i | | 0.0 + 0.0 i 0.06250 + 0.0 i 1.0 + 0.0 i |