Текст подпрограммы и версий
afg2r_c.zip , afg2d_c.zip , afg2c_c.zip
Тексты тестовых примеров
tafg2r_c.zip , tafg2d_c.zip , tafg2c_c.zip

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

Назначение

Треугольное разложение вещественной матрицы методом Гаусса с выбором ведущего элемента по всей матрице.

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

Для заданной матрицы a выпoлняется факторизация вида QАT = LU, где Q и Т  - вычисляемые матрицы перестановок, L - нижняя, U - верхняя треугольные матрицы. Матрица L имеет единичные диагональные элементы. Матрицы Q и Т осуществляют соответственно перестановку строк и столбцов исходной матрицы и обеспечивают стратегию выбора ведущего элемента по всей матрице.

В.В.Воеводин, Р.В.Петрина, Комплекс алгоритмов, основанных на преобразованиях типа Гаусса, в пакете линейной алгебры, Сб. "Численный анализ на ФОРТРАНе", вып.3, Изд-во МГУ, 1973.

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

    int afg2r_c (real *a, integer *s, integer *n)

Параметры

a - двумерный n*n массив, в котором задается исходная матрица (тип: real); по окончании работы подпрограммы в массиве a на соответствующих местах запоминаются элементы матрицы u и поддиагональные элементы матрицы l;
s - двумерный n*2 массив, в столбцах которого запоминаются векторы, порождающие матрицы перестановок; при этом в s (k,1) и s (k,2) запоминаются соответственно номера строки и столбца, переставленных на K - ом шаге с K - ой строкой и K - ым столбцом (тип: целый);
n - заданный порядок исходной матрицы (тип: целый);

Версии

afg2d_c - треугольное разложение матрицы, заданной с удвоенной точностью, методом Гаусса с выбором ведущего элемента по всей матрице.
afg2c_c - треугольное разложение комплексной матрицы методом Гаусса с выбором ведущего элемента по всей матрице.

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

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

  1. 

В подпрограмме afg2d_c массив a имеет тип double.

  2. 

В подпрограмме afg2c_c массив a имеет тип complex.

  3.  Поскольку факторизация Гаусса требует n - 1 шагов, то s (n, i) = 0,  i = 1, 2.

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

int main(void)
{
    /* Initialized data */
    static float a[16] /* was [4][4] */ = { 7.9f,8.5f,4.3f,3.2f,5.6f,-4.8f,
                       4.2f,-1.4f,5.7f,.8f,-3.2f,-8.9f,-7.2f,3.5f,9.3f,3.3f };
    /* Local variables */
    extern int afg2r_c(float *, int *, int *);
    static int i__, s[8] /* was [4][2] */;

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

    afg2r_c(a, s, &c__4);

    for (i__ = 1; i__ <= 4; ++i__) {
        printf("\n  %15.7e %15.7e %15.7e %15.7e \n",
           a_ref(i__,1), a_ref(i__,2), a_ref(i__,3), a_ref(i__,4));
    }
    return 0;
} /* main */


Результат:

                      |  9.300    4.300    4.200  -3.200 |
                      | -0.774  11.229    8.852   3.223 |
      a_ref  =    |  0.376   0.613  -11.805   0.029 |  ;
                      |  0.355   0.149     0.357  -8.255 |

                 | 34 |
                 | 34 |
      s  =    | 34 | ;
                 |   0 |

 это означает, что

                 |  1          0         0         0 |
                 | -0.774  1         0         0 |
      l  =    |  0.376   0.613  1         0 |  ;
                 |  0.355   0.149  0.357  1 |

                 | 9.300   4.300    4.200  -3.200 |
                 | 0         11.229    8.852   3.223 |
      u  =    | 0           0       -11.805   0.029 | 
                 | 0           0           0.       -8.255 |