|
Текст подпрограммы и версий 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 )