Текст подпрограммы и версий
aeb2r_p.zip , aeb2e_p.zip
Тексты тестовых примеров
taeb2r_p.zip , taeb2e_p.zip

Подпрограмма:  AEB2R (модуль AEB2R_p)

Назначение

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

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

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

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

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

procedure AEB2R(N :Integer; MB :Integer; MM :Integer;
                var M :Integer; var RLB :Real; var RUB :Real;
                var A :Array of Real; var EV :Array of Real;
                var V :Array of Real; var IRAB1 :Array of Integer;
                var RAB1 :Array of Real; var RAB2 :Array of Real;
                var IERR :Integer);

Параметры

N - порядок исходной матрицы (тип: целый);
NC - заданное число кодиагоналей исходной матрицы, включая главную диагональ (тип: целый);
MM - оценка сверху числа собственных значений исходной матрицы, принадлежащих заданному интервалу (тип: целый); если фактическое число собственных значений М, принадлежащих заданному интервалу, больше, чем ММ, то собственные значения не вычисляются;
M - целая переменная, в которой запоминается вычисленное число собственных значений, принадлежащих заданному интервалу;
         RLB -
         RUB  
заданные нижняя и верхняя границы интервала собственных значений (тип: вещественный); если RLВ > RUВ, то собственные значения не вычисляются;
A - вещественный двумерный массив размера N*NC, в котором задается исходная симметричная ленточная матрица в компактной форме;
EV - вещественный вектор длины ММ, содержащий вычисленные в возрастающем порядке собственные значения;
V - вещественный двумерный массив размерности N на ММ, содержащий в своих первых М столбцах вычисленные ортонормированные собственные векторы;
IRAB - целый вектор длины ММ, содержащий индексы расположенных в возрастающем порядке М вычисленных собственных значений;
RAB1 - вещественный двумерный массив размерности N*NC, используемый как рабочий;
RAB2 - вещественный вектор длины N * (2*NС+4), используемый как рабочий;
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом значение IЕRR
  - равно 3*N+1, если значение ММ меньше истинного числа собственных значений М на интервале;
  - равно - К, если для вычисления собственного вектора с индексом К не нашлось ни одного начального вектора, обеспечивающего приемлемое приближение; при этом компоненты этого собственного вектора полагаются равными нулю. Если таких собственных векторов несколько, то значение IЕRR равно индексу последнего из них.

Версии

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

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

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

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

 

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

  В подпрограмме AEB2E параметры A, EV, V, RAB1, RAB2, RLB, RUB имеют тип Extended .

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

Unit TAEB2R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AEB2R_p;

function TAEB2R: String;

implementation

function TAEB2R: String;
var
MB,I,N,MM,M,IERR,J,_i :Integer;
RLB,RUB :Real;
A :Array [0..20] of Real;
V :Array [0..48] of Real;
EV :Array [0..6] of Real;
IRAB1 :Array [0..6] of Integer;
RAB1 :Array [0..20] of Real;
RAB2 :Array [0..69] of Real;
label
_1;
begin
Result := '';  { результат функции }
for I:=1 to 7 do
 begin
  A[(I-1)+14] := Power(10.0,7-I);
  A[(I-1)+7] := 10.0;
_1:
  A[(I-1)+0] := 1.0;
 end;
Result := Result + Format('%s',
 [' ВЫЧИСЛЕНИЕ НЕКОТОРЫХ СОБСТВЕННЫХ ЗНАЧЕНИЙ ' + #$0D#$0A +
 ' И СООТВЕТСТВУЮЩИХ СОБСТВЕННЫХ ВЕКТОРОВ' + #$0D#$0A +
 ' YРАВНЕНИЯ BИДA:AX=LAMBDA*X, ГДЕ A - ' + #$0D#$0A +
 ' ВЕЩЕСТВЕННАЯ СИММЕТРИЧЕСКАЯ ЛЕНТОЧНАЯ МАТРИЦА ']) + #$0D#$0A; 
N := 7;
МВ := 3;
ММ := 7;
RLB := -6.0;
RUB := IntPower(10.0,7);
AEB2R(N,MB,MM,M,RLB,RUB,A,EV,V,IRAB1,RAB1,RAB2,IERR);
Result := Result + Format('%s',[#$0D#$0A + ' PEЗУЛЬTAT']) + #$0D#$0A; 
Result := Result + Format('%s',[#$0D#$0A + ' EV' + #$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 + Format('%s',[#$0D#$0A + ' IERR' + #$0D#$0A]);
Result := Result + Format('%8d ',[IERR]) + #$0D#$0A;
Result := Result + Format('%s',[#$0D#$0A + ' V' + #$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('TAEB2R',Result);  { вывод результатов в файл TAEB2R.res }
exit;
end;

end.
  

Результаты:

Собственные значения в интервале (-6.E0, 10.E0**7)

                | -5.67228961584E+00 |
                |  1.55306282219E+01 |
                |  1.01029236853E+02 |
     EV  =  |  1.00010120030E+03 |
                |  1.00000101020E+04 |
                |  1.00000001010E+05 |
                |  1.00000000011E+06 |

Собственные векторы, соответствующие вычисленным в интервале ( - 6.E0, 10.E0**7) собственным значениям:

                | -0.4602311E-11 |                    |  1.0165937E-11 |
                |  6.1941045E-10 |                    |  3.2304868E-09 |
                |  4.5962454E-06 |                    | -1.0198015E-05 |
      V1  =  | -1.0790686E-04 |  ,      V2  =  | -2.2101839E-04 |  ,
                | -4.4909463E-02 |                    |  1.0403192E-01 |
                |  5.5756761E-01 |                    | -8.2263142E-01 |
                | -8.2891585E-01 |                    | -5.5897666E-01 |

                | -8.7876556E-11 |                    |  1.2133718E-09 |
                | -1.2077304E-07 |                    | -9.9880319E-06 |
                |  8.9075420E-05 |                    | -1.1122780E-03 |
      V3  =  |  1.1174350E-02 |  ,      V4  =  |  9.9993692E-01 |  ,
                | -9.9349727E-01 |                    |  1.1120421E-02 |
                | -1.1133146E-01 |                    |  1.1224759E-03 |
                | -2.1061961E-02 |                    |  2.2365282E-05 |

                | -1.0089779E-06 |                    |  1.1111235E-05 |
                | -1.1112329E-04 |                    | -9.9999999E-01 |
                |  9.9999937E-01 |                    | -1.1111211E-04 |
      V5  =  |  1.1112103E-03 |  ,      V6  =  | -1.0112234E-05 | ,
                |  1.0213258E-04 |                    | -2.1244794E-09 |
                |  2.1347731E-07 |                    | -0.1013453E-11 |
                |  1.0427767E-08 |                    | -3.1713216E-12 |
 
                |  1.0000000E+00 |
                |  1.1111122E-05 |      
                |  1.0102132E-06 |
      V7  =  |  2.1234289E-11 |  ,
                |  0.1010306E-11 |
                | -2.1027951E-16 |
                | -3.1713216E-14 |

      IERR  =  0