Текст подпрограммы и версий
aes4r_p.zip , aes4e_p.zip
Тексты тестовых примеров
taes4r_p.zip , taes4e_p.zip

Подпрограмма:  AES4R (модуль AES4R_p)

Назначение

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

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

Метод Ланцоша для заданной симметричной матрицы А порядка N и начального вектора  v  EN,  v ≠ 0, строит последовательность векторов  v1, v2,..., vj и последовательность трехдиагональных матриц T1, T2,..., Tj по следующим формулам

(1)       v1 = v / (vTv)1/2  ,     β1 = 0  , 
            ui = Avi - βivi -1  ,     αi = uiTvi  , 

  T1 =  α1 ,                            i = 1 ,

           |               |   0  |
           |               |   .   |
  Ti =   |    Ti-1     |  0   |  ,          i > 1 ,
           | ______ |  βi  |
           | 0 ... 0  βi  αi  |

   wi +1 = ui - αivi ,    βi +1 = (wTi +1wi +1)1/2 ,

   vi +1 = wi +1 / βi +1  ,    i = 1,..., j 

Метод Ланцоша может быть рассмотрен как реализация для спектральной задачи Az = λz метода проекций Ритца - Галеркина на последовательность подпространств Крылова

     K( j )  =  span { v1,  Av1,... , Aj -1 v1 }   ,     j = 1,... , N   , 

при этом числа Ритца (собственные значения сужения оператора PjA на K ( j ), где Pj - ортогональный проект на K ( j ) ) совпадают с собственными значениями θi ( j ), i = 1,..., j, матрицы Tj, получаемой на  j - ом шаге метода Ланцоша, а векторы Ритца равны Vjsi ( j ), где  si ( j ) - соответствующие θi ( j ) собственные векторы Tj, а Vj - матрица, столбцами которой являются векторы Ланцоша  v1, v2,..., vj.

Полезной особенностью метода Ланцоша является то, что часто уже при  j ~ 2√N крайние пары Ритца ( θi ( j ), Vj sj ( j ) ) оказываются хорошими приближениями к искомым крайним собственным парам матрицы А.

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

В подпрограмме AES4R используется метод Ланцоша с выборочной ортогонализацией - устойчивая к влиянию ошибок округления модификация простого метода Ланцоша, отличающаяся от него тем, что на некоторых шагах процесса (1) проводится ортогонализация  wj + 1 относительно некоторых векторов Ритца.

В подпрограмме AES4R предполагается, что || A || 2 ~ 1, где || A || 2 - спектральная норма матрицы. Гарантированной точностью по невязке для вычисляемых собственных векторов является величина  k || A ||2√ε, где  ε - относительная машинная точность,  k ~ 1, но часто возможно получение лучшей точности.

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

Б.Парлетт. Симметричная проблема собственных значений. Численные методы. М.: Мир, 1983.

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

procedure AES4R(N :Integer; KL :Integer; KR :Integer;
                FF :Proc_F4A; EPS :Real; var M :Integer;
                var VJ :Array of Real; K :Integer; L :Integer;
                var R :Array of Real; var R1 :Array of Real;
                var R2 :Array of Real; var EV :Array of Real;
                var ER :Array of Real; var V :Array of Real;
                var Y :Array of Real; var IP :Integer);

Параметры

N - порядок исходной матрицы, (тип: целый);
KL, KR - задаваемые соответственно число наименьших и число наибольших собственных значений и соответствующих собственных векторов, которые требуется вычислить (тип: целый);
FF - имя подпрограммы вычисления   w : = ( A - sI ) v - w; первый оператор подпрограммы должен иметь вид:
 
     procedure FF(var V :Array of Real; var W :Array of Real; N :Integer; S :Real);
    Здесь:
V - заданный вещественный вектор длины N;
W - вещественный вектор длины N, содержащий на входе в подпрограмму заданный вектор, а на выходе из программы - вычисленный вектор ( A - sI ) V - W;
N - порядок матрицы А (тип: целый);
S - простая переменная (тип: вещественный);
EPS - заданная требуемая точность по невязке для вычисляемых собственных значений и соответствующих собственных векторов (тип: вещественный);
M - целая переменная, содержащая на входе в подпрограмму задаваемое максимальное число шагов алгоритма, а на выходе из подпрограммы - число выполненных шагов;
VJ - вещественный вектор длины N, содержащий на входе в подпрограмму заданный начальный вектор; если VJ = 0, то в качестве начального будет взят вектор  v1 = (1., 1., ... , 1.) T;
K - заданное максимальное число вычисляемых собственых значений и соответствующих собственных векторов матриц Tj,  K ≥ KL + KR + 2 (тип: целый);
L - длина рабочего вектора R (тип: целый), L ≥ M (K + 9) + 8K;
R - вещественный рабочий вектор длины L, использемый как рабочий;
R1, R2 - вещественные рабочие вектора длины N, используемые как рабочие;
EV - вещественный вектор длины (KL + KR), в первых KL компонентах которого на выходе из подпрограммы содержатся в порядке неубывания вычисленные KL наименьших собственных значений, а в последних KR компонентах в порядке невозрастания - KR наибольших собственных значений;
ЕR - вещественный вектор длины (KL + KR), содержащий невязки ER ( I ) = || AyI - ER ( I ) yI ||, где  yI = yI - вычисленный нормированный собственный вектор матрицы А соответствующий собственному значению ER ( I ),  1 ≤ I ≤ KL + KR;
V - вещественный двумерный массив размерности N * MMAX, в столбцах которого в ходе работы подпрограммы располагаются вычисленные векторы Ланцоша  v1, v2, ..., vMMAX;
Y - вещественный двумерный массив размерности N * K, в  I - ом, 1 ≤ I ≤ KL + KR, столбце которого на выходе из подпрограммы содержится вычисленный нормированный собственный вектор, соответствующий выходному значению EV ( I );
IP - простая целочисленная переменная, содержащая на входе в подпрограмму признак рещаемой задачи, при этом:
IP = 1 - если требуется выполнить ровно М шагов алгоритма;
IP = 0 - если допустим выход из программы при  j < M,  j - число выполненных шагов; в этом случае вычисления будут прекращены после того, как на некотором шаге  j  будет получено заданное число приближений к собственным парам матрицы А с заданной точностью;
  на выходе из подпрограммы IP содержит признак выхода, причем:
IP = -1 - если заданное значение параметра L не удовлетворяет неравенству L ≥ M * (9 + K) + 8K;
IP = -2 - если заданное значение параметра K не удовлетворяет неравенству K ≥ KL + KR + 2;
IP = -3 - если обе описанные выше ошибки имели место;
IP =  0 - если требуемые собственные значения и соответствующие собственные векторы вычислены с заданной точностью;
IP =  1 - если выполнено заданное число М шагов алгоритма, а заданная точность еще не достигнута;
IP =  2 - если на некотором шаге  j,  j < M, алгоритма потребовалось вычислить более К собственных пар матрицы Tj; в этом случае для продолжения процесса не хватает памяти;
IP =  3 - если заданная точность не может быть достигнута;
IP =  4 - если получено слишком малое значение  βj + 1;
IP =  5 - если резко возрастает объем работ по проведению выборочной ортогонализации.

Версии

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

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

AVZ6R - упорядочивание вектора по возрастанию его компонент с запоминанием произведенных перестановок;
AVZ2R - нахождение максимальной по модулю компоненты и ее индекса из всего вектора или из заданного подмножества компонент этого вектора;
AV02R - вычисление евклидовой нормы вектора;
AV04A - вычисление скалярного произведения в режиме накопления;
AM05R - вычисление произведения матрицы на вектор.

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

 
  1.  Подпpогpамма FF должна сохранять вектор V;
 
  2.  Если начальный вектор был выбран неудачно (имел нулевые составляющие вдоль направлений некоторых из искомых собственных векторов), то возможно, что вычисленные векторы не обязательно будут приближениями именно к тем собственным векторам, которые соответствуют первым KL и последним KR собственным значениям. Поэтому, вообще говоря, для проверки необходимо обратиться к АЕS4R с начальными векторами. Особенно это необходимо, если на выходе из программы IP = 4 или мало выходное значение параметра M;
 
  3.  Неудачный выбор начального вектора может привести к выходу из подпрограммы на шаге с номером  j < KL + KR по признаку IP = 4. В этом случае будут вычислены все  j  собственных пар, причем все  j  вычисленных собственных значений будут расположены в массиве EV в порядке неубывания. Понятно, что в этом случае повторное обращение к подпрограмме совершенно необходимо;
 
  4.  Если на выходе из подпрограммы IP < 0, то никакой информации об искомых собственных парах получено не будет; если же IP > 0, то на выходе из подпрограммы будут получены KL первых и KR последних пар Ритца, вычисленных на шаге прерывания (номер этого шага - выходное значение M), т.е. будут получены приближения к искомым собственным парам, хотя их точность и не является удовлетворительной. Эти приближения могут быть использованы для построения нового начального вектора и повторного обращения к AES4R;
 
  5.  Если на выходе из подпрограммы IP = 2, то необходимо увеличить значение параметра K и соответственно L. Рекомендации для выбора значения K, которые были бы удовлетворительными для любых матриц, не могут быть даны, т.к. требуемое значение K зависит от спектра исходной матрицы и равно числу пар Ритца, невязки которых станут величинами ~ || A || √ε к тому моменту, когда невязки для заданного числа крайних пар Ритца станут меньше EPS;
 
  7.  В подпpогpамме AES4E паpаметpы EPS, VJ, R, R1, R2, EV, ER, V, Y имеют тип Extended;
 
  8.  Подпpогpаммы AES4R1 (AES4E1), AES0R0 (AES0E0), AV04R1 (AV04E) используются в качестве рабочих;
 
  9.  В подпpогpамме FF паpаметpы V, W, S должны иметь тип Extended.

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

Unit TAES4R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FAES4R_p, AES4R_p;

function TAES4R: String;

implementation

function TAES4R: String;
var
M,IP,_i,J,I :Integer;
EV :Array [0..1] of Real;
ER :Array [0..1] of Real;
R :Array [0..96] of Real;
R1 :Array [0..5] of Real;
R2 :Array [0..5] of Real;
V :Array [0..29] of Real;
Y :Array [0..11] of Real;
const
VJ :Array [0..5] of Real = ( 1.0,1.0,1.0,1.0,1.0,1.0 );
label
_55;
begin
for _i:=0 to 96 do
 R[_I] := 0.0;  { РАБОЧИЙ МАССИВ }
ResULT := '';  { РЕЗУЛЬТАт функции }
M := 5;
IP := 0;
AES4R(6,0,2,FAES4R,1.E-3,M,VJ,4,97,R,R1,R2,EV,ER,V,Y,IP);
Result := Result + Format('%s',['  IP=']);
Result := Result + Format('%5d ',[IP]);
Result := Result + Format('%s',['   M=']);
Result := Result + Format('%5d ',[M]) + #$0D#$0A;
if ( IP < 0 )
 then goto _55;
Result := Result + Format('%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 + #$0D#$0A;
Result := Result + Format('%s',['  Y=C.B.' + #$0D#$0A]);
for I:=1 to 6 do
 BЕgin
  for J:=1 to 2 do
   begin
    Result := Result + Format('  %20.16f ',
 [Y[(I-1)+(J-1)*6]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',['  ER=' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for _i:=0 to 1 do
 begin
  Result := Result + Format('%20.16f ',[ER[_i]]);
  if ( ((_i+1) mod 2)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
_55:
UtRes('TAES4R',Result);  { вывод результатов в файл TAES4R.res }
exit;
end;

end.

Результаты:

         IP  =  0   ,     M  =  3
        
         Собственные значения:

         EV(1)  =  1.   ,     EV(2)  =  0.1
         
         Собственные векторы:  

                   |   5.E - 7           2.E - 4  |
                   | - 6.E - 7           5.E - 5  |
                   | - 2.E - 6         - 6.E - 5  |
         Y  =   | - 3.E - 6         - 2.E - 4  |
                   |   1.E - 6         - 1.          |
                   |   1.                   3.E - 6  |
                     
         Невязки:     ER(1)  =  4.E - 6   ,     ER(2)  =  2.E - 5