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