Текст подпрограммы и версий
asg9r_c.zip , asg9d_c.zip , asg9c_c.zip
Тексты тестовых примеров
tasg9r_c.zip , tasg9d_c.zip , tasg9c_c.zip

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

Назначение

Решение вещественной системы линейных алгебраических уравнений A*x = b или AT*x = b с матрицей A общего вида методом Гаусса с выбором ведущего элемента по столбцу.

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

Для заданной вещественной квaдpaтной матрицы А порядка N выполняется треугольная факторизация L- 1*А = U , где U - веpхняя тpеугольная матpица, и затем последовательно pешаются cиcтемы:

        L*y = B
 (для системы АT*x = b решается UT*y = b) и
        U*x = y
 (для АT*x = b решается LT*x = y) . 

Дж.Форсайт, М.Малькольм, К.Моулер. Машинные методы математических вычислений. М., Мир, 1980.

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

    int asg9r_c (real *a, integer *m, integer *n, integer *nlead,
            real *b, integer *ltr, integer *l, integer *ierr)

Параметры

a - вещественный двумерный массив размера m на n, в котором задается исходная матрица; на выходе на соответствующих местах находятся элементы матрицы U и поддиагональные элементы матрицы исключения метода Гаусса  Li ,  i = 1, ..., n - 1 ;
m - первая размерность массива a в вызывающей подпрограмме (тип: целый);
n - порядок матрицы системы (тип: целый);
nlead - целый вектор длины n, содержащий на выходе информацию о выполненных в ходе факторизации перестановках (см. замечания по использованию);
b - вещественный вектор длины n, в котором задается правая часть системы; на выходе содержит вычисленное решение системы (см. замечания по использованию);
ltr - задается вид решаемой системы (тип: целый), при этом:
ltr = 0 - если решается система A*x = b ;
ltr ≠ 0 - если решается система AT*x = b;
l - признак решаемой системы (тип: целый), при этом:
l = 0 - если система с данной матрицей решается впервые;
l ≠ 0 - если система с данной матрицей решается повторно;
ierr - целая переменная, содержащая на выходе информацию о прохождении счета, при этом:
ierr=65 - если m ≤ 0 или n ≤ 0 ;
ierr=66 - если в процессе счета возникло переполнение (это говорит о том, что либо некоторые элементы матрицы U, либо некоторые компоненты решения превосходят по абсолютной величине максимальное представимое на данной машине число);
ierr=-k - если в результате факторизации в k - ой строке матрицы U диагональный элемент равен нулю (это свидетельствует о вырожденности матрицы A). Если таких строк у матрицы U несколько, то значение k полагается равным номеру последней из них;
ierr=67 - если система несовместна (см. замечания по использованию).

Версии

asg9d_c - решение системы линейных алгебраических уравнений A*x = b или AT*x = b методом Гаусса с выбором ведущего элемента по столбцу для вещественных A и b, заданных с удвоенной точностью.
asg9c_c - решение системы линейных алгебраических уравнений A*x = b или AT*x = b методом Гаусса с выбором ведущего элемента по столбцу для комплексных A и b.

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

afg5r_c - подпрограмма треугольной факторизации матрицы A;
utafsi_c - подпрограмма выдачи диагностических сообщений.

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

  1. 

В подпрограмме asg9d_c массивы a и b имеют тип double, для треугольного разложения матрицы A вызывается подпрограмма afg5d_c.

  2. 

В подпрограмме asg9c_c массивы a и b имеют тип complex, для треугольного разложения матрицы a вызывается подпрограмма afg5c_c.

  3. 

На выходе k - ый элемент вектора nlead равен номеру строки, переставленной на k - ом шаге факторизации с k - й строкой матрицы A. Так как факторизация Гаусса требует n - 1 шагов, то nlead (n) = n .

  4. 

Если задано l ≤ 0, т.е. система решается повторно, то треугольная факторизация не выполняется, и поэтому в качестве матрицы A при обращении к подпрограмме нужно взять результат предыдущего обращения к asg9r_c или к afg5r_c.

  5.  Если вырабатывается значение переменной ierr, отличное от нуля, то выдается соответствующее диагностическое сообщение и, если ierr > 0, то происходит выход из подпрограммы. Если система совместна, но матрица A вырождена (ierr < 0), т.е. для некоторых номеров k  U (k, k) = 0., то полагается x (k) = 1.

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

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 };
    static float b[4] = { 7.f,7.f,7.f,7.f };

    /* Local variables */
    static int ierr;
    extern int asg9r_c(float *, int *, int *, int *, float *, int *,
                       int *, int *);
    static int i__, l, m, n, nlead[4], ltr;

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

    m = 4;
    n = m;
    ltr = 0;
    l = 0;
    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));
    }
    for (i__ = 1; i__ <= 4; ++i__) {
         printf("\n  %15.7e \n", b[i__-1]);
    }
    asg9r_c(a, &m, &n, nlead, b, <r, &l, &ierr);

    printf("\n  %5i %5i %5i %5i \n",
           nlead[0], nlead[1], nlead[2], nlead[3]);
    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));
    }
    printf("\n  %5i \n", ierr);
    for (i__ = 1; i__ <= 4; ++i__) {
         printf("\n  %15.7e \n", b[i__-1]);
    }
    return 0;
} /* main */


Результат:

                    |   8.5          -4.8             0.8             3.5         |
                    | -0.92941   10.06118    4.95647  -10.45294 |
      a_ref  =  | -0.50588   -0.65879   -9.40171    2.40526  |
                    | -0.37647   -0.04046   -0.73072   12.65817 |

      nlead  =   (2, 2, 4, 4)

               |  1.023054 |
               |  0.273777 |
      b  =  | -0.462957 |
               | -0.003275 |