Текст подпрограммы и версий aeb6r_p.zip , aeb6e_p.zip |
Тексты тестовых примеров taeb6r_p.zip , taeb6e_p.zip |
Вычисление нескольких собственных векторов, соответствующих заданным собственным значениям, для симметричной ленточной матрицы, заданной в компактной форме.
Подпрограмма AEB6R по заданным собственным значениям вычисляет соответствующие собственные векторы симметричной ленточной матрицы с помощью метода обратных итераций. Возникающие в методе обратных итераций системы
( A - λ I ) x = y ,
где А - симметричная ленточная матрица, решаются методом Гаусса с перестановками.
Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра. М.: "Машиностроение", 1976.
procedure AEB6R(NM :Integer; N :Integer; M1 :Integer; var B :Array of Real; var C :Array of Real; var EV :Array of Real; L :Integer; L0 :Integer; var V :Array of Real; var Z :Array of Real; var W :Array of Real; var LOG :Array of Boolean; var IERR :Integer);
Параметры
NM - | число строк двумерного массива B, указанное при описании этого массива в вызывающей подпрограмме (тип: целый); |
N - | порядок исходной матрицы, N ≤ NМ (тип: целый); |
M - | число нижних ненулевых кодиагоналей исходной симметричной ленточной матрицы (включая главную диагональ) (тип: целый); |
B - | вещественный двумерный массив размерности NМ * М, в первых N строках которого задана исходная симметричная ленточная матрица в компактной форме (см. Организация Библиотеки. Способы представления матриц специального вида); |
C - | вещественный рабочий двумерный массив размерности N * (2М - 1); |
EV - | вещественный вектор длины L, содержащий собственные значения, для которых должны быть вычислены собственные векторы, при L0 > 0 для первых L0 собственных значений собственные векторы задаются пользователем; |
L - | число заданных собственных значений (тип: целый); |
L0 - | число собственных значений, собственные векторы для которых уже известны и задаются на входе в подпрограмму, L0 < L (тип: целый); |
V - | вещественный двумерный массив размерности NМ * L, содержащий на входе в подпрограмму в своих первых L0 столбцах ортонормированные собственные векторы, соответствующие собственным значениям, расположенным в первых L0 компонентах вектора EV, а на выходе из подпрограммы - L ортонормированных собственных векторов, соответствующих заданным собственным значениям; |
Z - | вещественный рабочий вектор длины N; |
W - | вещественный рабочий двумерный массив размерности N * М; |
LOG - | логический рабочий двумерный массив размерности N * М; |
IERR - | целочисленная переменная, содержащая на входе признак задания пользователем начального приближения к искомым собственным векторам, при этом: |
IERR=1 - | если пользователь сам задает в соответствующих столбцах массива V начальные приближения к собственным вектоpам; |
IERR=0 - | ecли пользователь не задает начальных приближений; |
а при выходе из подпрограммы: |
IERR=0 - | если вычислены все требуемые собственные векторы; |
IERR=К - | если при вычислении собственного вектора с индексом К ни один из векторов, используемых в качестве начальных, не позволил получить приемлемого приближения; при этом компоненты К - ого столбца массива V полагаются равными нулю; если таких собственных векторов было несколько, то значение IERR полагается равным индексу последнего из них. |
Версии
AEB6E - | вычисление нескольких собственных векторов, соответствующих заданным собственным значениям, для симметричной ленточной матрицы, заданной в компактной форме и с расширенной (Extended) точностью. |
Вызываемые подпрограммы
AV04R - AV04E | вычисление скалярного произведения; |
AV02R - AV02E | вычисление евклидовой нормы вектора. |
Замечания по использованию
1. |
Подпpогpамма AEВ6R сохpаняет исходный массив В; | |
2. |
В подпpогpамме AEВ6E паpаметpы B, C, EV, V, Z, W имеют тип Extended; | |
3. |
Если начальное приближение, заданное пользователем, окажется неудачным, то подпрограмма AEB6R продолжит работу с новым начальным вектором; | |
4. |
При повторном обращении к подпрограмме можно задать уже вычисленные L0 собственных векторов в первых столбцах массива V, тогда подпрограмма AEB6R, вычисляя новые собственные векторы, обеспечит их ортогональность по отношению к заданным. Это важно, если среди новых и старых собственных значений имеются близкие, так как сам по себе метод обратных итераций не гарантирует ортогональность собственных векторов, соответствующих близким собственным значениям, и требуется дополнительная ортогонализация; | |
5. | Собственные значения, задаваемые в компонентах вектора EV, могут не быть упорядочены. |
Unit TAEB6R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, AEB6R_p; function TAEB6R: String; implementation function TAEB6R: String; var N,NM,M,L,IERR,L0,J,I,_i :Integer; C :Array [0..24] of Real; V :Array [0..9] of Real; Z :Array [0..4] of Real; W :Array [0..9] of Real; LOG :Array [0..9] of Boolean; const B :Array [0..14] of Real = ( 0.0,0.0,4.0,0.0,4.0,0.0,3.0,3.0,3.0,3.0,5.0, 3.25,1.0,4.25,6.0 ); EV :Array [0..1] of Real = ( 1.0,2.0 ); begin for _i:=0 to 9 do LOG[_i] := FALSE; //начальные значения Result := ''; { результат функции } N := 5; NМ := 5; M := 3; L := 2; IERR := 0; L0 := 0; AEB6R(NM,N,M,B,C,EV,L,L0,V,Z,W,LOG,IERR); Result := Result + Format('%s',[' V' + #$0D#$0A]); for I:=1 to N do begin for J:=1 to 2 do begin Result := Result + Format('%20.16f ', [V[(I-1)+(J-1)*5]]) + #$0D#$0A; end; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[' IERR']); Result := Result + Format('%5d ',[IERR]) + #$0D#$0A; UtRes('TAEB6R',Result); { вывод результатов в файл TAEB6R.res } exit; end; end. Результаты: IERR = 0 , | - 0.6 1.E - 11 | | 0.8 5.E - 12 | | 1.E - 11 8.E - 12 | | 2.E - 11 - 0.8 | | - 3.E - 11 0.6 |