Текст подпрограммы и версий
amb1r_c.zip , amb1d_c.zip , amb1c_c.zip , amb1p_c.zip
Тексты тестовых примеров
tamb1r_c.zip , tamb1d_c.zip , tamb1c_c.zip , tamb1p_c.zip

Подпрограмма:  amb1r_c

Назначение

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

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

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

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

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

                    D -1 B D 

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

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

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

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

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

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

    int amb1r_c (integer *nm, integer *n, real *a, integer *low,
                 integer *igh, real *scale)

Параметры

nm - число строк двумерного массива a, указанных при описании этого массива в вызывающей подпрограмме (тип: целый);
n - порядок исходной матрицы, n ≤ nm (тип: целый);
a - вещественный двумерный массив размерности nm на n, содержащий в первых n строках на входе в подпрограмму исходную матрицу порядка n, а на выходе из подпрограммы - матрицу, полученную в результате масштабирования;
      low -
      igh  
целые переменные, содержащие на выходе из подпрограммы граничные индексы строк и столбцов масштабированной матрицы (см. математическое описание);
scale - вещественный вектор длины n, содержащий информацию о матрицах P и D (см. математическое описание); при этом
для j = 1, 2,..., low - 1 и для j = igh + 1,..., n элемент массива scale (j) содержит индекс строки и столбца, которые были переставлены с j - ой строкой и j - ым столбцом соответственно, причем перестановки выполнялись в следующем порядке: сначала j изменялось от n до igh + 1, затем от 1 до (low - 1);
для j = low, low + 1, ..., igh элемент массива scale (j) содержит (j - low + 1) - ый элемент матрицы D.

Версии

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

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

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

  1. 

В подпрограмме amb1d_c параметры a и scale имеют тип double.

  2. 

В подпрограмме amb1c_c исходная комплексная матрица A порядка n задается в двух вещественных массивах ar и ai размеров nm на n, содержащих в своих первых n строках ее вещественную и мнимые части соответственно.

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

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

 int amb1c_c (integer *nm, integer *n, real *ar, real *ai,
        integer *low, integer *igh, real *scale).
  3. 

Подпрограмма amb1p_c имеет те же параметры, что и amb1c_c, только при этом параметры ar, ai и scale_c имеют тип double.

  4. 

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

      B = D-1 A D

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

      B = D-1 (A + F) D ,

где

      || F || 2 ≤ k w ,

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

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

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

int main(void)
{
    /* Initialized data */
    static float a[25] /* was [5][5] */ = { 1.f,2.f,0.f,0.f,0.f,32.f,1.f,1.f,
            0.f,0.f,0.f,0.f,1.f,0.f,0.f,1.f,1.f,1.f,1.f,1.f,0.f,0.f,0.f,0.f,
            1.f };

    /* Local variables */
    extern int amb1r_c(int *, int *, float *, int *, int *, float *);
    static int i__;
    static float scale[5];
    static int igh, low;

#define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6]

    amb1r_c(&c__5, &c__5, a, &low, &igh, scale);

    for (i__ = 1; i__ <= 5; ++i__) {
         printf("\n  %14.7e %14.7e %14.7e %14.7e %14.7e \n",
                a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3),
                a_ref(i__, 4), a_ref(i__, 5));
    }
    printf("\n  %5i %5i \n", low, igh);
    for (i__ = 1; i__ <= 5; ++i__) {
         printf("\n  %14.7e \n", scale[i__-1]);
    }
    return 0;
} /* main */


Результаты:

                    |  1.   0.25    0.    0.    1. |
                    |  0.    1.       8.    0.    4. |
      a_ref  =  |  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.)