Текст подпрограммы и версий afp5r_c.zip , afp5c_c.zip , afp5d_c.zip |
Тексты тестовых примеров tafp5r_c.zip , tafp5c_c.zip , tafp5d_c.zip |
Приведение прямоугольной вещественной матрицы размера n*m (n ≤ m) к нижнему двухдиагональному виду методом отражений.
Для прямоугольной N*М (N ≤ М) матрицы А строятся две последовательности матриц отражения Q1, Q2, ..., QN - 2, R1, R2, ..., Rn тakие, что
QN-2 ... Q2Q1AR1R2 ... RN = D ,
где D - нижняя двухдиагональная матрица.
В.В.Воеводин, Л.И.Карышева, Г.Д.Ким, Р.В.Петрина, Комплекс алгоритмов, основанных на преобразованиях отражения в пакете линейной алгебры. Сб. "Численный анализ на ФОРТРАНе", вып.3. Изд-во МГУ, 1973.
int afp5r_c (real *a, integer *n, integer *m, real *d1, real *d2)
Параметры
a - | двумерный n*m массив, в котором задается исходная матрица (тип: real); в результате работы подпрограммы в a запоминается информация о матрицах отражения: в поддиагональной части массива a в последовательных столбцах запоминаются векторы, порождающие матрицы отражения Q1, Q2, ..., Qn - 2; в остальной части массива в последовательных строках запоминаются векторы, порождающие матрицы отражения R1, R2, ..., Rn. |
n, m - | заданные размеры исходной матрицы, причем n ≤ m (тип: целый); |
d1 - | одномерный массив длины m, используемый подпрограммой как рабочий (тип: real); в результате работы подпрограммы в первых n компонентах d1 запоминаются элементы главной диагонали матрицы D; |
d2 - | одномерный массив длины n, используемый подпрограммой как рабочий (тип: real); в результате работы подпрограммы в первых n - 1 компонентах d2 запоминаются элементы второй диагонали матрицы D. |
Версии
afp5c_c - | приведение методом отражений к нижнему двухдиагональному виду прямоугольной n*m (n ≤ m) комплексной матрицы; |
afp5d_c - | приведение методом отражений к нижнему двухдиагональному виду прямоугольной n*m (n ≤ m) вещественной матрицы, заданной с удвоенной точностью. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме afp5c_c массивы a, d1, d2 имеют тип complex. | |
2. | В подпрограмме afp5d_c массивы a, d1, d2 имеют тип double. |
int main(void) { /* Initialized data */ static float a[24] /* was [4][6] */ = { 1.f,4.f,3.f,2.f,0.f,1.f,1.f,-1.f, -3.f,1.f,5.f,6.f,2.f,-1.f,1.f,1.f,-1.f,2.f,-1.f,0.f,-6.f,0.f,2.f, -1.f }; /* Local variables */ extern int afp5r_c(float *, int *, int *, float *, float *); static float d1[6], d2[4]; int i__; for (i__ = 0; i__ <= 21; i__+=3) { printf("\n %16.7e %16.7e %16.7e \n", a[i__], a[i__+1], a[i__+2]); } afp5r_c(a, &c__4, &c__6, d1, d2); for (i__ = 0; i__ <= 21; i__+=3) { printf("\n %16.7e %16.7e %16.7e \n", a[i__], a[i__+1], a[i__+2]); } 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 0.000 -0.393 0.262 -0.131 -0.787 | | 1.064 -1.045 -0.904 -0.118 0.070 -0.266 | a = | 0.870 1.310 1.279 -0.252 0.501 -0.221 | , | 0.332 -0.534 0.000 1.257 -0.518 -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 0.000 0.000 0.000 0.000 0.000 | | -3.175 7.608 0.000 0.000 0.000 0.000 | d = | 0.000 -3.851 -2.625 0.000 0.000 0.000 | , | 0.000 0.000 0.412 -4.142 0.000 0.000 | qi = i - wi*wit , i = 1, 2 , где w1t = (0.000, 1.064, 0.870, 0.332) , w2t = (0.000, 0.000, 1.310, -0.534) ; ri = 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) .