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

Подпрограмма:  AGT0R (модуль AGT0R_p)

Назначение

Вычисление всех собственных значений и собственных вектоpов в обобщенной проблеме AV - 1x = λBV - 1 для вещественных верхней почти треугольной матрицы A, произвольной невырожденной матрицы V и верхней треугольной матрицы B с помощью QR - алгоритма.

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

Подпрограмма AGT0R вычисляет все собственные значения и собственные векторы обобщенной проблемы

     AV - 1x = λBV - 1x 

для вещественных верхней почти треугольной матрицы A, верхней треугольной матрицы B и произвольной невырожденной матрицы V с помощью QR - алгоритма. Матрицы A, B и V имеют размеры N на N.

Информация о вычисленных собственных значениях обобщенной проблемы выдается в вектоpах ALFR, ALFI, BETA длины N, по которым k - ое собственное значение λk определяется с помощью формулы:

      λk = ALFR(K) / BETA(K) + i ALFI(K) / BETA(K),  при BETA(K) ≠ 0,
(1)  λk = ∞                                                          , при BETA(K) = 0,
      λk = любое число                                        , при ALFR(K) = ALFI(K) = 
                                                                                    = BETA(K) = 0. 

Вычисленные собственные векторы Xk обобщенной проблемы помещаются на место матрицы V таким образом, что вещественному значению λk соответствует k - ый столбец Vk матрицы V, т.е. Xk = Vk, а паре комплексно - сопряженных собственных значений λk и λk+1 соответствуют столбцы Vk и Vk+1 матрицы V. При этом

     Xk = Vk + i Vk+1,    Xk+1 = Vk - i Vk+1.  

C.B.Moler, G.W.Stewart, An Algorithm for Generalized Matrix Eigenvalue Problems, SIAM J. Numer. Anal., 10, 1973.

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

procedure AGT0R(var A :Array of Real; var B :Array of Real;
                var V :Array of Real; var ALFR :Array of Real;
                var ALFI :Array of Real; var BETA :Array of Real;
                N :Integer; var IERR :Integer);

Параметры

A, B - вещественные двумерные массивы размера N на N, содержащие соответственно верхнюю почти треугольную и верхнюю треугольную матрицы;
V - вещественный двумерный массив размера N на N, содержащий заданную невырожденную матрицу V; в результате работы подпрограммы в столбцах массива V содержатся вычисленные собственные векторы Xk таким образом, что вещественному собственному значению λk соответствует k - ый столбец Vk, т.е Xk = Vk, а паре комплексно - сопряженных собственных значений λk и λk+1 соответствуют два столбца Vk и Vk+1; при этом Xk = Vk + i Vk+1,  а  Xk+1 = Vk - i Vk+1;
  ALFR -
 ALFI  
  BETA  
вещественные векторы длины N, содержащие информацию о собственных значениях λk обобщенной проблемы; при этом собственные значения определяются формулой (1);
N - заданный порядок исходных матриц A, B и V (тип: целый);
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженых в ходе работы подпрограммы; значение IERR полагается равным J+128, где J - номеp собственного значения, для вычисления которого потребовалось более 30 итераций, при этом собственные значения с индексами J+1, ..., N вычислены правильно, а с индексами 1, ..., J и собственные векторы могут быть вычислены не точно.

Версии : нет

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

UTAG10 - подпрограмма выдачи диагностических сообщений при работе подпрограммы AGT0R.

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

  1. 

Подпрограмма AGT0R не сохраняет исходную информацию.

  2. 

B массиве V должна задаваться единичная матрица, если решается обобщенная проблема Ax = λBx для вещественных верхней почти треугольной матрицы A и верхней треугольной матрицы B.

  3.  Вычисленные собственные векторы нормализованы так, что наибольшая компонента по модулю pавна 1.

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

Unit TAGT0R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFG3R_p, AGT0R_p;

function TAGT0R: String;

implementation

function TAGT0R: String;
var
J,I,N,M,IERR :Integer;
ALFR :Array [0..2] of Real;
ALFI :Array [0..2] of Real;
ВЕТА :Array [0..2] of Real;
V :Array [0..8] of Real;
const
A :Array [0..8] of Real = ( 1.0,-10.0,5.0,0.5,2.0,1.0,0.0,0.0,0.5 );
B :Array [0..8] of Real = ( 0.5,3.0,4.0,0.0,3.0,0.5,0.0,0.0,1.0 );
begin
Result := '';  { результат функции }
Result := Result + Format('%s',
 [' ОПРЕДЕЛЕНИЕ СОБСТВЕННЫХ ЗНАЧЕНИЙ И СОБСТВЕННЫХ BEKTOPOB' + #$0D#$0A +
 ' YРАВНЕНИЯ BИДA:AX=ЛЯMБДA*BX, ГДЕ A - ВЕЩЕСТВЕННАЯ ВЕРХНЯЯ ПOЧTИ' + #$0D#$0A +
 ' TPEYГОЛЬНАЯ MATPИЦA, B - ВЕЩЕСТВЕННАЯ BEPXHETPEYГОЛЬНАЯ MATPИЦA']) + #$0D#$0A; 
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' A' + #$0D#$0A]);
for I:=1 to 3 do
 begin
  for J:=1 to 3 do
   begin
    Result := Result + Format(' %20.16f ',[A[(I-1)+(J-1)*3]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' B' + #$0D#$0A]);
for I:=1 to 3 do
 begin
  for J:=1 to 3 do
   begin
    Result := Result + Format(' %20.16f ',[B[(I-1)+(J-1)*3]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
N := 3;
M := 0;
AFG3R(A,B,V,N,M);
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' A' + #$0D#$0A]);
for I:=1 to 3 do
 begin
  for J:=1 to 3 do
   begin
    Result := Result + Format(' %20.16f ',[A[(I-1)+(J-1)*3]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' B' + #$0D#$0A]);
for I:=1 to 3 do
 begin
  for J:=1 to 3 do
   begin
    Result := Result + Format(' %20.16f ',[B[(I-1)+(J-1)*3]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' V' + #$0D#$0A]);
for I:=1 to 3 do
 begin
  for J:=1 to 3 do
   begin
    Result := Result + Format(' %20.16f ',[V[(I-1)+(J-1)*3]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
AGT0R(A,B,V,ALFR,ALFI,BETA,N,IERR);
Result := Result + Format('%s',[' PEЗYЛЬTAT' + #$0D#$0A]) + #$0D#$0A; 
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' A' + #$0D#$0A]);
for I:=1 to 3 do
 begin
  for J:=1 to 3 do
   begin
    Result := Result + Format(' %20.16f ',[A[(I-1)+(J-1)*3]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' B' + #$0D#$0A]);
for I:=1 to 3 do
 begin
  for J:=1 to 3 do
   begin
    Result := Result + Format(' %20.16f ',[B[(I-1)+(J-1)*3]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' ALFR' + #$0D#$0A]);
for I:=1 to 3 do
 begin
  Result := Result + Format('%20.16f ',[ALFR[I-1]]) + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' ALFI' + #$0D#$0A]);
for I:=1 to 3 do
 begin
  Result := Result + Format('%20.16f ',[ALFI[I-1]]) + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' BETA' + #$0D#$0A]);
for I:=1 to 3 do
 begin
  Result := Result + Format('%20.16f ',[BETA[I-1]]) + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' V' + #$0D#$0A]);
for I:=1 to 3 do
 begin
  for J:=1 to 3 do
   begin
    Result := Result + Format(' %20.16f ',[V[(I-1)+(J-1)*3]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' IERR' + #$0D#$0A]);
Result := Result + Format('%3d ',[IERR]) + #$0D#$0A;
UtRes('TAGT0R',Result);  { вывод результатов в файл TAGT0R.res }
exit;
end;

end.

Результаты:

       IERR  =  0
       ALFR  =   ( 1.27052,   0.40869,   1.00306)
       ALFI   =   ( 3.03864,  -0.97744,   0.00000)
       BETA  =   ( 1.52462,   0.49043,   2.00612)

                | -0.25205   0.19169   0.00000 |
       V  =  | -0.08799  -0.72598   0.00000 |
                |  1.00000    0.00000   1.00000 |

Собственные значения
   λk  =   (ALFR(k) + i ALFI(k)) / BETA(k),  k  =  1, 2, 3:

   λ1  =  0.83333 + 1.9930i
   λ2  =  0.83333 - 1.9930i
   λ3  =  0.50000 + 0.0000i

Собственные векторы:

                | -0.25205 + 0.19169i |
      X1  =  | -0.08799 - 0.72598i |
                |  1.00000 + 0.00000i |

                 | -0.25205 - 0.19169i |
      X2  =  | -0.08799 + 0.72598i |
                 |  1.00000 - 0.00000i |

                 |  0.00000 + 0.00000i |
      X3  =  |  0.00000 + 0.00000i |
                 |  1.00000 + 0.00000i |