Текст подпрограммы и версий
aeb1r_p.zip , aeb1e_p.zip
Тексты тестовых примеров
taeb1r_p.zip , taeb1e_p.zip

Подпрограмма:  AEB1R (модуль AEB1R_p)

Назначение

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

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

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

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

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

procedure AEB1R(N :Integer; MB :Integer; var A :Array of Real;
                var EV :Array of Real; var RAB :Array of Real;
                var IERR :Integer);

Параметры

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

Версии

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

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

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

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

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

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

Unit TAEB1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AEB1R_p;

function TAEB1R: String;

implementation

function TAEB1R: String;
var
I,NC,N,_i,IERR :Integer;
A :Array [0..20] of Real;
EV :Array [0..6] of Real;
RАВ :Array [0..13] 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;
AEB1R(N,NC,A,EV,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;
UtRes('TAEB1R',Result);  { вывод результатов в файл TAEB1R.res }
exit;
end;

end.

Результаты:

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

                  | -5.67229125355E+00 |
                  |  1.55306255671E+01 |
                  |  1.01029233155E+02 |
       EV  =  |  1.00010119681E+03 |
                  |  1.00000101005E+04 |
                  |  1.00000001008E+05 |
                  |  1.00000000011E+06 |

       IERR  =  0