Текст подпрограммы и версий
aeb0r_p.zip , aeb0e_p.zip
Тексты тестовых примеров
taeb0r_p.zip , taeb0e_p.zip

Подпрограмма:  AEB0R (модуль AEB0R_p)

Назначение

Вычисление собственных значений и собственных векторов вещественной симметрической ленточной матрицы с помощью QL - алгоритма.

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

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

Дж.Х.Уилкинсон, Агебраическая проблема собственных значений, "Наука", М., 1970.

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

procedure AEB0R(N :Integer; MB :Integer; var A :Array of Real;
                var EV :Array of Real; var V :Array of Real;
                var RAB1 :Array of Real; var IERR :Integer);

Параметры

N - порядок исходной матрицы (тип: целый);
NC - заданное число кодиагоналей исходной матрицы, включая главную диагональ (тип: целый);
A - вещественный двумерный массив размера N*NС, в котором задается исходная симметричная ленточная матрица в компактной форме;
EV - вещественный вектор длины N, содержащий вычисленные в возрастающем порядке собственные значения;
V - вещественный двумерный массив размерности N на N, содержащий вычисленные ортонормированные собственные векторы исходной матрицы;
RAB - вещественный вектор длины N, используемый как рабочий;
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом значение IЕRR полагается равным номеру собственного значения, для вычисления которого потребовалось более 30 итераций; в этом случае будут вычислены правильно, но не упорядочены, собственные значения с индексами  1, 2,  ..., IЕRR - 1 и соответствующие собственные векторы.

Версии

AEB0E - вычисление собственных значений и собственных векторов вещественной симметрической ленточной матрицы с помощью QL - алгоритма с расширенной (Extended) точностью.

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

UTAE10 - подпрограмма выдачи диагностических сообщений при работе подпрограмм АЕВ0R, AEB0E.

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

 

Подпрограммы АЕВ0R, AEB0E не сохраняют исходную ленточную матрицу, но в последних двух столбцах массива А запоминается ее трехдиагональная форма.

  В подпрограмме AEB0E параметры A, V, EV, RAB имеют тип Extended .

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

Unit TAEB0R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AEB0R_p;

function TAEB0R: String;

implementation

function TAEB0R: String;
var
I,NC,N,_i,IERR :Integer;
A :Array [0..20] of Real;
EV :Array [0..6] of Real;
V :Array [0..48] of Real;
RАВ :Array [0..6] of Real;
label
_11;
begin
Result := '';  { результат функции }
for I:=1 to 7 do
 begin
  A[(I-1)+14] := Power(10.0,7-I);
  A[(I-1)+7] := 10.0;
_11:
  A[(I-1)+0] := 1.0;
 end;
NC := 3;
N := 7;
AEB0R(N,NC,A,EV,V,RAB,IERR);
Result := Result + #$0D#$0A;
for _i:=0 to 20 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 + Format('%s',['      IERR=']);
Result := Result + Format('%2d ',[IERR]) + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 6 do
 begin
  Result := Result + Format('%20.16f ',[EV[_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 48 do
 begin
  Result := Result + Format('%20.16f ',[V[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TAEB0R',Result);  { вывод результатов в файл TAEB0R.res }
exit;
end;

end.

Результаты:

Собственные значения:

                   | -5.6722919995E+00 |
                   |  1.5530623348E+01 |
                   |  1.0102923192E+02 |
        EV  =  |  1.0001011975E+03 |
                   |  1.0000010098E+04 |
                   |  1.0000000100E+05 |
                   |  1.0000000001E+06 |

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

                    |  4.60241432E-12 |                  | -1.01658674E-11 |
                    | -6.19409164E-10 |                  | -3.23048617E-09 |
                    | -4.59624634E-6   |                  |  1.01980144E-05 |
         V1  =  |  1.07906847E-4  |  ,      V2  =  |  2.21018403E-04 |  , 
                    |  4.49094723E-2  |                    | -1.04031614E-01 |
                    | -5.57567694E-1  |                    |  8.22631335E-01 |
                    |  8.28915795E-1  |                    |  5.58976743E-01 |

                    |  8.78765679E-11 |                         |  1.21337184E-09 |
                    |  1.20773046E-07 |                         | -9.98803192E-06 |
                    | -8.90754203E-05 |                         | -1.11227803E-03 |
         V3  =  | -1.11743497E-02 |  ,            V4  =  |  9.99936917E-01 |  , 
                    |  9.93497270E-01 |                         |  1.11204209E-02 |
                    |  1.11331459E-01 |                         |  1.12247594E-03 |
                    |  2.10619612E-02 |                         |  2.23652822E-05 |

                    | -1.00897793E-06 |                         | -1.11112345E-05 |
                    | -1.11123288E-04 |                         |  9.99999994E-01 |
                    |  9.99999371E-01 |                         |  1.11112108E-04 |
         V5  =  |  1.11121032E-03 |  ,            V6  =  |  1.01122336E-05 |  , 
                    |  1.02132585E-04 |                         |  2.12447903E-09 |
                    |  2.13477306E-07 |                         |  1.01344920E-10 |
                    |  1.04277680E-08 |                         |  3.13795946E-14 |

                    |  1.00000000E+00 |
                    |  1.11111223E-05 |
                    |  1.01021324E-06 |
         V7  =  |  2.12344994E-11 |  , 
                    |  1.01052664E-12 |
                    |  3.13400892E-17 |
                    |  1.01084105E-18 |

         IERR  =  0