|
Текст подпрограммы и версий ash0r_p.zip , ash0c_p.zip , ash0e_p.zip |
Тексты тестовых примеров tash0r_p.zip , tash0c_p.zip , tash0e_p.zip |
Решение системы линейных алгебраических уравнений с симметричной матрицей модифицированным методом квадратного корня (модифицированным методом Холецкого).
Подпрограмма ASH0R модифицированным методом квадратного корня осуществляет разложение заданной симметричной матрицы А в произведение
A = UT*D*U ,
где U - верхняя треугольная матрица, на диагонали которой стоят единицы, D - диагональная матрица, и затем решает две треугольные системы
UT*y = b , D*U*x = y .
При повторном решении системы с той же матрицей и другой правой частью подпрограмма позволяет использовать полученное ранее разложение.
Главные миноры матрицы А должны быть отличными от нуля.
R.S.Мartin, G.Рeters, J.Н.Wilkinson, Symmetric_p Decomposition of a Рositive Definite Мatrix, Numer. Матн., 7, 1965.
procedure ASH0R(var A :Array of Real; var B :Array of Real;
var X :Array of Real; var S :Array of Real;
N :Integer; L :Integer);
Параметры
| A - | вещественный двумерный массив размера N на N, содержащий исходную матрицу; в результате работы подпрограммы над главной диагональю матрицы А запоминается верхняя треугольная матрица U без диагональных элементов; нижняя треугольная часть матрицы А, включая главную диагональ, сохраняется; |
| B - | вещественный вектор длины N, в котором задается правая часть; |
| X - | вещественный вектор длины N, в котором запоминается вычисленное решение; |
| S - | вещественный вектор длины N, содержащий величины, обратные диагональным элементам диагональной матрицы D; |
| N - | порядок симметричной матрицы А (тип: целый); |
| L - | задает режим работы подпрограммы (тип: целый); при этом: |
| L = 1 - | если система с данной матрицей А решается впервые; |
| L ≠ 1 - | если система с данной матрицей А решается повторно. |
Версии
| ASH0C - | решение системы линейных алгебраических уравнений с эрмитовой матрицей модифицированным методом квадратного корня. |
| ASH0E - | решение системы линейных алгебраических уравнений с симметричной матрицей, заданной с расширенной (Extended) точностью, модифицированным методом квадратного корня. |
Вызываемые подпрограммы: нет
Замечания по использованию
| 1. |
В подпрограмме АSН0E параметры А, В, S, Х имеют тип Extended. | |
| 2. | В подпрограмме АSН0С параметры А, В, Х имеют тип Complex. |
Unit TASH0R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, ASH0R_p, ASH0E_p;
function TASH0R: String;
implementation
function TASH0R: String;
var
N,I,J,_i :Integer;
A1 :Array [0..24] of Extended;
A :Array [0..24] of Real;
В :Array [0..4] of Real;
B1 :Array [0..4] of Extended;
X :Array [0..4] of Real;
X1 :Array [0..4] of Extended;
S :Array [0..4] of Real;
S1 :Array [0..4] of Extended;
LАBel
_1,_3;
begin
Result := ''; { результат функции }
N := 5;
for I:=1 to 5 do
begin
for J:=1 to 5 do
begin
A1[(I-1)+(J-1)*5] := 2520.0/(I+J-1.0);
_1:
A[(I-1)+(J-1)*5] := A1[(I-1)+(J-1)*5];
end;
end;
for I:=1 to 5 do
begin
B1[I-1] := 0.0;
_3:
B[I-1] := 0.0;
end;
B[0] := 1.0;
B1[0] := 1.0;
ASH0R(A,B,X,S,N,1);
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;
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
begin
Result := Result + Format('%20.16f ',[X[_i]]);
if ( ((_i+1) mod 4)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
ASH0E(A1,B1,X1,S1,N,1);
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
begin
Result := Result + Format('%20.16f ',[S1[_i]]);
if ( ((_i+1) mod 4)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
begin
Result := Result + Format('%20.16f ',[X1[_i]]);
if ( ((_i+1) mod 4)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('TASH0R',Result); { вывод результатов в файл TASH0R.res }
exit;
end;
end.
Результаты:
X = (1.359751359*10-4, -3.26340326*10-3, 2.44755244*10-2,
-8.1585081*10-2, 1.34615384*10-1, -1.07692307*10-1,
3.33333333*10-2)