Текст подпрограммы и версий aeb5r_p.zip , aeb5e_p.zip |
Тексты тестовых примеров taeb5r_p.zip , taeb5e_p.zip |
Вычисление методом бисекции по заданным номерам группы подряд идущих собственных значений вещественной симметричной ленточной матрицы, заданной в компактной форме.
Пусть все собственные значения заданной симметричной ленточной матрицы порядка N занумерованы в порядке неубывания
λ1 ≤ λ2 ≤ ... ≤ λN-1 ≤ λN .
Подпрограмма AEB5R вычисляет группу подряд идущих собственных значений заданной матрицы по заданным номерам (задаются номера минимального и максимального собственных значений из искомой группы) с помощью метода бисекции, применяемого непосредственно к ленточной матрице.
Подпрограмма AEB5R позволяет вычислять различные собственные значения с различной точностью. Требуемая точность задается пользователем в специальном векторе.
Уилкинсон, Райнш. "Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра". М.: "Машиностроение", 1976.
procedure AEB5R(NM :Integer; N :Integer; M1 :Integer; var B :Array of Real; L1 :Integer; L2 :Integer; var EV :Array of Real; var EPS :Array of Real; var C :Array of Real);
Параметры
NM - | число строк двумерного массива B, указанное при описании этого массива в вызывающей подпрограмме (тип: целый); |
N - | порядок исходной матрицы, N ≤ NМ (тип: целый); |
M - | число нижних ненулевых кодиагоналей исходной матрицы, включая главную диагональ (тип: целый); |
B - | вещественный двумерный массив размерности NМ * М, в первых N строках которого задана исходная симметричная ленточная матрица в компактной форме (см. Организация Библиотеки. Способы представления матриц специального вида); |
L1, L2 - | заданные минимальный и максимальный номера искомых собственных значений (тип: целый); возможны оба варианта: L1 ≤ L2 и L1 ≥ L2 (см. описание параметра EV); |
EV - | вещественный вектор длины | L2 - L1 | + 1, содержащий на выходе из подпрограммы вычисленные собственные значения; при этом, если L1 < L2, то собственные значения располагаются в порядке неубывания, а если L2 < L1, то - в порядке невозрастания; |
EPS - | вещественный вектор длины | L2 - L1 | + 1, в компонентах которого пользователем задаются значения допустимых погрешностей для соответствующих вычисляемых собственных значений; |
C - | вещественный двумерный рабочий массив размерности M * min (2М - 1, N). |
Версии
AEB5E - | вычисление методом бисекции по заданным номерам группы подряд идущих собственных значений симметричной ленточной матрицы, заданной в компактной форме и с расширенной (Extended) точностью. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпpогpамме AEВ5E паpаметpы B, EV, EPS, C имеют тип Extended; | |
2. |
Подпpогpамма AEВ5R (AEB5E) сохpаняет исходный массив В; | |
3. |
При работе подпрограммы слишком малые компоненты вектора EPS будут увеличены; | |
4. |
Так как подпрограмма AEB5R применяет метод бисекции непосредственно к ленточной матрице, то ее рекомендуется использовать только, если ширина ленты невелика и число искомых собственных значений достаточно мало, точнее, если выполнно неравенство L N > 0.25 (M - 1) ∑ r i , i =1где L = | L2 - L1 | + 1, ri = - log2 (EPS ( I ) / || A || ), || A || - спектральная норма исходной матрицы А. В противном случае выгоднее исходную матрицу привести к трехдиагональному виду и применять метод бисекции к трехдиагональной матрице. |
Unit TAEB5R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, AEB5R_p; function TAEB5R: String; implementation function TAEB5R: String; var N,NM,M,L1,L2,_i :Integer; C :Array [0..14] of Real; EV :Array [0..1] of Real; 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 ); EPS :Array [0..1] of Real = ( 1.E-5,1.E-5 ); begin Result := ''; { результат функции } N := 5; NM := 5; M := 3; L1 := 2; L2 := 3; AEB5R(NМ,N,М,В,L1,L2,ЕV,ЕРS,С); ResULT := RЕSULT + FОRMАT('%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 + Format('%s',[' EPS' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 1 do begin Result := Result + Format('%20.16f ',[EPS[_i]]); if ( ((_i+1) mod 2)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TAEB5R',Result); { вывод результатов в файл TAEB5R.res } exit; end; ЕND. Результаты: EV = ( .10000000E+01, .20000000E+01 ) EPS = ( .10E-04, .10E-04 )