Текст подпрограммы и версий
afp2r_p.zip , afp2e_p.zip , afp2c_p.zip
Тексты тестовых примеров
tafp2r_p.zip , tafp2e_p.zip , tafp2c_p.zip

Подпрограмма:  AFP2R (модуль AFP2R_p)

Назначение

QR - разложение вещественной прямоугольной матрицы размера N*M (N ≥ M) нормализованным процессом метода отражений.

Математическое описание

Выполняется факторизация матрицы А вида АР = QR, где Q - унитарная матрица, R - верхняя треугольная матрица, Р - матрица перестановок. матрица Р осуществляет перестановку столбцов А и обеспечивает выполнение нормализованного процесса. Матрица Q строится как произведение матриц Q1T, Q2T, ..., QMT, где Q1, Q2, ..., QM - преобразования отражения, приводящие матрицу АР к верхнему треугольному виду:

     QMQM-1 ... Q1AP = R 

В.В.Воеводин, Л.И.Карышева, Г.Д.Ким, Р.В.Петрина, комплекс алгоритмов, основанных на преобразованиях отражения, в пакете линейной алгебры, Сб. "Численный анализ на ФОРТРАНе", вып.3, Изд. МГУ, 1973.

Использование

procedure AFP2R(var A :Array of Real; N :Integer; M :Integer;
                var W :Array of Real; var S :Array of Integer);

Параметры

A - двумерный N*М массив, в котором задается исходная матрица (тип: Real); в результате работы подпрограммы в массиве А на соответствующих местах запоминаются наддиагональные элементы матрицы R, в остальной части массива в последовательных столбцах запоминаются векторы, порождающие матрицы отражения Q1, Q2, ..., QM ;
N, M - заданные размеры исходной матрицы, причем N ≥ М (тип: целый);
W - одномерный массив длины N, используемый подпрограммой как рабочий (тип: Real); в результате работы подпрограммы в первых М компонентах W запоминаются диагональные элементы матрицы R;
S - одномерный массив длины М, в котором запоминается вектор, порождающий матрицу перестановок (тип: целый); в S (К) запоминается номер столбца, переставленного с К - ым столбцом текущей матрицы на К - ом шаге преобразования.

Версии

AFP2C - QR - разложение нормализованным процессом метода отражений для прямоугольной N*М (N ≥ М) комплексной матрицы;
AFP2E - QR - разложение нормализованным процессом метода отражений для прямоугольной N*М (N ≥ М) вещественной матрицы, заданной с расширенной (Extended) точностью.

Вызываемые подпрограммы: нет

Замечания по использованию

  1. 

В подпрограмме АFР2С массивы А, W имеют тип Complex.

  2.  В подпрограмме АFР2E массивы А, W имеют тип Extended.

Пример использования

Unit TAFP2R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFP2R_p;

function TAFP2R: String;

implementation

function TAFP2R: String;
var
J,I,_i :Integer;
L :Array [0..3] of Integer;
V :Array [0..6] of Real;
const
A :Array [0..27] of Real = ( 1.0,0.0,2.0,1.0,-1.0,-1.0,0.0,3.0,2.0,1.0,-3.0,
1.0,1.0,2.0,2.0,2.0,-1.0,-4.0,2.0,2.0,2.0,4.0,3.0,
-2.0,0.0,0.0,2.0,0.0 );
begin
Result := '';  { результат функции }
Result := Result + Format('%s',[' ИСХОДНАЯ MATPИЦA']) + #$0D#$0A; 
Result := Result + #$0D#$0A;
for I:=1 to 7 do
 begin
  for J:=1 to 4 do
   begin
    Result := Result + Format('%20.16f ',[A[(I-1)+(J-1)*7]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
AFP2R(A,7,4,V,L);
Result := Result + Format('%s',[' РЕЗУЛЬТАТ ФAKTOPИЗAЦИИ']) + #$0D#$0A; 
Result := Result + #$0D#$0A;
for I:=1 to 7 do
 begin
  for J:=1 to 4 do
   begin
    Result := Result + Format(' A%20.16f ',
 [A[(I-1)+(J-1)*7]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for I:=1 to 4 do
 begin
  Result := Result + Format(' V%20.16f ',[V[I-1]]) + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' L']);
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
 begin
  Result := Result + Format('%5d ',[L[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TAFP2R',Result);  { вывод результатов в файл TAFP2R.res }
exit;
end;

end.


Результат:

                 |  1.153  -3.288   1.315  -4.768 |
                 |  0.285   1.120  -0.493  -0.493 |
                 | -0.143  -0.208   1.357  -2.455 |
      A  =    | -0.570   0.684   0.149    1.334 |
                 |  0.285  -0.342  -0.224  -1.350 |
                 |  0.285   0.037  -0.282  -0.425 |
                 |  0.285  -0.342   0.076  -1.423 |

      (V(I), I = 1, 4)  =  -6.083,  -4.711,  -2.455,  7.797*10- 12 , 

      L  =   (3,  4,  3,  4) .

Это означает, что

                 | -6.083  -3.288    1.315  -4.768           |
                 |  0.         -4.711  -0.493  -0.493           |
                 |  0.          0.         -2.455  -2.455           |
      R  =    |  0.          0.           0.         7.797*10-12 |   , 
                 |  0.          0.           0.         0.                 |
                 |  0.          0.           0.         0.                 |
                 |  0.          0.           0.         0.                 |

      Qi  =  I - Wi * WiT ,   i = 1, 2, 3, 4 ,
 где
      W1T =  (1.153, 0.285, -0.143, -0.570, 0.285, 0.285, 0.285) ,

      W2T =  (0., 1.120, -0.208, 0.684, -0.342, 0.037, -0.342) ,

      W3T =  (0., 0., 1.357, 0.149, -0.224, -0.282, 0.076) ,

      W4T =  (0., 0., 0., -1.084, 0.430, 0.538, 0.592) .