Текст подпрограммы и версий
am08r_p.zip , am08e_p.zip , am08c_p.zip
Тексты тестовых примеров
tam08r_p.zip , tam08e_p.zip , tam08c_p.zip

Подпрограмма:  AM08R (модуль AM08R_p)

Назначение

Левосторонние преобразования вектора последовательностью матриц вращения, упакованных над верхней двухдиагональной частью прямоугольной матрицы размера N * M (N ≥ M).

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

Вектор B длины М последовательно умножается слева на матрицы вращения  ТМ - 1 М, ТМ-2 М, ..., Т2 3,  упакованные над верхней двух диагональной частью заданной прямоугольной матрицы А размера N*М (N ≥ М) таким образом, что если  t = А(i-1, j),  i < j, то матрица  Тi j размера М*М является матрицей плоского вращения в плоскости (i, j), у которой элементы  Ti i = Tj j = С,  Ti j = -S,  Tj i = S,  а остальные элементы главной диагонали равны 1,
где  С = (1 - | t |2 ) / (1 + | t |2) ,  S = 2t / (1 + | t |2).

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

procedure AM08R(var A :Array of Real; N :Integer; M :Integer;
                var B :Array of Real); 

Параметры

A - двумерный массив размера N * М, содержащий прямоугольную матрицу, над верхней двухдиагональной частью которой хранится в упакованном виде последовательность матриц вращения (тип: вещественный);
N, M - число строк и столбцов матрицы  А, причем N ≥ М (тип: целый);
B - одномерный массив длины  М, в котором задается исходный вектор; в результате работы подпрограммы на месте  B запоминается преобразованный вектор (тип: вещественный).

Версии

AM08E - левосторонние преобразования вектора последовательностью матриц вращения с расширенной (Extended) точностью.
AM08C - левосторонние преобразования комплексного вектора последовательностью комплексных матриц вращения.

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

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

  1. 

Заданная в необходимой форме последовательность матриц вращения, используемых данной подпрограммой, получается, например, в результате работы подпрограммы, реализующей приведение прямоугольной матрицы  А размера N * М (N ≥ М) к верхнему треугольному виду (АFР8R) методом вращений.

  2. 

В подпрограмме АМ08E параметры  А и  B имеют тип Extended.

  3.  В подпрограмме AM08C параметры  А и  B имеют тип Complex.

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

Unit tam08r_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, AM08R_p;

function tam08r: String; 

implementation

function tam08r: String;
var
I,J,_i :Integer;
A :Array [0..19] of Real;
const
B :Array [0..4] of Real = ( 1.0,1.0,1.0,1.0,1.0 );
label
_2;
begin
Result := '';
for I:=1 to 5 do
 begin
  for J:=1 to 4 do
   begin
_2:
    A[(I-1)+(J-1)*5] := 1.0;
   end;
 end;
A[16] := 0.5;
AM08R(A,5,4,B);
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
 begin
  Result := Result + Format('%20.16f ',[B[_i]]);
  if ( ((_i+1) mod 3)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 19 do
 begin
  Result := Result + Format('%20.16f ',[A[_i]]);
  if ( ((_i+1) mod 1)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('tam08r',Result);  { вывод результатов в файл tam08r.res }
exit;
end;

end.


Результат:    В  =  ( 1.0, 0.2, - 1.4, 1.0, 1.0 )