Текст подпрограммы и версий
afg6r_p.zip , afg6e_p.zip , afg6c_p.zip , afg6z_p.zip
Тексты тестовых примеров
tafg6r_p.zip , tafg6e_p.zip , tafg6c_p.zip , tafg6z_p.zip

Подпрограмма:  AFG6R (модуль AFG6R_p)

Назначение

Приведение вещественной матрицы к верхней форме Хессенберга элементарными неортогональными преобразованиями подобия.

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

Подпрограмма АFG6R осуществляет приведение вещественной матрицы  А порядка  N к верхней форме Хессенберга  Н.

Подпрограмма АFG6R требует задания чисел LОW и IGН, удовлетворяющих условию

 ai j  =  0 ,   ecли  i > j   и  ecли  1 ≤ j < LOW  или  IGH < i ≤ N , 

которое означает, что первые (LОW - 1) столбцов и последние (N - IGН) строк матрицы  А имеют верхнюю треугольную форму.

Тогда достаточно будет привести к верхней форме Хессенберга только подматрицу матрицы  А, расположенную в строках и столбцах с номерами от LОW до IGН.

Приведение к форме Хессенберга осуществляется с помощью последовательности элементарных устойчивых преобразований подобия

  Aj  =  Nj-1 Ij j ' Aj -1 Ij j ' Nj  ,     j  =  LOW+1, LOW+2, ... , IGH-1 , 
где
   АLОW  =  А ,
   Ij j '       - элементарная матрица перестановок ,
   Nj         - элементарная матрица с элементами
         { Nj }i j  =  ni j ,     i = j +1, j +2, ... , IGH ,
         { Nj }i k  =  δi k     в остальных позициях . 

Информация о выполненных преобразованиях запоминается и может быть использована потом для восстановления собственных векторов исходной матрицы.

Уилкинсон, Райнш. "Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра." М.: Машиностроение, 1976.

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

procedure AFG6R(NM :Integer; N :Integer; LOW :Integer; IGH :Integer;
                var A :Array of Real; var INT :Array of Integer);

Параметры

NM - число строк двумерного массива  А, указанное при описании этого массива в вызывающей подпрограмме (тип: целый);
N - порядок исходной матрицы,  N ≤ NМ (тип: целый);
      LOW -
      IGH  
заданные граничные индексы строк и столбцов подматрицы исходной матрицы, которую требуется привести к форме Хессенберга (тип: целый);
если матрица масштабировалась, то LОW, IGН - выходные параметры подпрограммы AMB1R , в общем случае можно взять LОW = 1,  IGН = N;
A - вещественный двумерный массив размерности NM * N, содержащий в своих первых  N строках исходную матрицу; в результате работы подпрограммы массив  А содержит вычисленную матирцу Хессенберга, а в остальной части массива  А в столбцах с номерами  j = LОW, LОW + 1, ..., IGН - 2 запоминается информация об использованных элементарных преобразованиях, причем элементы  ni j,  i = j + 1, j + 2, ..., IGН, определяющие матрицу  Nj, запоминаются в ( j - 1) - ом столбце;
INT - целочисленный вектор длины IGН, в котором запоминается информация о выполненных перестановках строк и столбцов, причем элемент вектора INТ ( j ),  j = LОW + 1, LОW + 2, ..., IGН - 1 содержит номер строки, переставленной с  j - ой строкой текущей матрицы на  j - ом шаге преобразования.

Версии

AFG6E - приведение к верхней форме Хессенберга элементарными неортогональными (неунитарными) преобразованиями вещественной матрицы, заданной с расширенной (Extended) точностью.
AFG6C - приведение к верхней форме Хессенберга элементарными неортогональными (неунитарными) преобразованиями комплексной матрицы (см. замечания по использованию).
AFG6Z - приведение к верхней форме Хессенберга элементарными неортогональными (неунитарными) преобразованиями комплексной матрицы, заданной с расширенной (Extended) точностью (см. замечения по использованию).

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

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

  1. 

В подпрограмме АFG6E параметр  А имеет тип Extended.

  2. 

В подпрограмме АFG6С исходная комплексная матрица порядка  N задается в двух вещественных массивах АR и АI размеров NМ * N, содержащих в своих первых  N строках ее вещественную и мнимую части соответственно.
Параметр NМ определяет число строк массивов АR и АI, указанное при описании этих массивов в вызывающей подпрограмме.
В результате работы подпрограммы АFG6С массивы АR и АI содержат соответственно вещественную и мнимую части вычисленной матрицы Хессенберга, а также вещественные и мнимые части элементов  ni j матриц преобразования  Nj.
Первый оператор подпрограммы АFG6С имеет вид

        procedure AFG6C(NM :Integer; N :Integer; LOW :Integer; IGH :Integer;
                var AR :Array of Real; var AI :Array of Real;
                var INT :Array of Integer);
 
  3.  Подпрограмма АFG6Р имеет такие же параметры, как и подпрограмма АFG6С, только при этом АR и АI имеют тип Extended.

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

Unit tafg6r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFG6R_p;

function tafg6r: String;

implementation

function tafg6r: String;
var
J,I,_i :Integer;
INT :Array [0..3] of Integer;
const
A :Array [0..15] of Real = ( 8.0,16.0,64.0,32.0,-4.0,12.0,16.0,16.0,1.0,21.0,
28.0,20.0,16.0,48.0,64.0,64.0 );
begin
Result := '';  { результат функции }
INT[0] := 0;
INT[3] := 0;
AFG6R(4,4,1,4,A,INT);
Result := Result + #$0D#$0A;
for I:=1 to 4 do
 begin
  for J:=1 to 4 do
   begin
    Result := Result + Format('  A= + #$0D#$0A%20.16f ',
 [A[(I-1)+(J-1)*4]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',['  INT=']);
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
 begin
  Result := Result + Format('%10d ',[INT[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('tafg6r',Result);  { вывод результатов в файл tafg6r.res }
exit;
end;

end.

Результаты:

              |    8.00      8.00       8.      16.  |
              |  64.00     64.00     64.     64.  |
     A  =  |    0.25     32.00     32.     32.  |  ,
              |    0.50      0.75       8.        8.  |

     INT  =  (0, 3, 3, 0)T  .

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

   H  =  N3- 1 I3, 3 N2- 1 I2, 3 A I2, 3 N2 I3, 3 N3  = 

               |    8.      8.      8.     16   |
               |  64.    64.    64.     64.  |
          =   |    0.    32.    32      32.  |  ,
               |    0.      0.      8.       8.  |

   при этом

                 |  1     0      0    0  |
                 |  0     1      0    0  |
      N2  =  |  0   0.25   1    0  |   ,
                 |  0   0.5     0    1  |

                 |  1     0     0      0  |
                 |  0     1     0      0  |
      N3  =  |  0     0     1      0  |   .
                 |  0     0   0.75   1  |