Текст подпрограммы и версий aes0r_p.zip |
Тексты тестовых примеров taes0r_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
Метод Ланцоша может быть рассмотрен как реализация для спектральной задачи Az = λz метода проекций Ритца - Галеркина на последовательность подпространств Крылова
K( j ) = span { v1 , Av1, ... , Aj-1v1 } , j = 1, ..., N ,
при этом числа Ритца (собственные значения сужения оператора РjА на К ( j ), где Рj - ортогональный проектор на К ( j ) совпадают с собственными значениями Θi ( j ) , i = 1, ..., j матрицы Тj , получаемой на j - ом шаге метода Ланцоша, а векторы Ритца равны Vjsi( j ), где si( j ) - соответствующие Θi ( j ) собственные векторы Тj , а Vj - матрица, столбцами которой являются векторы Ланцоша v1, v2, ..., vj .
Полезной особенностью метода Ланцоша является то, что часто уже при j ~ 2√N крайние пары Ритца (Θi ( j ), Vjsi ( j )) оказываются хорошими приближениями к искомым крайним собственным парам матрицы А.
Метод Ланцоша использует исходную матрицу только в операциях умножения матрицы на вектор, поэтому информацию о матрице удобно задавать в виде подпрограммы умножения матрицы на вектор, в которой пользователь может максимально учесть специфику матрицы.
В подпрограмме AES0R используется метод Ланцоша с выборочной ортогонализацией - устойчивая к ошибкам округления модификация простого метода Ланцоша, отличающаяся от него тем, что на некоторых шагах процесса (1) проводится ортогонализация wj+1 относительно некоторых векторов Ритца.
В подпрограмме AES0R метод Ланцоша используется как итерационный: после выполнения заданного числа М шагов процесс (1) прерывается (заканчивается один крупный шаг) и, если вычислены еще не все требуемые векторы, то строится новый начальный вектор (линейная комбинация крайних векторов Ритца, точность которых еще не является удовлетворительной) и процесс (1) начинается заново (начинается следующий крупный шаг).
В подпрограмме AES0R предполагается, что спектральная норма || А ||2 ~ 1 . Гарантированной точностью по невязке для вычисляемых собственных пар является величина k√ε || А ||2 , где ε - относительная машинная точность, k ~ 1 , но часто возможно получение лучшей точности.
Выход из подпрограммы происходит, когда все требуемые собственные пары будут вычислены с точностью ЕРS по невязке, где ЕРS задаваемая величина, или по заданному максимально допустимому числу NI крупных шагов.
Б. Парлетт. Симметричная проблема собственных значений. Численные методы. М.: Мир, 1983.
procedure AES0R(N :Integer; KL :Integer; KR :Integer; var KL0 :Integer; var KR0 :Integer; M :Integer; var NI :Integer; var VJ :Array of Real; FF :Proc_F4A; EPS :Real; L :Integer; var R :Array of Real; var EV :Array of Real; var Y :Array of Real; var ER :Array of Real; var IP :Integer);
Параметры
N - | порядок исходной матрицы (тип: целый); |
KL, KR - | задаваемые соответственно число наименьших и число наибольших вычисляемых собственных значений и соответствующих собственных векторов (тип: целый); |
KL0 - KR0 | целочисленные переменные, содержащие на входе в подпрограмму соответственно число наименьших и число наибольших уже вычисленных (c точностью по невязке) собственных значений и соответствующих собственных векторов; при первом обращении к АЕS0R нужно положить КL0 = 0, КR0 = 0, на выходе из подпрограммы значения КL0 и КR0 имеют тот же смысл, но с учетом собственных значений и векторов, полученных в результате работы подпрограммы; |
M - | задаваемое максимальное число шагов алгоритма в одном крупном шаге (тип: целый); |
NI - | целочисленная переменная, содержащая на входе в подпрограмму максимальное число крупных шагов алгоритма, а на выходе из подпрограммы - число выполненных крупных шагов; |
VJ - | вещественный вектор длины N, содержащий на входе в подпрограмму задаваемый начальный вектор; если вектор VJ задан нулевым, то в качестве начального вектора будет использован вектор (1, 1, ..., 1)T ; |
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 - | простая переменная (тип: вещественный); |
EPS - | задаваемая относительная точность вычисляемых собственных значений и соответствующих собственных векторов, оцениваемая по отношению нормы невязки к спектральной норме матрицы А (тип: вещественный); |
L - |
длина вектора R, указанная в операторе
описания этого вектора в вызывающей подпрограмме
(тип: целый); L ≥ N*(М + КL + КR + 4) + М*(КL + КR + 14) + + 9*(КL + КR) + 37; |
R - | вещественный вектор длины L, используемый как рабочий; |
EV - | вещественный вектор длины КL + КR, содержащий на входе в подпрограмму при КL0 + КR0 > 0 в своих первых (КL0 + КR0) компонентах уже вычисленные собственные значения; на выходе из подпрограммы в первых компонентах вектора ЕV содержатся в порядке неубывания вычисленные наименьшие собственные значения, А в последних КR компонентах в порядке невозрастания - вычисленные наибольшие собственные значения; |
Y - | двумерный вещественный массив размерности N на (КL + КR), содержащий на входе в подпрограмму при КL0 + КR0 ≠ 0 в своем I - ом столбце, 1 ≤ I ≤ КL0 + КR0 , нормированный собственный вектор, соответствующий входному значению ЕV(I), а на выходе из подпрограммы в I - ом столбце, 1 ≤ I ≤ КL + КR , содержится вычисленный нормированный собственный вектор, соответствующий выходному значению ЕV (I); |
ER - | вещественный вектор длины КL + КR, в I - ой компоненте которого содержится невязка || АyI - ЕV (I) * yI || , соответствующая вектору yI , расположенному в I - ом столбце массива Y ; при этом входные значения ЕR (I) должны соответствовать входным значениям yI и ЕV (I) , а выходные значения ЕR (I) соответствуют выходным значениям yI и ЕV (I) ; |
IP - | целочисленная переменная, содержащая на входе в подпрограмму признак тестового повтора, причем |
IР = 0 , | если повтор не нужен; |
IР = 1 , | если нужен; |
на выходе из подпрограммы IР содержит признак выхода из подпрограммы, причем |
IР = 0 , | если все требуемые собственные значения и соответствующие собственные векторы вычислены с заданной точностью и, если требовалось, то проведен тестовый повтор; |
IР = 1 , | если выполнено заданное число крупных шагов, а требуемая точность еще не достигнута; |
IР = 2 , | если заданное число собственных значений и соответствующих векторов вычислено с заданной точностью, но тестовый повтор не проведен; |
IР = 3 , | если требуемая точность не может быть достигнута; |
IР =-1 , |
если заданное значение параметра L не удовлетворяет неравенству L ≥ N*(М + КL + КR + 4) + М*(КL + КR + 14) + + 9*(КL + КR) + 37 . |
Версии : нет
Вызываемые подпрограммы
AM05R - | умножение прямоугольной матрицы на вектор. |
AV02R - | подпрограмма вычисления евклидовой нормы вектоpа. |
AV04R - | подпрограмма вычисления скалярного произведения. |
AV04A - | подпрограмма вычисления скалярного произведения в режиме накопления. |
AVZ6R - | подпрограмма упорядочивания вектора по возрастанию абсолютных значений его компонент с запоминанием произведенных перестановок. |
Замечания по использованию
1. |
Подпрограмма FF должна сохранять вектор V. | |
2. |
Если при первом обращении к АЕS0R не все требуемые собственные значения были вычислены с заданной точностью, то к АЕS0R можно обратиться повторно. При этом нужно задать КL0 (КR0) - число уже вычисленных с заданной точностью наименьших (наибольших) собственных значений, расположить в первых (КL0 + КR0) столбцах массива Y уже вычисленные с заданной точностью нормированные собственные векторы, в первых (КL0 + КR0) компонентах ЕV - соответствующие собственные значения, в первых компонентах R - соответствующие значения невязок. Тогда АЕS0R будет искать оставшиеся собственные векторы, не вычисляя повторно уже вычисленные. | |
3. | Подпрограммы АV04R1, АЕS0R0, АЕS0R1 используются в качестве рабочих. |
FAES0R - подпрограмма пользователя, вычисляющая W: = (A - S*I)V - W для A = diag (0., 1.E-5, 2.E-5, 3.E-5, 0.1, 1.)Unit TAES0R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, FAES0R_p, AES0R_p; function TAES0R: String; implementation function TAES0R: String; var KL0,KR0,IP,NI,_i,N :Integer; Y :Array [0..11] of Real; EV :Array [0..1] of Real; ER :Array [0..1] of Real; RАВ :Array [0..210] of Real; const VJ :Array [0..5] of Real = ( 1.0,1.0,1.0,1.0,1.0,1.0 ); begin Result := ''; { результат функции } KL0 := 0; KR0 := 0; IP := 0; NI := 1; AES0R(6,0,2,KL0,KR0,5,NI,VJ,FAES0R,1.E-6,211,RAB,EV,Y,ER,IP); 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; 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; Result := Result + Format(' %5d %5d ',[IP,NI]) + #$0D#$0A; N := 6; Result := Result + #$0D#$0A; for _i:=0 to 11 do begin Result := Result + Format('%20.16f ',[Y[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TAES0R',Result); { вывод результатов в файл TAES0R.res } exit; end; end. Результаты: EV = (1., 0.1) , ER = (2.2E-11, 2.2E-9) , IP = 0 , NI = 1 , Y1 = (-1.1E-11, 1.1E-11, 1.1E-11, -1.2E-11, -2.0E-13, 1.)T Y2 = (-1.1E-8, 1.1E-8, 1.1E-8, -1.1E-8, -1., 1.2E-10) .