Текст подпрограммы и версий
aes1r_p.zip
Тексты тестовых примеров
taes1r_p.zip

Подпрограмма:  AES1R (модуль AES1R_p)

Назначение

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

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

Метод Ланцоша для заданной симметричной матрицы А порядка N и начального вектора v  ЕN ,  v ≠ 0 ,  строит последовательность векторов Ланцоша  v1, v2, ..., vj и последовательность трехдиагональных матриц  Т1, Т2, ..., Тj по следующим формулам процесса (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 

Подпрограмма AES1R использует следующее свойство метода Ланцоша: в спектре трехдиагональной матрицы Тj , полученной при выполнении достаточно большого числа j (j ~ 2N,...,6N) шагов алгоритма (1), появляются приближения ко всем различным собственным значениям исходной матрицы А.

В подпрограмме AES1R на шагах с номерами

       p = mi = M1 + (i - 1)*MH ,   i = 1, 2, ...,   (М1, МН - заданные числа) 

процесс (1) прерывается и вычисляются собственные значения матриц Тp. Для разделения собственных значений матриц Тp на "истинные" и "лишние" применяется критерий, использующий собственные значения матрицы Тp^ , получаемой из Тp вычеркиванием первой строки и первого столбца. Для истинных собственных значений матриц Тp вычисляются оценки точности.

Пусть Кj - число истинных собственных значений матрицы Тj , К'j - число истинных значений Тj , являющихся приближениями к собственным значениям матрицы А с точностью max { ЕРS, 10*j*ε }*|| А ||2, где ЕРS - заданная пользователем величина, ε - относительная машинная точность, || А ||2 - спектральная норма матрицы А.

Выход из подпрограммы AES1R происходит

1) при выполнении одного из соотношений

        K'p = Kp = Kp1 ,   K'p = N ;   ( где p1 = mi-1 ) 

2) по заданному ограничению на число шагов процесса (1);

3) если очередное вычисленное значение βj+1 очень мало;

4) если при работе подпрограммы AEE2R, используемой для вычисления собственных значений трехдиагональных матриц, произошла фатальная ошибка.

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

Сullum J., Donath W.Е. Lanczos and thе computation in specified_p intervals of thе spectrum of large, sparse real symmetric_p matrices. Sparse Мatrix Рroc., Кnoxville, Тen., 1978. Рhiladelphia, Pа, 1979, 220-255.

Х.Д. Икрамов. Разреженные матрицы. Математический анализ. Т. 20. (Итоги науки и техн. ВИНИТИ АН СССР). М., 1982.

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

procedure AES1R(N :Integer; var M0 :Integer; M1 :Integer;
                MH :Integer; M2 :Integer; var EPS0 :Real; FF :Proc_F4A;
                var VJ :Array of Real; var W :Array of Real;
                var B :Array of Real; var A :Array of Real;
                var NAC :Integer; var TETA :Array of Real;
                var TETA1 :Array of Real; var IR :Array of Integer;
                var IP :Integer);

Параметры

N - порядок исходной матрицы (тип: целый);
M0 - целочисленная переменная, содержащая на входе в подпрограмму число уже выполненых (при предыдущих обращениях к подпрограмме) шагов процесса (1), при этом процесс (1) будет продолжен, начиная с (М0+1) - го шага; при первом обращении к подпрограмме М0 = 0, на выходе из подпрограммы М0 содержит суммарное число выполненных шагов алгоритма (1);
M1 - задаваемый номер шага, на котором происходит первое прерывание процесса (1) (тип: целый);
MH - задаваемый промежуток между двумя последовательными прерываниями процесса (1) (тип: целый);
M2 - задаваемое максимальное число шагов процесса (1) (тип: целый);
EPS - вещественная переменная, содержащая на входе в подпрограмму требуемую относительную точность для вычисляемых собственных значений (под относительной точностью здесь подразумевается отношение абсолютной ошибки вычисленных приближенных собственных значений к спектральной норме матрицы А); на выходе из подпрограммы ЕРS = max { ЕРS, 10*М0*ε } , где ε - относительная машинная точность;
FF - имя подпрограммы вычисления W:  = (А - S*I) V - W ; первый оператор подпрограммы должен иметь вид:
 
procedure FF(var V :Array of Real; var W :Array of Real; N :Integer; S :Real);
Здесь:
V - заданный вещественный вектор длины N;
W - вещественный вектор длины N, содержащий на входе в подпрограмму заданный вектор, а на выходе из подпрограммы - вычисленный вектор (А - S*I) V - W ;
N - порядок матрицы А (тип: целый);
S - простая переменная (тип: вещественный);
VJ - вещественный вектор длины N, содержащий на входе в подпрограмму заданный начальный вектор; если VJ = 0, то в качестве начального будет взят вектор
V = (1., 1., ..., 1.)T;
W - вещественный вектор длины N, используемый как рабочий;
E - вещественный вектор длины 2*М2 + 1, содержащий в своих первых М2 + 1 компонентах, начиная со второй, вычисленные поддиагональные элементы трехдиагональной матрицы Т;
D - вещественный вектор длины М2, содержащий вычисленные диагональные элементы трехдиагональной матрицы Т;
L - число вычисленных собственных значений (тип: целый);
EV - вещественный вектор длины М2, в первых L (при L ≠ 0) компонентах которого на выходе из подпрограммы расположены в порядке возрастания вычисленные собственные значения;
ER - вещественный вектор длины М2, в I - ой компоненте которого, 1 ≤ I ≤ L , на выходе из подпрограммы содержится мантисса вычисленной оценки ошибки для ЕV (I);
IR - целочисленный вектор длины М2, в I - ой компоненте которого, 1 ≤ I ≤ L , на выходе из подпрограммы содержится двоичный порядок вычисленной оценки ошибки для ЕV (I);
IP - целочисленная переменная, содержащая на выходе из подпрограммы признак выхода, причем
IР = 0 ,  если  Кp = N;
IР = 1 ,  если  Кp = К'p = Кp1 < N ;
IР = 2 ,  если выполнено заданное число М2 шагов, а требуемая точность еще не достигнута;
IР = 3 ,  если получено слишком малое значение βj+1 , причем Кj < N ;
IР =-1 ,  если при использовании подпрограммы АЕЕ2R произошла фатальная ошибка.

Версии : нет

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

AEE2R - подпрограмма вычисления всех собственных значений симметричной трехдиагональной матрицы с помощью неявного QL - алгоpитма.

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

  1. 

Наименование подпрограммы, соответствующей формальному параметру FF, должно быть указано в операторе ЕХТЕRNАL в вызывающей подпрограмме.

  2. 

Подпрограмма FF должна сохранять вектор V.

  3. 

Если на выходе из подпрограммы IР = 2, то, обратившись к ней повторно, можно продолжить уже начатый процесс (1), указав число М0 выполненных шагов и задав новые значения М1, МН, М2, ЕРS; информация о выполненных шагах хранится в векторах Е, D, VJ, W.

  4. 

Если на выходе из подпрограммы IР = 1 или IР = 3, то K < N и, вообще говоря, нет гарантии, что вычислены все различные собственные значения, поэтому при IР = 1, 3 полезно обратиться к подпрограмме еще раз с другим начальным вектором.

  5. 

При IР = -1 повторное обращение к подпрограмме АЕS1R для продолжения процесса (1) невозможно.

  6.  Подпрограмма АV04R1 используется в качестве рабочей.

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

Unit TAES1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FAES1R_p, AES1R_p;

function TAES1R: String;

implementation

function TAES1R: String;
var
M0,I,K,IP :Integer;
EPS0 :Real;
W :Array [0..5] of Real;
B :Array [0..56] of Real;
ТЕТА :Array [0..27] of Real;
RR :Array [0..27] of Real;
A :Array [0..27] of Real;
IR :Array [0..27] of Integer;
const
VJ :Array [0..5] of Real = ( 1.0,1.0,1.0,1.0,1.0,1.0 );
begin
Result := '';  { результат функции }
EPS0 := 1.E-6;
M0 := 0;
AES1R(6,M0,4,4,28,EPS0,FAES1R,VJ,W,B,A,K,TETA,RR,IR,IP);
Result := Result + Format('%s',[' K,IP,M0 =']);
Result := Result + Format(' %4d  %4d %4d ',[K,IP,M0]) + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' TETA' + #$0D#$0A]);
for I:=1 to K do
 begin
  Result := Result + Format('%20.16f ',[TETA[I-1]]) + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' RR' + #$0D#$0A]);
for I:=1 to K do
 begin
  Result := Result + Format('%20.16f ',[RR[I-1]]) + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' IR' + #$0D#$0A]);
for I:=1 to K do
 begin
  Result := Result + Format('%5d ',[IR[I-1]]) + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TAES1R',Result);  { вывод результатов в файл TAES1R.res }
exit;
end;

end.

Результаты:

      K  =  6,  IP  =  0
      EV  =   (1., 2., 3., 4., 5., 6.)
      ER  =   (1., 1., 1., 1., 1., 1.)
      IR  =   (-12, -12, -12, -12, -12, -12)