|
Текст подпрограммы и версий afp0r_p.zip , afp0c_p.zip , afp0e_p.zip |
Тексты тестовых примеров tafp0r_p.zip , tafp0c_p.zip , tafp0e_p.zip |
QR - разложение вещественной прямоугольной матрицы размера N*M (N ≥ M) методом отражений.
Выполняется факторизация матрицы А вида А = QR, где Q - унитарная, R - верхняя треугольная матрица. Матрица R получается в результате умножения матрицы А на последовательность преобразований отражения Q1, Q2, ..., QМ таких, чтO QМQМ - 1...Q1А = R , при этом
Q = Q1TQ2T ... QMT .
В.В.Воеводин, Л.И.Карышева, Г.Д.Ким, Р.В.Петрина, Комплекс алгоритмов основанных на преобразованиях отражения, в пакете линейной алгебры, Сб. "Численный анализ на ФОРТРАНе", вып.3, Изд. МГУ, 1973.
procedure AFP0R(var A :Array of Real; N :Integer; M :Integer;
var W :Array of Real);
Параметры
| A - | двумерный N*М массив, в котором задается исходная матрица (тип: Real); в результате работы подпрограммы в массиве А на соответствующих местах запоминаются наддиагональные элементы матрицы R, в остальной части массива в последовательных столбцах запоминаются векторы, порождающие матрицы отражения Q1, Q2, ..., QМ ; |
| N, M - | заданные размеры исходной матрицы, причем N ≥ М (тип: целый); |
| W - | одномерный массив длины N, используемый подпрограммой как рабочий (тип: Real); в результате работы подпрограммы в первых М компонентах W запоминаются диагональные элементы матрицы R. |
Версии
| AFP0C - | QR - разложение методом отражений для прямоугольной N*М (N ≥ М) комплексной матрицы; |
| AFP0E - | QR - разложение методом отражений для прямоугольной N*М (N ≥ М) вещественной матрицы, заданной с расширенной (Extended) точностью. |
Вызываемые подпрограммы: нет
Замечания по использованию
| 1. |
В подпрограмме АFР0С массивы А, W имеют тип Complex. | |
| 2. | В подпрограмме АFР0E массивы А, W имеют тип Extended. |
Unit TAFP0R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFP0R_p;
function TAFP0R: String;
implementation
function TAFP0R: String;
var
J,I :Integer;
V :Array [0..4] of Real;
const
A :Array [0..14] of Real = ( 1.0,2.0,0.0,1.0,-1.0,0.0,1.0,1.0,2.0,1.0,1.0,
3.0,1.0,0.0,0.0 );
begin
Result := ''; { результат функции }
Result := Result + Format('%s',[' ИСХОДНАЯ MATPИЦA']) + #$0D#$0A;
Result := Result + #$0D#$0A;
for I:=1 to 5 do
begin
for J:=1 to 3 do
begin
Result := Result + Format('%20.16f ',[A[(I-1)+(J-1)*5]]) + #$0D#$0A;
end;
end;
Result := Result + #$0D#$0A;
AFP0R(A,5,3,V);
Result := Result + Format('%s',[' PEЗYЛЬТАТ ФAKTOPИЗAЦИИ']) + #$0D#$0A;
Result := Result + #$0D#$0A;
for I:=1 to 5 do
begin
for J:=1 to 3 do
begin
Result := Result + Format(' A%20.16f ',
[A[(I-1)+(J-1)*5]]) + #$0D#$0A;
end;
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('TAFP0R',Result); { вывод результатов в файл TAFP0R.res }
exit;
end;
end.
Результат:
| 1.174 -1.134 -2.646 |
| 0.644 1.076 -0.418 |
A = | 0.000 0.389 1.118 |
| 0.322 0.657 -0.853 |
| -0.322 0.510 0.150 |
(V(I), I = 1, 3) = -2.646, -2.390, -1.956.
Это означает, что
| -2.646 -1.134 -2.646 |
| 0. -2.390 -0.418 |
R = | 0. 0. -1.956 |
| 0. 0. 0. |
| 0. 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.510) ,
W3T = (0., 0., 1.118, -0.853, 0.150) .