Текст подпрограммы и версий
amb1r_p.zip , amb1e_p.zip , amb1c_p.zip , amb1z_p.zip
Тексты тестовых примеров
tamb1r_p.zip , tamb1e_p.zip , tamb1c_p.zip , tamb1z_p.zip

Подпрограмма:  AMB1R (модуль AMB1R_p)

Назначение

Масштабирование квадратной вещественной матрицы общего вида.

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

На первом этапе своей работы подпрограмма AMB1R с помощью перестановок строк и столбцов приводит матрицу А порядка N к виду:

                     |  T  X  Y  |
        PAP  = |  0  B   Z  |
                     |  0   0   R | 
где  
P - матрица перестановок порядка N;
T, R - верхние треугольные матрицы порядка LОW и N - IGН соответственно;
B - квадратная матрица, расположенная в строках и столбцах с номерами LОW, LОW + 1, ..., IGН и обладающая тем свойством, что матрица B - diag (В) не имеет нулевых строк и столбцов;
X,Y,Z - прямоугольные матрицы соответствующих размерностей.

Диагональные элементы матриц T и R являются собственными значениями матрицы А. В том случае, когда матрица B отсутствует, то значения переменных LОW и IGН полагаются равными единице.
На втором этапе подпрограмма AMB1R итерационно строит такую невырожденную диагональную матрицу D порядка IGН - LОW + 1, что матрица

                    D -1 B D 

становится промасштабированной в том смысле, что суммы абсолютных значений элементов соответственных строк и столбцов будут примерно равными.
Диагональные элементы матриц D являются степенями основания системы счисления, используемой в арифметике с плавающей запятой на данной машине.

В результате работы подпрограммы AMB1R будет получена матрица вида

      |  T           X D                 Y        |
      |  0        D-1 B D            D-1 Z    |
      |  0            0                      R       | 

Информация о матрицах Р и D запоминается и может быть впоследствии использована для восстановления собственных векторов исходной матрицы.

Уилкинсон, Pайнш. "Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра". М.: Машиностроение, 1976.

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

procedure AMB1R(NM :Integer; N :Integer; var A :Array of Real;
                var LOW :Integer; var IGH :Integer;
                var SCALE :Array of Real); 

Параметры

NM - число строк двумерного массива A, указанных при описании этого массива в вызывающей подпрограмме (тип: целый);
N - порядок исходной матрицы, N ≤ NМ (тип: целый);
A - вещественный двумерный массив размерности NМ на N, содержащий в первых N строках на входе в подпрограмму исходную матрицу порядка N, а на выходе из подпрограммы - матрицу, полученную в результате масштабирования;
      LOW -       IGH   целые переменные, содержащие на выходе из подпрограммы граничные индексы строк и столбцов масштабированной матрицы (см. математическое описание);
SCALE - вещественный вектор длины N, содержащий информацию о матрицах Р и D (см. математическое описание); при этом
для J = 1, 2,..., LОW - 1 и для J = IGН + 1,..., N элемент массива SСАLЕ (J) содержит индекс строки и столбца, которые были переставлены с J - ой строкой и J - ым столбцом соответственно, причем перестановки выполнялись в следующем порядке: сначала J изменялось от N до IGН + 1, затем от 1 до (LОW - 1);
для J = LОW, LОW + 1, ..., IGН элемент массива SСАLЕ (J) содержит (J - LОW + 1) - ый элемент матрицы D.

Версии

AMB1E - масштабирование вещественной квадратной матрицы общего вида, заданной с расширенной (Extended) точностью;
AMB1C - масштабирование комплексной квадратной матрицы общего вида (см. замечания по использованию);
AMB1Z - масштабирование комплексной квадратной матрицы общего вида, заданной с расширенной (Extended) точностью.

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

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

  1. 

В подпрограмме АМВ1E параметры А и SСАLЕ имеют тип Extended.

  2. 

В подпрограмме АMB1C исходная комплексная матрица А порядка N задается в двух вещественных массивах АR и АI размеров NМ на N, содержащих в своих первых N строках ее вещественную и мнимые части соответственно.

На выходе из подпрограммы массивы АR и АI содержат вещественные и мнимые части промасштабированной матрицы.
Параметр NМ определяет число строк массивов АR и АI, матрицы. Параметр NМ определяет число строк массивов указанных при описании этих массивов в вызывающей подпрограмме.

Первый оператор подпрограммы АMB1C имеет вид:

procedure AMB1C(NM :Integer; N :Integer; var AR :Array of Real;
                var AI :Array of Real; var LOW :Integer;
                var IGH :Integer; var SCALE :Array of Real);
.
  3. 

Подпрограмма АMB1Z имеет те же параметры, что и АMB1C, только при этом параметры АR, АI и SСАLЕ имеют тип Extended.

  4. 

Единственной арифметической операцией, которой подвергаются элементы исходной матрицы в подпрограмме АМВ1R, является умножение на целую степень основания системы счисления, используемой в арифметике с плавающей запятой на данной машине, поэтому, если только во время вычислений не происходит выхода за границы диапазона представимых на данной машине чисел, то все вычисления будут произведены точно, т.е. будут получены матрицы B и D, точно удовлетворяющие соотношению

      В = D-1 А D

В общем же случае вычисленные матрицы B и D удовлетворяют соотношению

      В = D-1 (А + F) D ,

где

      || F || 2 ≤ k w ,

w - минимальное представимое на данной машине положительное число;

k - число итераций.

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

Unit tamb1r_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, AMB1R_p;

function tamb1r: String; 

implementation

function tamb1r: String;
var
J,I,_i,LOW,IGH :Integer;
SCALE :Array [0..4] of Real;
const
A :Array [0..24] of Real = ( 1.0,2.0,0.0,0.0,0.0,32.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0 );
begin
Result := '';
AMB1R(5,5,A,LOW,IGH,SCALE);
Result := Result + Format('%s',['   A=']);
Result := Result + #$0D#$0A;
for J:=1 to 5 do
 begin
for I:=1 to 5 do
 begin
  Result := Result + Format('%20.16f ',[A[(I-1)+(J-1)*5]]) + #$0D#$0A;
 end;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',['  LOW,IGH']);
Result := Result + Format(' %5d %5d ',[LOW,IGH]) + #$0D#$0A;
Result := Result + Format('%s',['  SCALE=']);
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
 begin
  Result := Result + Format('%20.16f ',[SCALE[_i]]);
  if ( ((_i+1) mod 5)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('tamb1r',Result);  { вывод результатов в файл tamb1r.res }
exit;
end;

end.


Результаты:

               |  1.   0.25    0.    0.    1. |
               |  0.    1.       8.    0.    4. |
      A  =  |  0.    8.       1.    0.    1. |
               |  0.    0.       0.    1.    1. |
               |  0.    0.       0.    0.    1. |

      LOW  =  2
      IGH  =  3
      SCALE  =  (3., 0.25, 1., 4., 4.)