Текст подпрограммы и версий
asg6r_p.zip , asg6c_p.zip , asg6e_p.zip
Тексты тестовых примеров
tasg6r_p.zip , tasg6c_p.zip , tasg6e_p.zip

Подпрограмма:  ASG6R (модуль ASG6R_p)

Назначение

Решение системы линейных алгебраических уравнений методом отражений.

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

Находится решение системы A*X = B, где А - невырожденая квадратная матрица порядка N, В - заданный вектор длины N. Для решения используется нормализованное приведение матрицы системы А к верхней треугольной форме R с помощью последовательности преобразований отражения

 (1)     QN-1 ... Q2*Q1*A*S = R , 

где Qi - соответствующие матрицы отражения, S - результирующая матрица перестановок, R - верхняя треугольная матрица.

Из полученной треугольной системы

     R*Y = QN-1 ... Q2*Q1*B 

находится решение Y, по которому затем определяется искомое решение Х = S*Y.

Дж.Х.Уилкинсон. Алгебраическая проблема собственных значений. Изд."Наука", М., 1970.

Использование

procedure ASG6R(var A :Array of Real; var B :Array of Real;
                var X :Array of Real; var T :Array of Real;
                var IS_ :Array of Integer; N :Integer;
                L :Integer);

Параметры

A - вещественный двумерный массив размера N на N, в котором задается исходная матрица; в результате работы подпрограммы в массиве А на соответствующих местах запоминаются наддиагональные элементы вычисленной верхней треугольной матрицы R, в остальной части массива А в последовательных столбцах запоминаются векторы, порождающие соответствующие матрицы отражения;
B - вещественный вектор длины N, в котором задается правая часть системы;
X - вещественный вектор длины N, в котором запоминается полученное решение системы;
T - вещественный вектор длины N, в котором запоминаются диагональные элементы верхней треугольной матрицы R;
IS - целый вектор длины N, в котором запоминаются перестановки столбцов при проведении нормализованного процесса (1); в IS (k) запоминается номер столбца, переставленного с k - ым столбцом на k - ом шаге преобразования;
N - порядок исходной матрицы (тип: целый);
L - задает режим работы подпрограммы (тип: целый); при этом:
L = 1 - если система с данной матрицей А решается впервые;
L ≠ 1 - если повторно решается система с матрицей А, но другой правой частью; в этом случае факторизация (1) матрицы А не выполняется.

Версии

ASG6C - решение комплексной системы линейных алгебраических уравнений методом отражений.
ASG6E - решение системы линейных алгебраических уравнений, заданной с расширенной (Extended) точностью, методом отражений.

Вызываемые подпрограммы: нет

Замечания по использованию

  1. 

В подпрограмме АSG6С параметры А, В, Х, Т имеют тип Complex.

  2. 

В подпрограмме АSG6E параметры А, В, Т, Х имеют тип Extended.

  3.  При повторном решении системы с той же матрицей А, но с другой правой частью, информация, полученная ранее в массивах А, Т, IS не должна портиться.

Пример использования

Unit TASG6R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, ASG6R_p;

function TASG6R: String;

implementation

function TASG6R: String;
var
N,L,K,J,I,KH,_i :Integer;
A :Array [0..35] of Real;
X :Array [0..5] of Real;
T :Array [0..5] of Real;
IS_ :Array [0..5] of Integer;
const
B :Array [0..5] of Real = ( 1.0,2.0,3.0,4.0,5.0,1.0 );
label
_21,_20;
begin
Result := '';  { результат функции }
N := 6;
L := 1;
K := N+1;
for J:=1 to N do
 begin
  for I:=J to N do
   begin
    КН := K-I;
    A[(I-1)+(J-1)*6] := KH;
_21:
    A[(J-1)+(I-1)*6] := KH;
   end;
_20:
 end;
Result := Result + Format('%s',
 [' ИСХОДНЫЕ ДAHHЫE:' + #$0D#$0A]) + #$0D#$0A; 
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' A' + #$0D#$0A]);
for I:=1 to 6 do
 begin
  for J:=1 to 6 do
   begin
    Result := Result + Format('%20.16f ',[A[(I-1)+(J-1)*6]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' B' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for _i:=0 to 5 do
 begin
  Result := Result + Format('%20.16f ',[B[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' PEЗYЛЬTAT:']) + #$0D#$0A; 
ASG6R(A,B,X,T,IS_,N,L);
Result := Result + Format('%s',[' A' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for _i:=0 to 35 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',[' T' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for _i:=0 to 5 do
 begin
  Result := Result + Format('%20.16f ',[T[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[#$0D#$0A + ' B' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for _i:=0 to 5 do
 begin
  Result := Result + Format('%20.16f ',[B[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' X' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for _i:=0 to 5 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;
Result := Result + #$0D#$0A;
for _i:=0 to 5 do
 begin
  Result := Result + Format('%10d ',[IS_[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TASG6R',Result);  { вывод результатов в файл TASG6R.res }
exit;
end;

end.


Результат:

      X  =  (-1., 0., 0., 0., 5., -3.)