Текст подпрограммы и версий
aet2r_p.zip , aet2e_p.zip
Тексты тестовых примеров
taet2r_p.zip , taet2e_p.zip

Подпрограмма:  AET2R (модуль AET2R_p)

Назначение

Вычисление всех собственных значений вещественной верхней матрицы Хессенберга QR - алгоpитмом с двойным сдвигом.

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

Подпрограмма AET2R вычисляет собственные значения вещественной верхней матрицы Хессенберга с помощью QR - алгоpитма с двойным сдвигом.

В качестве сдвигов используются собственные значения подматрицы размерности 2 на 2, расположенной в нижнем углу текущей матрицы.

Для расщепления текущей матрицы на матрицу более низкого порядка перед каждой двухшаговой итерацией производится выявление малых поддиагональных элементов или двух подряд идущих поддиагональных элементов, произведение которых мало.

Предполагается, что матрица была предварительно промасштабирована с помощью подпрограммы AMB1R.

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

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

procedure AET2R(NM :Integer; N :Integer; LOW :Integer;
                IGH :Integer; var H :Array of Real;
                var WR :Array of Real; var WI :Array of Real;
                var IERR :Integer);

Параметры

NM - число строк двумерного массива Н, указанное при описании этого массива в вызывающей подпрограмме (тип: целый);
N - порядок исходной матрицы Хессенберга, N ≤ NМ (тип: целый);
      LOW -
      IGH  
исходные параметры подпрограммы АМВ1R (тип: целый); если исходная матрица не масштабировалась, то можно взять LОW := 1, IGН := N;
H - вещественный двумерный массив размерности NМ на N, содержащий в своих первых N строках исходную матрицу Хессенберга;
WR, WI - вещественные векторы длины N, содержащие собственно действительные и мнимые части вычисленных собственных значений;
IERR - целочисленная переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; IЕRR полагается равным индексу собственного значения, для вычисления которого требуется более 30 итераций, при этом собственные значения с индексами IЕRR + 1, IЕRR + 2, ..., N вычислены правильно; IЕRR := 0, если вычислены все собственные значения.

Версии

AET2E - вычисление всех собственных значений вещественной верхней матрицы Хессенберга, заданной с расширенной (Extended) точностью, QR - алгоpитмом с двойным сдвигом.

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

UTAE12 - подпрограмма выдачи диагностических сообщений при работе подпрограмм АЕТ2R и АЕТ2E.

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

  1. 

В подпрограмме АЕТ2E параметры Н, WR, WI имеют тип Extended.

  2.  Подпрограмма АЕТ2R (АЕТ2E) не сохраняет исходную матрицу.

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

Unit TAET2R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AET2R_p;

function TAET2R: String;

implementation

function TAET2R: String;
var
_i,IERR :Integer;
WR :Array [0..3] of Real;
WI :Array [0..3] of Real;
const
A :Array [0..15] of Real = ( 4.0,3.0,0.0,0.0,-2.0,-3.0,2.0,0.0,-2.0,-6.0,6.0,
1.0,2.0,6.0,-2.0,3.0 );
begin
Result := '';  { результат функции }
AET2R(4,4,1,4,A,WR,WI,IERR);
Result := Result + Format('%5d ',[IERR]) + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
 begiN
  RЕSULT := Result + Format('%20.16f ',[WR[_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 3 do
 begin
  Result := Result + Format('%20.16f ',[WI[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 ЕNd;
Result := Result + #$0D#$0A;
UtRes('TAET2R',Result);  { вывод результатов в файл TAET2R.res }
exit;
end;

end.

Результаты:

       IERR  =  0
       WR  =  (1., 2., 3., 4.)
       WI  =  (0., 0., 0., 0.)