Текст подпрограммы и версий
afb2r_p.zip , afb2e_p.zip , afb2c_p.zip
Тексты тестовых примеров
tafb2r_p.zip , tafb2e_p.zip , tafb2c_p.zip

Подпрограмма:  AFB2R (модуль AFB2R_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 являются нижними треугольными ленточными матрицами с единичными диагональными элементами. После выполнения факторизации вычисляется величина RCOND, обратная числу обусловленности матрицы А:

 RCOND = 1 / (|| A ||1 * || A-1 ||1) ,   где  || A ||1 = max j = 1,...,N  Sj ,
здесь     N
     Sj =  ∑ | ai j |
             i=1 

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

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

procedure AFB2R(var A :Array of Real; MA :Integer; N :Integer;
                ML :Integer; MU :Integer; var NLEAD :Array of Integer;
                var RCOND :Real; var Z :Array of Real; var IERR :Integer);

Параметры

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

Версии

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

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

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

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

  1. 

В подпрограмме АFВ2С массивы А и Z имеют тип Complex.

  2. 

В подпрограмме АFВ2E массивы А, Z и переменная RСОND имеют тип Extended.

  3. 

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

  4. 

Так как в результате выполненных в ходе факторизации перестановок число верхних кодиагоналей матрицы U равно МU + МL, а также в силу некоторых конструктивных особенностей подпрограммы, для правильной ее работы необходимо выполнение условия МА ≥ N >МU + 2*МL + 1. Если МU + 2*МL + 1 ≥ N, то более целесообразно, задав матрицу А не в компактной, а в полной форме, обратиться к подпрограмме АFG4R.

  5.  Если переменной IЕRR присвоено значение, отличное от нуля, то выдается соответствующее диагностическое сообщение, полагается RСОND = 0.0 и происходит выход из подпрограммы (если IЕRR < 0, то выход происходит по окончании факторизации).

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

Unit TAFB2R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFB2R_p;

function TAFB2R: String;

implementation

function TAFB2R: String;
var
MA,N,I,J,ML,MU,J0,J1,K,IERR :Integer;
RCONE :Real;
A :Array [0..80] of Real;
Z :Array [0..8] of Real;
NLEAE :Array [0..8] of Integer;
label
_1,_2,_3,_4;
begin
Result := '';  { результат функции }
МА := 9;
N := 9;
for I:=1 to МА do
 begin
  for J:=1 to N do
   begin
    A[(I-1)+(J-1)*9] := 0.0;
_1:
   end;
_2:
 end;
ML := 2;
MU := 3;
for I:=1 to МА do
 begin
  J0 := Max0(1,I-ML);
  J1 := Min0(N,I+MU);
  for J:=J0 to J1 do
   begin
    K := J-I+ML+1;
    A[(I-1)+(K-1)*9] := (I*10+J);
_3:
   end;
_4:
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',['   A=' + #$0D#$0A]);
for I:=1 to МА do
 begin
  for J:=1 to N do
   begin
    Result := Result + Format('   %20.16f ',
 [A[(I-1)+(J-1)*9]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
AFB2R(A,MA,N,ML,MU,NLEAE,RCONE,Z,IERR);
Result := Result + #$0D#$0A;
Result := Result + Format('%s',['   NLEAE=' + #$0D#$0A]);
for J:=1 to N do
 begin
  Result := Result + Format('   %3d ',[NLEAD[J-1]]) + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',['   A=' + #$0D#$0A]);
for I:=1 to МА do
 begin
  for J:=1 to N do
   begin
    Result := Result + Format('   %20.16f ',
 [A[(I-1)+(J-1)*9]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',['   IERR=']);
Result := Result + Format('%3d ',[IERR]);
Result := Result + Format('%s',['   RCONE=']);
Result := Result + Format('%20.16f ',[RCOND]) + #$0D#$0A;
UtRes('TAFB2R',Result);  { вывод результатов в файл TAFB2R.res }
exit;
end;

end.


Результат:

               |   0          0         31.0       32.0    33.0   34.0   35.0  36.0  0 |
               |   0        -0.68     42.0       43.0    44.0   45.0   46.0  47.0  0 |
               | -0.35    -0.02     53.0       54.0    55.0   56.0   57.0  58.0  0 |
               | -0.008  -0.006   64.0       65.0    66.0   67.0   68.0  69.0  0 |
      A  =  | -0.01    -0.01     75.0       76.0    77.0   78.0   79.0     0    0 |
               | -0.005  -0.004   86.0       87.0    88.0   89.0     0        0    0 |
               | -0.19      0.002   97.0       98.0    99.0     0       0        0    0 |
               |  0.3       -0.25     0.76       15.02    0        0       0        0    0 |
               | -0.13     -0.51     0.0003     0         0        0       0        0    0 |

      NLEAD  =   (3, 4, 5, 6, 7, 8, 9, 9, 9).

      RCOND  =  1.2017E-07