Текст подпрограммы и версий aes1r_p.zip |
Тексты тестовых примеров taes1r_p.zip |
Вычисление всех различных собственных значений вещественной симметричной разреженной или имеющей регулярную структуру матрицы методом Ланцоша.
Метод Ланцоша для заданной симметричной матрицы А порядка 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)