Текст подпрограммы и версий afh0r_p.zip , afh0e_p.zip , afh0c_p.zip |
Тексты тестовых примеров tafh0r_p.zip , tafh0e_p.zip , tafh0c_p.zip |
Треугольное разложение симметричной матрицы модифицированным методом квадратного корня (модифицированным методом Холецкого).
Подпрограмма AFH0R осуществляет разложение симметричной матрицы размера N*N в произведение А = UTDU, где U - верхняя треугольная матрица, на главной диагонали которой стоят единицы, D - диагональная матрица, с помощью модифицированного метода квадратного корня.
Предполагается, что главные миноры матрицы А отличны от нуля.
R.S.Мartin, G.Рeters, J.Н.Wilkinson, Symmetric Decomposition of a Рositive Definite Мatrix, Numer. Матн, 7, 1965.
procedure AFH7R(var IA :Array of Integer; var JA :Array of Integer; var AN :Array of Real; var AD :Array of Real; N :Integer; var IU :Array of Integer; var JU :Array of Integer; var UN :Array of Real; var DI :Array of Real; var IP :Array of Integer; var IUP :Array of Integer);
Параметры
A - | вещественный двумерный массив размера N*N, содержащий исходную симметричную матрицу; в результате работы подпрограммы над главной диагональю матрицы А запоминается верхняя треугольная матрица U без диагональных элементов; нижняя треугольная часть матрицы А, включая главную диагональ, сохраняется; |
S - | вещественный вектор длины N, в котором запоминаются величины, обратные диагональным элементам матрицы D; |
N - | порядок исходной симметричной матрицы А (тип: целый). |
Версии
AFH0E - | треугольное разложение симметричной матрицы, заданной с расширенной (Extended) точностью, модифицированным методом квадратного корня. |
AFH0C - | треугольное разложение эрмитовой матрицы А, вида А = U*DU модифицированным методом квадратного корня. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме АFН0E параметры А, S имеют тип Extended. | |
2. | В подпрограмме АFН0С параметр А имеет тип Complex. |
Unit TAFH0R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, AFH0R_p; function TAFH0R: String; implementation function TAFH0R: String; var N,I,J,_i :Integer; A2 :Array [0..24] of Real; A :Array [0..24] of Real; S :Array [0..4] of Real; label _10; begin Result := ''; { результат функции } N := 5; for I:=1 to 5 do begin for J:=I to 5 do begin A[(I-1)+(J-1)*5] := I; _10: A[(J-1)+(I-1)*5] := I; end; end; Result := Result + #$0D#$0A; for _i:=0 to 24 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; AFH0R(A,S,N); Result := Result + #$0D#$0A; for I:=1 to 5 do begin for J:=1 to 5 do begin Result := Result + Format('%20.16f ',[A[(I-1)+(J-1)*5]]) + #$0D#$0A; end; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 4 do begin Result := Result + Format('%20.16f ',[S[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TAFH0R',Result); { вывод результатов в файл TAFH0R.res } exit; end; end. Результаты: | 1. 1. 1. 1. 1. | | 1. | | 1. 2. 1. 1. 1. | | 1. | A = | 1. 2. 3. 1 1. | , S = | 1. | , | 1. 2. 3. 4. 1. | | 1. | | 1. 2. 3. 4. 5. | | 1. | это означает, что | 1. 1. 1. 1. 1. | | 1. 0 0 0 0 | | 0. 1. 1. 1. 1. | | 0 1. 0 0 0 | U = | 0. 0. 1. 1. 1. | , D = | 0 0 1. 0 0 | . | 0. 0. 0. 1. 1. | | 0 0 0 1. 0 | | 0. 0. 0. 0. 1. | | 0 0 0 0 1. |