Текст подпрограммы и версий afp1r_c.zip , afp1c_c.zip , afp1d_c.zip |
Тексты тестовых примеров tafp1r_c.zip , tafp1c_c.zip , tafp1d_c.zip |
LQ - разложение вещественной прямоугольной матрицы размера n*m (n ≤ m) методом отражений.
Выполняется факторизация мaтpицы А вида А = LQ, где Q - унитарная, L - нижняя треугольная матрица. Матрица L получается в результате умножения матрицы А нa последовательность преобразований отражения Q1, Q2, ..., QN тakиx, чтo АQ1Q2... QN = L , при этом
Q = QNT ... Q2TQ1T .
В.В.Воеводин, Л.И.Карышева, Г.Д.Ким, Р.В.Петрина, Комплекс алгоритмов, основанных на преобразованиях отражения, в пакете линейной алгебры, Сб. "Численный анализ на ФОРТРАНе", вып.3, Изд. МГУ, 1973.
int afp1r_c (real *a, integer *n, integer *m, real *w)
Параметры
a - | двумерный n*m массив, в котором задается исходная матрица (тип: real); в результате работы подпрограммы в массиве a на соответствующих местах запоминаются поддиагональные элементы матрицы L, в остальной части массива в последовательных строках запоминаются векторы, порождающие матрицы отражения Q1, Q2, ..., Qn ; |
n, m - | заданные размеры исходной матрицы, причем n ≤ m (тип: целый); |
w - | одномерный массив длины m, используемый подпрограммой как рабочий (тип: real); в результате работы подпрограммы в первых n компонентах w запоминаются диагональные элементы матрицы L. |
Версии
afp1c_c - | LQ - разложение методом отражения для прямоугольной n*m (n ≤ m) комплексной матрицы; |
afp1d_c - | LQ - разложение методом отражения для прямоугольной n на m (n ≤ m) вещественной матрицы, заданной с удвоенной точностью. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме afp1c_c массивы a, w имеют тип complex. | |
2. | В подпрограмме afp1d_c массивы a, w имеют тип double. |
int main(void) { /* Initialized data */ static float a[15] /* was [3][5] */ = { 1.f,0.f,1.f,2.f,1.f,3.f,0.f,1.f, 1.f,1.f,2.f,0.f,-1.f,1.f,0.f }; /* Local variables */ extern int afp1r_c(float *, int *, int *, float *); static int i__; static float v[5]; for (i__ = 0; i__ <= 12; i__+=3) { printf("\n %12.4e %12.4e %12.4e \n", a[i__], a[i__+1], a[i__+2]); } afp1r_c(a, &c__3, &c__5, v); for (i__ = 0; i__ <= 12; i__+=3) { printf("\n %16.7e %16.7e %16.7e \n", a[i__], a[i__+1], a[i__+2]); } printf("\n %16.7e %16.7e %16.7e \n", v[0], v[1], v[2]); return 0; } /* main */ Результат: | 1.174 0.644 0.000 0.322 -0.322 | a = | -1.134 1.076 0.389 0.657 0.510 | , | -2.646 -0.418 1.118 -0.853 0.150 | (v(i), i = 1, 3) = -2.646, -2.390, -1.956. Это означает, что | -2.646 0. 0. 0. 0.| r = | -1.134 -2.390 0. 0. 0.| , | -2.646 -0.418 -1.956 0. 0.| qi = i - wi * wit , i = 1, 2, 3 , где w1t = (1.174, 0.644, 0., 0.322, -0.322) , w2t = (0., 1.076, 0.389, 0.657, 0.150) , w3t = (0., 0., 1.118, -0.853, 0.150) .