Текст подпрограммы и версий
ash0r_p.zip , ash0c_p.zip , ash0e_p.zip
Тексты тестовых примеров
tash0r_p.zip , tash0c_p.zip , tash0e_p.zip

Подпрограмма:  ASH0R (модуль ASH0R_p)

Назначение

Решение системы линейных алгебраических уравнений с симметричной матрицей модифицированным методом квадратного корня (модифицированным методом Холецкого).

Математическое описание

Подпрограмма 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)