Текст подпрограммы и версий
afg3c_p.zip
Тексты тестовых примеров
tafg3c_p.zip

Подпрограмма:  AFG3C (модуль AFG3C_p)

Назначение

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

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

Для заданных комплексных матриц А и В размера N*N вычисляются такие элементарные матрицы L и Z размера N*N, что матрица LАZ является верхней почти треугольной, а матрица LВZ - верхней треугольной.

В результате работы подпрограммы AFG3C матрица LАZ помещается на место матрицы А, матрица LВZ - на место матрицы В. Левостороннее преобразование L не сохраняется, правостороннее преобразование Z по желанию пользователя может сохраняться.

R.S.Мartin, J.Н.Wilkinson, Tне Мodified LR - Аlgorithm for Сomplex Нessenberg Мatrices, Numer.Мath., 12, 1968.

С.В.Мoler, G.W.Stewart, Аn Аlgorithm for тне Generalized Мatrix Еigenvalue Рrodlems, SIАМ J. Numer. Аnal., 10, 1973.

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

procedure AFG3C(var A :Array of Complex; var B :Array of Complex;
                var Z :Array of Complex; N :Integer; M :Integer);

Параметры

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

Версии: нет

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

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

  1. 

Матрица преобразования Z необходима для вычисления собственных векторов обобщенной проблемы Аx = λВx по правилу x = Zy, где y - собственные векторы обобщенной проблемы LАZy =λLВZy .

  2.  Если матрица преобразования Z не нужна, т.е. когда М = 1, то в качестве фактического параметра Z можно использовать параметр А.

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

Unit TAFG3C_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFG3C_p;

function TAFG3C: String;

implementation

function TAFG3C: String;
var
J,I,N,M,IERR :Integer;
Z :Array [0..8] of Complex;
const
A :Array [0..8] of Complex = ( ( re:1.0; im:0.0 ),( re:-10.0; im:0.0 ),( 
re:5.0; im:0.0 ),( re:0.5; im:0.0 ),( re:2.0; 
im:0.0 ),( re:1.0; im:0.0 ),( re:0.0; im:0.0 ),( 
re:0.0; im:0.0 ),( re:0.5; im: 0.0 ) );
B :Array [0..8] of Complex = ( ( re:0.5; im:0.0 ),( re:3.0; im:0.0 ),( re:4.0; 
im:0.0 ),( re:0.0; im:0.0 ),( re:3.0; im:0.0 ),( 
re:0.5; im:0.0 ),( re:0.0; im:0.0 ),( re:0.0; 
im:0.0 ),( re:1.0; im: 0.0 ) );
begin
Result := '';  { результат функции }
Result := Result + Format('%s',
 [' ПРИВЕДЕНИЕ ДВУХ КОМПЛЕКСНЫХ МАТРИЦ К ВЕРХНЕТРЕУГОЛЬНОЙ ' + #$0D#$0A +
 ' И ВЕРХНЕЙ ПОЧТИ ТРЕУГОЛЬНОЙ ФОРМЕ ОРТОГОНАЛЬНЫМИ ' + #$0D#$0A +
 ' ПРЕОБРАЗОВАНИЯМИ']) + #$0D#$0A; 
Result := Result + #$0D#$0A;
for J:=1 to 3 do
 begin
  for I:=1 to 3 do
   begin
    Result := Result + Format(' A%20.16f ',
 [A[(I-1)+(J-1)*3].re,A[(I-1)+(J-1)*3].im]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for J:=1 to 3 do
 begin
  for I:=1 to 3 do
   begin
    Result := Result + Format(' B%20.16f ',
 [B[(I-1)+(J-1)*3].re,B[(I-1)+(J-1)*3].im]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
N := 3;
M := 0;
AFG3C(A,B,Z,N,M);
Result := Result + Format('%s',[' PEЗYЛЬTAT']) + #$0D#$0A;
Result := Result + #$0D#$0A;
for J:=1 to 3 do
 begin
  for I:=1 to 3 do
   begin
    Result := Result + Format(' A%20.16f ',
 [A[(I-1)+(J-1)*3].re,A[(I-1)+(J-1)*3].im]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for J:=1 to 3 do
 begin
  for I:=1 to 3 do
   begin
    Result := Result + Format(' B%20.16f ',
 [B[(I-1)+(J-1)*3].re,B[(I-1)+(J-1)*3].im]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for J:=1 to 3 do
 begin
  for I:=1 to 3 do
   begin
    Result := Result + Format(' Z%20.16f ',
 [Z[(I-1)+(J-1)*3].re,Z[(I-1)+(J-1)*3].im]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' IERR']);
Result := Result + Format('%8d ',[IERR]) + #$0D#$0A;
UtRes('TAFG3C',Result);  { вывод результатов в файл TAFG3C.res }
exit;
end;

end.

Результаты:

               |   5.00000 + 0.0 i    1.03125 + 0.0 i      0.50000 + 0.0 i |
      A  =  |-13.75000 + 0.0 i    1.22056 + 0.0 i     -0.37500 + 0.0 i |
               |    0.0        + 0.0 i     0.40455 + 0.0 i    -0.07273 + 0.0 i |

               | 4.00000 + 0.0 i     0.56250 + 0.0 i     1.00000 + 0.0 i |
      B  =  | 0.0         + 0.0 i     2.57812 + 0.0 i    -0.75000 + 0.0 i |
               | 0.50000 + 0.0 i     0.0         + 0.0 i    -0.14545 + 0.0 i |

               | 1.0     + 0.0 i     0.0        + 0.0 i     0.0     + 0.0 i |
      Z  =  | 0.0     + 0.0 i     1.0         + 0.0 i     0.0     + 0.0 i |
               | 0.0     + 0.0 i     0.06250 + 0.0 i     1.0     + 0.0 i |