Текст подпрограммы и версий
asg2r_p.zip , asg2e_p.zip , asg2c_p.zip
Тексты тестовых примеров
tasg2r_p.zip , tasg2e_p.zip , tasg2c_p.zip

Подпрограмма:  ASG2R (модуль ASG2R_p)

Назначение

Решение вещественной системы линейных алгебраических уравнений А*x = b с матрицей A и вектором правой части b методом Гаусса с выбором ведущего элемента по всей матрице. При повторном решении системы с той же матрицей и другой правой частью эффективно используется выполненная ранее факторизация матрицы.

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

Матрица системы А  N - го порядка приводится к верхнетреугольному виду U последовательностью элементарных преобразований Гаусса  L1, L2, ...LN - 1 и матрицами перестановок Q и Т так, чтO

     LN-1*LN-2...L1*Q*A*T = U , 

и затем решается система с треугольной матрицей U и правой частью
LN - 1*LN - 2...L1*Q*b . Вычисленное решение  y  преобразуется в решение исходной системы  x  по правилу x = Т*y. Матрицы  Li ,  i = 1, 2, ...N - 1, имеют единичные диагональные элементы, матрицы Q и Т осуществляют соответственно перестановку строк и столбцов матрицы А и обеспечивают стратегию выбора ведущего элемента по всей матрице.

В.В.Воеводин, Р.В.Петрина, Комплекс алгоритмов, основанных на преобразованиях типа Гаусса, в пакете линейной алгебры, Сб. "Численный анализ на ФОРТРАНе", вып.3, Изд-во МГУ, 1973.

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

procedure ASG2R(var A :Array of Real; var B :Array of Real;
                var X :Array of Real; var S :Array of Integer;
                N :Integer; L :Integer);

Параметры

A - двумерный N на N массив, в котором задается исходная матрица (тип: Real); по окончании работы подпрограммы в массиве А на соответствующих местах запоминаются элементы матрицы U и векторы-столбцы, порождающие матрицы  Li ;
B - вектор длины N, в котором задается вектор правой части системы (тип: вещественный);
X - вектор длины N, в котором запоминается вектор вычисленного решения системы (тип: вещественный);
S - двумерный N на 2 массив , в столбцах которого запоминаются векторы, порождающие матрицы перестановок Q и Т соответственно; при этом в S (К, 1) и S (К, 2) запоминаются соответственно номера строки и столбца переставленных на К - ом шаге с К - ой строкой и К - ым столбцом (тип: целый);
N - заданный порядок матрицы системы (тип: целый);
L - признак решаемой задачи (тип: целый), причем
L = 1 - если система с данной матрицей решается впервые;
L ≠ 1 - если система с данной матрицей решается повторно.

Версии

ASG2E - решение системы линейных алгебраических уравнений А*x = b методом Гаусса с выбором ведущего элемента по всей матрице для вещественных А и b, заданных с расширенной (Extended) точностью.
ASG2C - решение системы линейных алгебраических уравнений А*x = b методом Гаусса с выбором ведущего элемента по всей матрице для комплексных А и b.

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

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

  1. 

В подпрограмме АSG2E массивы А, В, Х имеют тип Extended.

  2. 

В подпрограмме АSG2С массивы А, В, Х имеют тип Complex.

  3. 

Поскольку факторизация Гаусса требует N - 1 шагов, то S (N, i)=0, i = 1, 2.

  4.  Подпрограммы АSG2R, АSG2E, АSG2С позволяют помещать вычисленное решение Х на место правой части В.

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

Unit TASG2R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, ASG2R_p;

function TASG2R: String;

implementation

function TASG2R: String;
var
I,_i :Integer;
B :Array [0..3] of Real;
B3 :Array [0..3] of Real;
X3 :Array [0..3] of Real;
S3 :Array [0..7] of Integer;
const
РС :Array [0..15] of Real = ( 7.9,8.5,4.3,3.2,5.6,-4.8,4.2,-1.4,5.7,0.8,-3.2,
-8.9,-7.2,3.5,9.3,3.3 );
label
_3,_11;
begin
Result := '';  { результат функции }
for I:=1 to 4 do
 begin
_3:
  B[I-1] := 0.0;
 end;
B[0] := 1.0;
for I:=1 to 4 do
 begin
_11:
  B3[I-1] := B[I-1];
 end;
ASG2R(PC,B3,X3,S3,4,1);
Result := Result + #$0D#$0A;
for _i:=0 to 15 do
 begin
  Result := Result + Format('%20.16f ',[PC[_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 3 do
 begin
  Result := Result + Format('%20.16f ',[B3[_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 3 do
 begin
  Result := Result + Format('%20.16f ',[X3[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TASG2R',Result);  { вывод результатов в файл TASG2R.res }
end;

end.


Результат:

               |  0.000136 |
               | -0.003263 |
               |  0.024476 |
    X  =    | -0.081585 |
               |  0.134615 |
               | -0.107692 |
               |  0.033333 |