Текст подпрограммы и версий afh5r_p.zip , afh5e_p.zip |
Тексты тестовых примеров tafh5r_p.zip , tafh5e_p.zip |
Приведение вещественной симметричной матрицы, заданной в компактной форме, к симметричной трехдиагональной матрице с помощью ортогонального преобразования подобия.
Подпрограмма АFН5R осуществляет приведение вещественной матрицы А порядка N к симметричной трехдиагональной матрице Т с помощью следующей последовательности ортогональных преобразований подобия
Ai = Pi*Ai-1*Pi , i = 1, 2, ..., N-2 , где А0 = А , Рi = I - uiuiT / hi , hi = uiTui / 2 ,
а векторы ui ∈ ЕN выбираются таким образом, чтобы последние i строк и столбцов матрицы Аi имели бы трехдиагональную структуру. При этом у векторов ui отличными от нуля являются только компоненты с номерами 1, 2, ..., N - 1 . I - единичная матрица порядка N .
Информация о выполненых преобразованиях, а именно векторы ui, порождающие матрицы отражения Рi, запоминается и впоследствии может быть использована для восстановления собственных векторов исходной матрицы.
Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра. М.: Машиностроение, 1976.
procedure AFH5R(N :Integer; NV :Integer; var A :Array of Real; var D :Array of Real; var E :Array of Real; var E2 :Array of Real);
Параметры
N - | порядок исходной матрицы (тип: целый); |
NV - | длина вектора А, указанная при описании этого вектора в вызывающей подпрограмме, причем NV ≥ N (N + 1) / 2 (тип: целый); |
A - | вещественный вектор длины NV, в первых N (N + 1) / 2 компонентах которого задается исходная симметричная матрица в компактной форме; в результате работы подпрограммы вектор А содержит информацию о векторах ui, i = 1, 2, ..., N - 2, при этом на месте внедиагональных элементов (N - i + 1) - й строки исходной матрицы запоминаются ненулевые элементы вектора ui, а на месте диагонального элемента (N - i + 1) - й строки - величина √ h i (см. математическое описание); |
D - | вещественный вектор длины N, содержащий на выходе из подпрограммы диагональные элементы трехдиагональной матрицы; |
E - | вещественный вектор длины N, содержащий на выходе из подпрограммы в последних N - 1 компонентах поддиагональные элементы трехдиагональной матрицы, Е (1) = 0; |
E2 - | вещественный вектор длины N на выходе из подпрограммы Е2 (I) = (Е (I))2 , I = 1, 2, ..., N. |
Версии
AFH5E - | приведение симметричной матрицы, заданной в компактной форме с расширенной (Extended) точностью, к симметричной трехдиагональной форме с помощью ортогонального преобразования подобия. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
Фактические параметры, соответствующие формальным параметрам Е и Е2 могут совпадать, при этом будут получены только сами поддиагональные элементы без их квадратов. | |
2. | В подпрограмме АFН5E параметры А, D, Е, Е2 имеют тип Extended. |
Unit tafh5r_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, AFH5R_p; function tafh5r: String; implementation function tafh5r: String; var _i :Integer; D :Array [0..3] of Real; E :Array [0..3] of Real; E2 :Array [0..3] of Real; const A :Array [0..9] of Real = ( 1.0,0.0,2.0,-1.0,0.0,1.0,4.0,0.0,0.0,2.0 ); begin Result := ''; { результат функции } AFH5R(4,10,A,D,E,E2); Result := Result + Format('%s',[' A=' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 9 do begin Result := Result + Format('%20.16f ',[A[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[' D=' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%20.16f ',[D[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[' E=' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%20.16f ',[E[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[' E2=' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%20.16f ',[E2[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('tafh5r',Result); { вывод результатов в файл tafh5r.res } exit; end; end. Результаты: A = (0., 0., 0., -1., 1., 1., 4., 0., 4., 4.)T D = (2., 1., 1., 2.)T E = (0., 0., -1., -4.)T E2 = (0., 0., 1., 16.)T Это означает, что | 2 0 0 0 | | 0 1 -1 0 | T = | 0 -1 1 -4 | | 0 0 -4 2 | Pi = I - uiuiT / hi , i = 1, 2 , где u1 = (4., 0., 4., 0.)T , √ h 1 = 4 u2 = (-1., 1., 0., 0.)T , √ h 2 = 1