Текст подпрограммы и версий
afg5r_p.zip , afg5e_p.zip , afg5c_p.zip
Тексты тестовых примеров
tafg5r_p.zip , tafg5e_p.zip , tafg5c_p.zip

Подпрограмма:  AFG5R (модуль AFG5R_p)

Назначение

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

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

Для заданной квадратной вещественной матрицы А порядка N выполняется треугольная факторизация А = LU , где U - верхняя треугольная матрица, причем матрица L- 1 имеет вид:

     L-1  =  LN-1 * PN-1 *...* L1 * P1 , 

где Рi,  i = 1, ..., N - 1, суть матрицы перестановок, обеспечивающие стратегию выбора ведущего элемента по столбцам; Li,  i = 1, ..., N - 1, суть элементарные матрицы исключения в методе Гаусса.

Все матрицы Li,  i = 1, ..., N - 1, имеют нижне - треугольный вид с единичными диагональными элементами.

Дж. Форсайт, М. Малькольм, К. Моулер. Машинные методы математических вычислений. М.: Мир, 1980.

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

procedure AFG5R(var A :Array of Real; M :Integer; N :Integer;
                var NLEAD :Array of Integer; var IERR :Integer);

Параметры

A - вещественный двумерный массив размера М*N, в котором задается исходная квадратная матрица порядка N; на выходе на соответствующих местах массива находятся элементы матрицы U и поддиагональные элементы матриц Li,  i = 1, ..., N - 1;
M - первая размерность массива А в вызывающей программе (тип: целый);
N - порядок матрицы А (тип: целый);
NLEAD - целый вектор длины N, содержащий на выходе информацию о выполненных в процессе исключения перестановках (см. замечания по использованию);
IERR - целая переменная, содержащая на выходе информацию о прохождении счета, при этом:
IЕRR=65 - если М ≤ 0 или N ≤ 0;
IЕRR=66 - если в процессе работы подпрограммы произошло переполнение (это говорит о том, что некоторые элементы матрицы U превосходят по абсолютной величине максимально представимое на данной машине число);
IЕRR=-К - если в результате факторизации диагональный элемент в К - ой строке матрицы U равен нулю (это свидетельствует о вырожденности матрицы А). Если таких строк у матрицы U несколько, то значение К полагается равным номеру последней из них.

Версии

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

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

UTAFSI - подпрограмма выдачи диагностических сообщений.

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

  1. 

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

  2. 

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

  3. 

На выходе К - ый элемент вектора NLЕАE равен номеру строки, переставленной на К - ом шаге факторизации с К - ой строкой матрицы А. Поскольку факторизация Гаусса требует N - 1 шагов, то NLЕАD (N) = N.

  4. 

В отличие от подпрограммы АFG1R, матрицы Li,  i = 1, ..., N - 1 состоят из множителей, используемых в методе Гаусса, взятых со знаком минус, а исключение производится с использованием сложения, а не вычитания.

Кроме того, элементы матриц Li,  i = 1, ..., N - 1 не подвергаются выполняемым в процессе исключения перестановкам, как это происходит в подпрограмме АFG1R.

  5.  Диагностическое сообщение выдается, если переменной IЕRR присвоено значение, отличное от нуля. При этом, если IЕRR = 65 или 66, то выполнение факторизации прекращается, если же IЕRR < 0, то не прекращается.

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

Unit TAFG5R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFG5R_p;

function TAFG5R: String;

implementation

function TAFG5R: String;
var
M,N,J,I,_i,IERR :Integer;
NLEAE :Array [0..3] of Integer;
const
A :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
Result := '';  { результат функции }
M := 4;
N := M;
AFG5R(A,M,N,NLEAE,IERR);
Result := Result + #$0D#$0A;
for J:=1 to N do
 begin
  for I:=1 to N do
   begin
    Result := Result + Format('    РЕЗУЛЬТАТ ВЫПОЛНЕНИЯ AFG5R: %20.16f ',
 [A[(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('%10d ',[NLEAD[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%5d ',[IERR]) + #$0D#$0A;
UtRes('TAFG5R',Result);  { вывод результатов в файл TAFG5R.res }
exit;
end;

end.


Результаты:

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

      NLEAD  =   (2, 2, 4, 4)
   
 Это означает, что

                          |  1             0            0          0 |
                          | -0.929      1           0          0 |
      L1*L2*L3 =  | -0.506    -0.659     1          0 |
                          | -0.376    -0.040    -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 |