|
Текст подпрограммы и версий 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) .