Текст подпрограммы и версий
afg1r_p.zip , afg1e_p.zip , afg1c_p.zip
Тексты тестовых примеров
tafg1r_p.zip , tafg1e_p.zip , tafg1c_p.zip

Подпрограмма:  AFG1R (модуль AFG1R_p)

Назначение

Треугольное разложение вещественной матрицы методом Гаусса с выбором ведущего элемента по столбцу.

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

Для заданной матрицы А выполняется факторизация вида QА = LU, где Q - вычисляемая матрица перестановок, L - нижняя, U - верхняя треугольная матрицы. Матрица L имеет единичные диагональные элементы. Матрица Q осуществляет перестановку строк исходной матрицы и обеспечивает стратегию выбора ведущего элемента по столбцам.

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

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

procedure AFG1R(var A :Array of Real; var S :Array of Integer;
                N :Integer);

Параметры

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

Версии

AFG1E - треугольное разложение матрицы, заданной с расширенной (Extended) точностью методом Гаусса с выбором ведущего элемента по столбцу.
AFG1C - треугольное разложение комплексной матрицы методом Гаусса с выбором ведущего элемента по столбцу.

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

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

  1. 

В подпрограмме АFG1С массив А имеет тип Complex.

  2. 

В подпрограмме АFG1E массив А имеет тип Extended.

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

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

Unit TAFG1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFG1R_p;

function TAFG1R: String;

implementation

function TAFG1R: String;
var
J,I,_i :Integer;
S :Array [0..3] 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 );
begin
for _i:=0 to 4 do
 S[_i] := 0;  //начальное обнуление массива
Result := '';  { результат функции }
AFG1R(PA,S,4);
Result := Result + #$0D#$0A;
for I:=1 to 4 do
 begin
  for J:=1 to 4 do
   begin
    Result := Result + Format('%20.16f ',[PA[(I-1)+(J-1)*4]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
 begin
  Result := Result + Format('%d ',[S[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TAFG1R',Result);  { вывод результатов в файл TAFG1R.res }
exit;
end;

end.


Результат:

                 | 8.500  -4.800    0.800     3.500  |
                 | 0.929  10.061   4.956  -10.453  |
      A  =    | 0.376    0.040  -9.402     2.405  |  ;
                 | 0.506    0.659   0.731    12.658 |

      S  =   (2, 2, 4, 0);

 это означает, что
  
                 | 1          0          0        0 |
                 | 0.929   1          0        0 |
      L  =    | 0.376   0.040   1        0  |  ;
                 | 0.506   0.659  0.731  1 |

                 | 8.500  -4.800   0.800       3.500  |
                 | 0         10.061   4.956   -10.453  |
      U  =    | 0           0         -9.402      2.405  |
                 | 0           0          0            12.658 |