Текст подпрограммы и версий
aej2r_p.zip , aej2e_p.zip
Тексты тестовых примеров
taej2r_p.zip , taej2e_p.zip

Подпрограмма:  AEJ2R (модуль AEJ2R_p)

Назначение

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

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

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

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

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

procedure AEJ2R(N :Integer; var A :Array of Real;
                var EV :Array of Real; var RAB1 :Array of Real;
                var IERR :Integer);

Параметры

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

Версии

AEJ2E - вычисление всех собственных значений вещественной матрицы Якоби с расширенной (Extended) точностью. Массивы А,ЕV, RАВ имеют тип Extended.

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

UTAE10 - подпрограмма выдачи диагностических сообщений при работе подпрограмм АЕJ2R и АЕJ2E.

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

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

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

Unit TAEJ2R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AEJ2R_p;

function TAEJ2R: String;

implementation

function TAEJ2R: String;
var
J,I,_i,IERR :Integer;
EV :Array [0..4] of Real;
RАВ :Array [0..9] of Real;
const
A :Array [0..14] of Real = ( 0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
1.0,1.0,0.0 );
begin
Result := '';  { результат функции }
Result := Result + #$0D#$0A;
Result := Result + Format('%s',
 [' ВСЕ СОБСТВЕННЫЕ ЗНАЧЕНИЯ ВЕЩЕСТВЕННОЙ  МАТРИЦЫ ЯKOБИ' + #$0D#$0A +
 ' A' + #$0D#$0A]);
for I:=1 to 5 do
 begin
  for J:=1 to 3 do
   begin
    Result := Result + Format('%20.16f ',[A[(I-1)+(J-1)*5]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
AEJ2R(5,A,EV,RAB,IERR);
Result := Result + Format('%s',[' PEЗYЛЬTAT']) + #$0D#$0A; 
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' A' + #$0D#$0A]);
for I:=1 to 5 do
 begin
  for J:=1 to 3 do
   begin
    Result := Result + Format('%20.16f ',[A[(I-1)+(J-1)*5]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' EV' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for _i:=0 to 4 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 + Format('%s',[' IERR' + #$0D#$0A]);
Result := Result + Format('%8d ',[IERR]) + #$0D#$0A;
UtRes('TAEJ2R',Result);  { вывод результатов в файл TAEJ2R.res }
exit;
end;

end.

Результаты:

      EV(1)  =  -1.7320508 , 
      EV(2)  =  -1.0 , 
      EV(3)  =  6.28*10-12 , 
      EV(4)  =  1.0 , 
      EV(5)  =  1.7320508 ;

      IERR  =  0