Текст подпрограммы и версий
afg1r_c.zip , afg1d_c.zip , afg1c_c.zip
Тексты тестовых примеров
tafg1r_c.zip , tafg1d_c.zip , tafg1c_c.zip

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

Назначение

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

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

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

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

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

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

Параметры

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

Версии

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

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

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

  1. 

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

  2. 

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

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

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

int main(void)
{
    /* Initialized data */
    static float pa[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 afg1r_c(float *, int *, int *);
    static int i__, s[4];

#define pa_ref(a_1,a_2) pa[(a_2)*4 + a_1 - 5]

    afg1r_c(pa, s, &c__4);

    for (i__ = 1; i__ <= 4; ++i__) {
        printf("\n  %10.5f %10.5f %10.5f %10.5f \n",
           pa_ref(i__,1), pa_ref(i__,2), pa_ref(i__,3), pa_ref(i__,4));
    }
        printf("\n  %5i %5i %5i %5i \n", s[0], s[1], s[2], s[3]);
    return 0;
} /* main */


Результат:

                        | 8.500  -4.800    0.800     3.500  |
                        | 0.929  10.061   4.956  -10.453  |
      pa_ref  =    | 0.376    0.040  -9.402     2.405  |  ;
                        | 0.506    0.659   0.731    12.658 |

      s  =   (2, 2, 4, 0);

 это означает, что
  
                 | 1          0          0        0 |
                 | 0.929   1          0        0 |
      l  =    | 0.376   0.040   1        0  |  ;
                 | 0.506   0.659  0.731  1 |

                 | 8.500  -4.800   0.800       3.500  |
                 | 0         10.061   4.956   -10.453  |
      u  =    | 0           0         -9.402      2.405  |
                 | 0           0          0            12.658 |