Текст подпрограммы и версий
aeb5r_p.zip , aeb5e_p.zip
Тексты тестовых примеров
taeb5r_p.zip , taeb5e_p.zip

Подпрограмма:  AEB5R (модуль AEB5R_p)

Назначение

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

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

Пусть все собственные значения заданной симметричной ленточной матрицы порядка N занумерованы в порядке неубывания

              λ1 ≤ λ2 ≤ ... ≤ λN-1 ≤ λN . 

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

Подпрограмма AEB5R позволяет вычислять различные собственные значения с различной точностью. Требуемая точность задается пользователем в специальном векторе.

Уилкинсон, Райнш. "Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра". М.: "Машиностроение", 1976.

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

procedure AEB5R(NM :Integer; N :Integer; M1 :Integer;
                var B :Array of Real; L1 :Integer; L2 :Integer;
                var EV :Array of Real; var EPS :Array of Real;
                var C :Array of Real);

Параметры

NM - число строк двумерного массива B, указанное при описании этого массива в вызывающей подпрограмме (тип: целый);
N - порядок исходной матрицы, N ≤ NМ (тип: целый);
M - число нижних ненулевых кодиагоналей исходной матрицы, включая главную диагональ (тип: целый);
B - вещественный двумерный массив размерности NМ * М, в первых N строках которого задана исходная симметричная ленточная матрица в компактной форме (см. Организация Библиотеки. Способы представления матриц специального вида);
L1, L2 - заданные минимальный и максимальный номера искомых собственных значений (тип: целый); возможны оба варианта: L1 ≤ L2 и L1 ≥ L2 (см. описание параметра EV);
EV - вещественный вектор длины | L2 - L1 | + 1, содержащий на выходе из подпрограммы вычисленные собственные значения; при этом, если L1 < L2, то собственные значения располагаются в порядке неубывания, а если L2 < L1, то - в порядке невозрастания;
EPS - вещественный вектор длины | L2 - L1 | + 1, в компонентах которого пользователем задаются значения допустимых погрешностей для соответствующих вычисляемых собственных значений;
C - вещественный двумерный рабочий массив размерности M * min (2М - 1, N).

Версии

AEB5E - вычисление методом бисекции по заданным номерам группы подряд идущих собственных значений симметричной ленточной матрицы, заданной в компактной форме и с расширенной (Extended) точностью.

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

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

  1. 

В подпpогpамме AEВ5E паpаметpы B, EV, EPS, C имеют тип Extended;

  2. 

Подпpогpамма AEВ5R (AEB5E) сохpаняет исходный массив В;

  3. 

При работе подпрограммы слишком малые компоненты вектора EPS будут увеличены;

  4. 

Так как подпрограмма AEB5R применяет метод бисекции непосредственно к ленточной матрице, то ее рекомендуется использовать только, если ширина ленты невелика и число искомых собственных значений достаточно мало, точнее, если выполнно неравенство

                                            L
           N  >  0.25 (M - 1)    ∑    r i ,
                                          i =1 
где L = | L2 - L1 | + 1,  ri = - log2 (EPS ( I ) / || A || ),  || A || - спектральная норма исходной матрицы А. В противном случае выгоднее исходную матрицу привести к трехдиагональному виду и применять метод бисекции к трехдиагональной матрице.

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

Unit TAEB5R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AEB5R_p;

function TAEB5R: String;

implementation

function TAEB5R: String;
var
N,NM,M,L1,L2,_i :Integer;
C :Array [0..14] of Real;
EV :Array [0..1] of Real;
const
B :Array [0..14] of Real = ( 0.0,0.0,4.0,0.0,4.0,0.0,3.0,3.0,3.0,3.0,5.0,
3.25,1.0,4.25,6.0 );
EPS :Array [0..1] of Real = ( 1.E-5,1.E-5 );
begin
Result := '';  { результат функции }
N := 5;
NM := 5;
M := 3;
L1 := 2;
L2 := 3;
AEB5R(NМ,N,М,В,L1,L2,ЕV,ЕРS,С);
ResULT := RЕSULT + FОRMАT('%s',['  EV' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for _i:=0 to 1 do
 begin
  Result := Result + Format('%20.16f ',[EV[_i]]);
  if ( ((_i+1) mod 2)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',['  EPS' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for _i:=0 to 1 do
 begin
  Result := Result + Format('%20.16f ',[EPS[_i]]);
  if ( ((_i+1) mod 2)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TAEB5R',Result);  { вывод результатов в файл TAEB5R.res }
exit;
end;

ЕND.

Результаты:

               EV  =  ( .10000000E+01, .20000000E+01 )

              EPS  =  ( .10E-04, .10E-04 )