Текст подпрограммы и версий
aee8r_p.zip , aee8e_p.zip
Тексты тестовых примеров
taee8r_p.zip , taee8e_p.zip

Подпрограмма:  AEE8R (модуль AEE8R_p)

Назначение

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

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

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

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

Подпрограмма AEE8R определяет номера собственных значений матрицы Т, принадлежащих данному полуинтервалу (V, U), и производит вычисление этих собственных значений методом бисекций.

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

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

procedure AEE8R(var A :Array of Real; var B :Array of Real;
                N :Integer; var L :Real; var U :Real;
                var M1 :Integer; var M2 :Integer;
                var RU :Array of Real; var W :Array of Real);

Параметры

A - вещественный вектор длины N, содержащий диагональные элементы симметричной трехдиагональной матрицы;
B - вещественный вектор длины N, содержащий в последних N - 1 компонентах поддиагональные элементы симметричной трехдиагональной матрицы;
N - заданный порядок симметричной трехдиагональной матрицы (тип: целый);
V, U - соответственно нижняя и верхняя границы заданного полуинтервала (тип: вещественный);
M1, M2 - номера соответственно наименьшего и наибольшего собственных значений, принадлежащих данному полуинтервалу (тип: целый);
RU - вещественный вектор длины N, используемый как рабочий;
W - вектор длины N, с М1 - й по М2 - ю компоненту которого содержатся вычисленные собственные значения принадлежащие заданному полуинтервалу.

Версии

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

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

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

  1. 

Подпрограмма АЕЕ8R не сохраняет исходные векторы А и В.

  2. 

Если заданный полуинтервал не содержит ни одного собственного значения симметричной трехдиагональной матрицы, то подпрограмма АЕЕ8R присваивает М1 и М2 нулевые значения.

  3. 

В подпрограмме АЕЕ8E параметры А, В, V, U, RU, W должны иметь тип Extended.

  4.  Подпрограмма АЕЕ8R может быть использована для вычисления собственных значений комплексной эрмитовой трехдиагональной матрицы, принадлежащих данному полуинтервалу, и определения номеров этих собственных значений. Для этого нужно предварительно привести комплексную эрмитовую трехдиагональную матрицу к вещественной симметричной трехдиагональной матрице преобразованиями подобия (например, обратиться к подпрограмме АFЕ0С).
  5.  Подпрограмма АЕE8R использует служебную подпрограмму AMA1R.
Подпрограмма АЕE8E использует служебную подпрограмму AMA1E.

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

Unit TAEE8R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AEE8R_p;

function TAEE8R: String;

implementation

function TAEE8R: String;
var
N,_i,M1,M2 :Integer;
L,U :Real;
RU :Array [0..49] of Real;
W :Array [0..49] of Real;
const
A :Array [0..49] of Real = ( 1.0,49.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0 );
B :Array [0..49] of Real = ( 0.0,7.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0 );
begin
for _i:=0 to 49 do
 W[_i] := 0.0;  //начальное обнуление массива
Result := '';  { результат функции }
N := 50;
L := -2.0;
U := 7.0;
AEE8R(A,B,N,L,U,M1,M2,RU,W);
Result := Result + #$0D#$0A;
for _i:=0 to 49 do
 begin
  Result := Result + Format('%20.16f ',[W[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format(' %5d %5d ',[M1,M2]) + #$0D#$0A;
UtRes('TAEE8R',Result);  { вывод результатов в файл TAEE8R.res }
exit;
end;

end.

Результаты:

      M1  =  1,  M2  =  49 , 
      W(1)  =  W(2)  =  ...  =  W(49)  =  -1.34*10-11