|
Текст подпрограммы и версий ammkr_p.zip |
Тексты тестовых примеров tammkr_p.zip |
Символическое умножение обратной для нижней треугольной разреженной матрицы с единичной диагональю, заданной в формате RR (L) U, на прямоугольную разреженную матрицу, заданную в формате RR (C) U .
Сокращенное наименование формата RR (L) U происходит от английского словосочетания "Row - wise Representation, Lower, Unordered" (строчное представление, нижний треугольник, неупорядоченное). Данный формат отличается от формата RR (U) U (см. описание подпрограммы AM21R ), только тем, что в нем представлены элементы нижнего, а не верхнего треугольника. Описание формата RR (C) U приведено в описании подпрограммы AMTSR .
Операция, выполняемая подпрограммой AMMKR, эквивалентна следующей операции:
X = U -TB ,
где B - прямоугольная разреженная матрица с NR строками и NC столбцами, заданная в формате RR (C) U, U - верхняя треугольная разреженная матрица порядка NR с единичной диагональю, заданная в формате RR (U) U, X - результирующая прямоугольная разреженная матрица с NR строками и NC столбцами, формируемая в формате RR (C) U. Так как UT - нижняя треугольная матрица, то она задается в формате RR (L) U.
Матрица X может быть найдена без вычисления обратной для матрицы UT, которая была бы плотной матрицей. Для этого рассмотрим эквивалентное соотношение UTX = B. Полученная система линейных уравнений решается символическим и численным алгоритмами с привлечением вспомогательных массивов. Поясним численный алгоритм на примере:
| 1 0 0 | | x11 x12 | = | b11 b12 |
| a 1 0 | | x21 x22 | = | b21 b22 |
| b c 1 | | x31 x32 | = | b31 b32 |
Для первой строки имеем ( x11, x12 ) = ( b11, b12 ), откуда следует, что x11 = b11, x12 = b12. Для второй строки:
a ( x11, x12 ) + ( x21, x22 ) = ( b21, b22 )
Следовательно,
( x21, x22 ) = ( b21, b22 ) - a ( x11, x12 )
Аналогично получаем для третьей строки:
( x31, x32 ) = ( b31, b32 ) - b ( x11, x12 ) - c ( x21, x22 )
Выписанные уравнения решаются последовательно и в результате получается матрица X. Этот алгоритм приспособлен для разреженных матриц, заданных в строчном формате.
Подпрограмма AMMKR вычисляет портрет результирующей матрицы X, в формате RR (C) U, т.е. реализует символический этап рассмотренного здесь алгоритма.
С. Писсанецки. Технология разреженных матриц. - М.: Мир, 1988.
procedure AMMKR(var IUT :Array of Integer; var JUT :Array of Integer;
var IB :Array of Integer; var JB :Array of Integer;
NR :Integer; NC :Integer; var IX :Array of Integer;
var JX :Array of Integer; var IP :Array of Integer);
Параметры
| IUT, JUT - | заданный портрет матрицы UT в формате RR (L) U; |
| IB, JB - | заданный портрет матрицы B в формате RR (C) U; |
| NR - | заданный порядок матрицы UT и число строк матриц B и X (тип: целый); |
| NC - | заданное число столбцов матриц B и X (тип: целый); |
| IX, JX - | вычисленный портрет результирующей матрицы X в формате RR (C) U; |
| IP - | целый массив длины NC, используемый в подпрограмме в качестве рабочего. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию: нет
Unit TAMMKR_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, AMMKR_p;
function TAMMKR: String;
implementation
function TAMMKR: String;
var
NR,NC,_i :Integer;
IX :Array [0..4] of Integer;
JX :Array [0..7] of Integer;
IP :Array [0..2] of Integer;
const
IUT :Array [0..4] of Integer = ( 1,1,1,2,4 );
JUT :Array [0..2] of Integer = ( 2,3,1 );
IB :Array [0..4] of Integer = ( 1,3,4,5,6 );
JB :Array [0..4] of Integer = ( 3,1,2,1,3 );
begin
Result := '';
{ ТЕСТ ДЛЯ ПОДПРОГРАММЫ AMMKR }
NR := 4;
NC := 3;
AMMKR(IUT,JUT,IB,JB,NR,NC,IX,JX,IP);
Result := Result + Format('%s',[' IX=']);
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
begin
Result := Result + Format('%4d ',[IX[_i]]);
if ( ((_i+1) mod 5)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' JX=']);
Result := Result + #$0D#$0A;
for _i:=0 to 7 do
begin
Result := Result + Format('%4d ',[JX[_i]]);
if ( ((_i+1) mod 8)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('TAMMKR',Result); { вывод результатов в файл TAMMKR.res }
exit;
end;
end.
Результаты:
IX = ( 1, 3, 4, 6, 9 )
JX = ( 3, 1, 2, 1, 2, 3, 1, 2 )