Текст подпрограммы и версий
ait1r_p.zip  ait1e_p.zip  ait1c_p.zip 
Тексты тестовых примеров
tait1r_p.zip  tait1e_p.zip  tait1c_p.zip 

Подпрограмма:  AIT1R (модуль AIT1R_p)

Назначение

Обращение вещественной треугольной матрицы.

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

Заданная вещественная верхняя (нижняя) треугольная матрица А порядка N обращается путем последовательного обращения треугольных подматриц Аi порядка  i,  i = 1,...,N, стоящих в левом верхнем (правом нижнем) углу матрицы.

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

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

procedure AIT1R(var A :Array of Real; M :Integer; N :Integer;
                LOW :Integer; var IERR :Integer); 

Параметры

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

Версии

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

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

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

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

  1. 

В подпрограмме АIТ1E массив А имеет тип External.

  2. 

В подпрограмме АIТ1С массив А имеет тип Сomplex.

  3.  Если вырабатывается значение переменной IЕRR, отличное от нуля, то выдается соответствующее диагностическое сообщение и происходит выход из подпрограммы.

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

Unit TAIT1R_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, AIT1R_p;

function TAIT1R: String; 

implementation

function TAIT1R: String;
var
M,N,LOW,J,I,K,IERR :Integer;
A :Array [0..24] of Real;
B :Array [0..24] of Real;
C :Array [0..24] of Real;
D :Array [0..24] of Real;
label
_3,_4,_5,_6,_7;
begIN
Result := '';
M := 5;
N := 5;
LOW := 0;
{ ** обнуление матриц ** }
for J:=1 to N do
 begin
  for I:=1 to N do
   begin
    A[(I-1)+(J-1)*5] := 0.0;
    B[(I-1)+(J-1)*5] := 0.0;
   end;
 end;
{ *************** }
for J:=1 to N do
 begin
  for I:=1 to J do
   begin
    A[(I-1)+(J-1)*5] := (I*10+J);
    B[(I-1)+(J-1)*5] := A[(I-1)+(J-1)*5];
_3:
   end;
_4:
 end;
Result := Result + Format('%s',['   A=']);
Result := Result + #$0D#$0A;
for J:=1 to N do
 begin
for I:=1 to M do
 begin
  Result := Result + Format('%10.4f ',[A[(I-1)+(J-1)*5]]) + #$0D#$0A;
 end;
 end;
Result := Result + #$0D#$0A;
AIT1R(A,M,N,LOW,IERR);
Result := Result + Format('%s',['   INVERSE(A)=']);
Result := Result + #$0D#$0A;
for J:=1 to N do
 begin
for I:=1 to M do
 begin
  Result := Result + Format('%10.4f ',[A[(I-1)+(J-1)*5]]) + #$0D#$0A;
 end;
 end;
Result := Result + #$0D#$0A;
for I:=1 to M do
 begin
  for J:=1 to N do
   begin
    C[(I-1)+(J-1)*5] := 0.0;
    D[(I-1)+(J-1)*5] := 0.0;
    for K:=1 to N do
     begin
      C[(I-1)+(J-1)*5] := C[(I-1)+(J-1)*5]+B[(I-1)+(K-1)*5]*A[(K-1)+(J-1)*5];
      D[(I-1)+(J-1)*5] := D[(I-1)+(J-1)*5]+A[(I-1)+(K-1)*5]*B[(K-1)+(J-1)*5];
_5:
     end;
_6:
   end;
_7:
 end;
Result := Result + Format('%s',['   A*INVERSE(A)=']);
Result := Result + #$0D#$0A;
for J:=1 to N do
 begin
for I:=1 to M do
 begin
  Result := Result + Format('%10.4f ',[C[(I-1)+(J-1)*5]]) + #$0D#$0A;
 end;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',['   INVERSE(A)*A=']);
Result := Result + #$0D#$0A;
for J:=1 to N do
 begin
for I:=1 to M do
 begin
  Result := Result + Format('%10.4f ',[D[(I-1)+(J-1)*5]]) + #$0D#$0A;
 end;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',['   IERR=']);
Result := Result + Format('%3d ',[IERR]) + #$0D#$0A;
UtRes('TAIT1R',Result);  { вывод результатов в файл TAIT1R.res }
exit;
end;

end.


Результаты:

               | 9.091E-2    -4.959E-2    -1.251E-3    -9.107E-4    -7.120E-4 |
               |     0            4.546E-2     -3.168E-2    -3.131E-4    -2.448E-4 |
      A  =  |     0                 0             3.031E-2    -2.342E-2     -1.252E-4 |
               |     0                 0                  0            2.273E-2      -1.860E-2 |
               |     0                 0                  0                 0              1.818E-2 |