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