Текст подпрограммы и версий
af10r_p.zip , af10e_p.zip
Тексты тестовых примеров
taf10r_p.zip , taf10e_p.zip

Подпрограмма:  AF10R (модуль AF10R_p)

Назначение

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

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

Выполняется факторизация матрицы А вида А = QR, где Q - oртогональная, R - верхняя треугольная матрица. Матрица R получается в результате умножения матрицы А на последовательность преобразований отражения Q1, Q2, ..., QК таких, что  QКQК - 1 ... Q1А = R ,  при этом

     Q = Q1T Q2T ... QKT . 

Подпрограмма вычисляет матрицу Q в явном виде.

В.В.Воеводин. Ошибки округления и устойчивость в прямых методах линейной алгебры, Изд. МГУ, М., 1969.

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

procedure AF10R(M :Integer; K :Integer; var A :Array of Real;
                var U :Array of Real; var T :Array of Real);

Параметры

M, K - размеры матрицы А, т.е. число строк и столбцов матрицы, соответственно (тип: целый);
A - двумерный массив, в котором задается исходная матрица; в результате работы подпрограммы в первых (К - 1) столбцах массива А запоминаются первые (К - 1) ортонормированных столбцов матрицы Q, на месте К - го столбца А запоминается К - ый столбец матрицы Q, умноженный на последний диагональный элемент треугольной матрицы R;
U - двумерный вещественный рабочий массив размера М*М; в результате работы подпрограммы в массиве U запоминается ортогональная матрица QT;
T - одномерный вещественный массив длины К * (К + 1) / 2; в результате работы подпрограммы в массиве Т запоминается верхняя треугольная матрица R.

Версии

AF10E - QR - разложение вещественной прямоугольной матрицы размера М*К, заданной с расширенной (Extended) точностью, методом отражений. При этом параметры А, U и Т должны иметь тип Extended.

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

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

 

Подпрограмма предназначена для факторизации таких матриц А, для которых К ≤ М и ранг которых равен К.

 

Подпрограмма может применяться для ортогонализации системы линейно - независимых векторов, расписанных в виде матрицы по столбцам; ортогональная система векторов запоминается в массиве А, при этом первые (К - 1) векторов будут нормированы. Значения параметров М и К сохраняются.

  В этой подпрограмме вычисляемая в процессе разложения верхняя треугольная матрица R хранится в компактной форме в массиве Т по строкам (а не по столбцам в соответствии с общим правилом).

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

Unit TAF10R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AF10R_p;

function TAF10R: String;

implementation

function TAF10R: String;
var
M,K,_i :Integer;
U :Array [0..8] of Real;
T :Array [0..5] of Real;
const
A :Array [0..8] of Real = ( 1.0,1.0,1.0,2.0,3.0,0.0,3.0,2.0,2.0 );
begin
Result := '';  { результат функции }
M := 3;
K := 3;
AF10R(M,K,A,U,T);
Result := Result + #$0D#$0A;
for _i:=0 to 8 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:=0 to 8 do
 begin
  Result := Result + Format('%20.16f ',[U[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 5 do
 begin
  Result := Result + Format('%20.16f ',[T[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TAF10R',Result);  { вывод результатов в файл TAF10R.res }
exit;
end;

end.


Результаты:

        Матрица A

     -0.5773502692    -0.1543033500     0.6428571429
     -0.5773502692    -0.6172133998    -0.4285714286
     -0.5773502692     0.7715167498    -0.2142857143

        Матрица U

     -0.5773502692    -0.5773502692    -0.5773502692
     -0.1543033500    -0.6172133998     0.7715167498
      0.8017837257    -0.5345224838    -0.2672612419

        Матрица T

     -1.732050808     -2.886751346      -4.041451884
     -2.160246899     -0.1543033500     0.8017837257