Текст подпрограммы и версий afp4r_c.zip , afp4c_c.zip , afp4d_c.zip |
Тексты тестовых примеров tafp4r_c.zip , tafp4c_c.zip , tafp4d_c.zip |
Приведение прямоугольной вещественной матрицы размера n*m (n ≥ m) к верхнему двухдиагональному виду методом отражений.
Для прямоугольной N*М (N ≥ М) матрицы А строятся две последовательности матриц отражения Q1, Q2, ..., QM и R1, R2, ... Rm - 2 тakие, что
QM ... Q1AR1 ... RM-2 = D ,
где D - верхняя двухдиагональная матрица.
В.В.Воеводин, Л.И.Карышева, Г.Д.Ким, Р.В.Петрина, Комплекс алгоритмов, основанных на преобразованиях отражения в пакете линейной алгебры. Сб. "Численный анализ на ФОРТРАНе", вып.3. Изд-во МГУ, 1973.
int afp4r_c (real *a, integer *n, integer *m, real *d1, real *d2)
Параметры
a - | двумерный n*m массив, в котором задается исходная матрица (тип: real); в результате работы подпрограммы в a запоминается информация о матрицах отражения; в наддиагональной части массива a в последовательных строках запоминаются векторы, порождающие матрицы отражения R1, ..., Rm - 2 ; в остальной части массива в последовательных столбцах запоминаются векторы, порождающие матрицы отражения Q1, Q2, ..., Qm . |
n, m - | заданные размеры исходной матрицы, причем n ≥ m (тип: целый); |
d1 - | одномерный массив длины n, используемый подпрограммой как рабочий (тип: real); в результате работы подпрограммы в первых m компонентах d1 запоминаются элементы главной диагонали матрицы D; |
d2 - | одномерный массив длины m, используемый подпрограммой как рабочий (тип: real); в результате работы подпрограммы в первых m - 1 компонентах d2 запоминаются элементы второй диагонали матрицы D. |
Версии
afp4c_c - | приведение методом отражений к верхнему двухдиагональному виду прямоугольной матрицы n*m (n ≥ m) комплексной матрицы; |
afp4d_c - | приведение методом отражений к верхнему двухдиагональному виду прямоугольной матрицы n*m (n ≥ m) вещественной матрицы, заданной с удвоенной точностью. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме afp4c_c массивы a, d1, d2 имеют тип complex. | |
2. | В подпрограмме afp4d_c массивы a, d1, d2 имеют тип double. |
int main(void) { /* Initialized data */ static float a[24] /* was [6][4] */ = { 1.f,0.f,-3.f,2.f,-1.f,-6.f,4.f, 1.f,1.f,-1.f,2.f,0.f,3.f,1.f,5.f,1.f,-1.f,2.f,2.f,-1.f,6.f,1.f, 0.f,-1.f }; /* Local variables */ extern int afp4r_c(float *, int *, int *, float *, float *); static int i__; static float d1[6], d2[4]; #define a_ref(a_1,a_2) a[(a_2)*6 + a_1 - 7] afp4r_c(a, &c__6, &c__4, d1, d2); for (i__ = 1; i__ <= 6; ++i__) { printf("\n %16.7e %16.7e %16.7e %16.7e \n", a_ref(i__,1), a_ref(i__,2), a_ref(i__,3), a_ref(i__,4)); } for (i__ = 0; i__ <=3; i__+=3) { printf("\n %16.7e %16.7e %16.7e \n", d1[i__], d1[i__+1], d1[i__+2]); } for (i__ = 0; i__ <=2; i__+=2) { printf("\n %16.7e %16.7e \n", d2[i__], d2[i__+1]); } return 0; } /* main */ Результат: | 1.068 1.064 0.870 0.332 | | 0.000 -1.045 1.310 -0.534 | a_ref = | -0.393 -0.904 1.279 0.000 | | 0.262 -0.118 -0.252 1.257 | | -0.131 0.070 0.501 -0.518 | | -0.787 -0.266 -0.221 -0.391 | d1 = (-7.141, 7.608, -2.625, -4.142, -0.518, -0.391) d2 = (-3.175, -3.851, 0.412, -0.534) Это означает, что | -7.141 -3.175 0.000 0.000 | | 0.000 7.608 -3.851 0.000 | d = | 0.000 0.000 -2.625 0.412 | | 0.000 0.000 0.000 -4.142 | | 0.000 0.000 0.000 0.000 | | 0.000 0.000 0.000 0.000 | qi = i - ui * uit , i = 1, 2, 3, 4 , где u1t = (1.068, 0.000, -0.393, 0.262, -0.131, -0.787) u2t = (0.000, -1.045, -0.904, -0.118, 0.070, -0.266) u3t = (0.000, 0.000, 1.279, -0.252, 0.501, -0.221) u4t = (0.000, 0.000, 0.000, 1.257, -0.518, -0.391) ri = i - wi * wit , i = 1, 2 , где w1t = (0.000, 1.064, 0.870, 0.332) w2t = (0.000, 0.000, 1.310, -0.534)