Текст подпрограммы и версий afp1r_p.zip , afp1c_p.zip , afp1e_p.zip |
Тексты тестовых примеров tafp1r_p.zip , tafp1c_p.zip , tafp1e_p.zip |
LQ - разложение вещественной прямоугольной матрицы размера N*M (N ≤ M) методом отражений.
Выполняется факторизация матрицы А вида А = LQ, где Q - унитарная, L - нижняя треугольная матрица. Матрица L получается в результате умножения матрицы А на последовательность преобразований отражения Q1, Q2, ..., QN таких, что АQ1Q2... QN = L , при этом
Q = QNT ... Q2TQ1T .
В.В.Воеводин, Л.И.Карышева, Г.Д.Ким, Р.В.Петрина, Комплекс алгоритмов, основанных на преобразованиях отражения, в пакете линейной алгебры, Сб. "Численный анализ на ФОРТРАНе", вып.3, Изд. МГУ, 1973.
procedure AFP1R(var A :Array of Real; N :Integer; M :Integer; var W :Array of Real);
Параметры
A - | двумерный N*М массив, в котором задается исходная матрица (тип: Real); в результате работы подпрограммы в массиве А на соответствующих местах запоминаются поддиагональные элементы матрицы L, в остальной части массива в последовательных строках запоминаются векторы, порождающие матрицы отражения Q1, Q2, ..., QN ; |
N, M - | заданные размеры исходной матрицы, причем N ≤ М (тип: целый); |
W - | одномерный массив длины М, используемый подпрограммой как рабочий (тип: Real); в результате работы подпрограммы в первых N компонентах W запоминаются диагональные элементы матрицы L. |
Версии
AFP1C - | LQ - разложение методом отражения для прямоугольной N*М (N ≤ М) комплексной матрицы; |
AFP1E - | LQ - разложение методом отражения для прямоугольной N на М (N ≤ М) вещественной матрицы, заданной с расширенной (Extended) точностью. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме АFР1С массивы А, W имеют тип Complex. | |
2. | В подпрограмме АFР1E массивы А, W имеют тип Extended. |
Unit TAFP1R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, AFP1R_p; function TAFP1R: String; implementation function TAFP1R: String; var _i,I :Integer; V :Array [0..4] of Real; const A :Array [0..14] of Real = ( 1.0,0.0,1.0,2.0,1.0,3.0,0.0,1.0,1.0,1.0,2.0,0.0, -1.0,1.0,0.0 ); begin Result := ''; { результат функции } Result := Result + Format('%s',[' ИСХОДНАЯ MATPИЦA']) + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 14 do begin Result := Result + Format('%20.16f ',[A[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; AFP1R(A,3,5,V); Result := Result + Format('%s',[' PEЗYЛЬТАТ ФAKTOPИЗAЦИИ']) + #$0D#$0A; Result := Result + Format('%s',[' A']); Result := Result + #$0D#$0A; for _i:=0 to 14 do begin Result := Result + Format('%20.16f ',[A[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for I:=1 to 3 do begin Result := Result + Format(' V%20.16f ',[V[I-1]]) + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TAFP1R',Result); { вывод результатов в файл TAFP1R.res } exit; end; end. Результат: | 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) .