Текст подпрограммы и версий
ash3r_c.zip , ash3d_c.zip , ash3c_c.zip , ass3c_c.zip
Тексты тестовых примеров
tash3r_c.zip , tash3d_c.zip , tash3c_c.zip , tass3c_c.zip

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

Назначение

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

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

Подпрограмма ash3r_c вычисляет решение системы N линейных алгебраических уравнений А*x = b где А - неособенная симметричная матрица, заданная в компактной форме, b - вектор правой части, методом квадратного корня.

Вunch J.R., Рarlett В.N., Direct Мethods for Solving Symmetric Indefinite Systems of Linear Еquations, SIАМ J. Numer. Аnal., Vol. 8, No. 4, December 1971.

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

    int ash3r_c (real *a, real *b, real *x, integer *n, integer *l,
             integer *ir, real *r, integer *ierr)

Параметры

a - вещественный вектор длины n на (n + 1)/2, в котором содержится заданная матрица, записанная в компактной форме;
b - вещественный вектор длины n, в котором задается правая часть;
x - вещественный вектор длины n, в котором содержится решение исходной системы;
n - заданный порядок матрицы (тип: целый);
l - целая переменая, которая задает режим работы подпрограммы; при этом:
l = 1 - если система с данной матрицей решается впервые;
l ≠ 1 - если система с данной матрицей решается повторно;
ir - целый вектор длины 2 на n, используемый как рабочий; если подпрограмма ash3r_c будет использоваться повторно, т.е. при l ≠ 1, компоненты вектора ir пользователь менять не имеет права;
r - вещественный вектор длины n, используемый как рабочий; если подпрограмма ash3r_c будет использоваться повторно, т.е. при l ≠ 1, компоненты вектора r пользователь менять не имеет права;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в процессе работы подпрограммы; при этом:
ierr=65 - если матрица является сингулярной.

Версии

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

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

utas10_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы ash3r_c;
utas11_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы ash3d_c;
utaf10_c - подпрограмма выдачи диагностических сообщений при работе подпрограмм ash3c_c и ass3c_c;
afh3r_c - разложение неособенной симметричной матрицы с компактной формой записи методом квадратного корня;
afh3d_c - разложение неособенной симметричной матрицы, записанной в компактной форме, методом квадратного корня с повышенной точностью;
afh3c_c - разложение неособенной эрмитовой матрицы с компактной формой записи методом квадратного корня;
afs3c_c - разложение неособенной симметричной комплексной матрицы с компактной формой записи методом квадратного корня.

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

 

При работе подпрограммы исходная матрица A не сохраняется. На месте матрицы A помещается ее треугольное разложение, полученное подпрограммами afh3r_c, afh3d_c, afs3c_c и afh3c_c.

Подпрограммы ash3r_c, ash3d_c, ash3c_c и ass3c_c позволяют помещать вычисленное решение x на место правой части b.

Для подпрограммы ash3d_c параметры a, b и x должны иметь тип double.

Для подпрограмм ash3c_c и ass3c_c параметры a, b и x должны иметь тип complex.

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

int main(void)
{
    /* Initialized data */
    static float a[6] = { 1.f,.5f,-1.f,3.f,2.f,1.f };
    static float b[3] = { -1.f,-3.5f,6.f };

    /* Local variables */
    static int ierr;
    extern int ash3r_c(float *, float *, float *, int *, int *, int *,
                       float *, int *);
    static int l, n, i__;
    static float r__[3], x[3];
    static int ir[6];

    for (i__ = 0; i__ <= 3; i__+= 3) {
         printf("\n  %16.7e %16.7e %16.7e \n",
                a[i__], a[i__+1], a[i__+2]);
    }
    for (i__ = 1; i__ <= 3; ++i__) {
         printf("\n  %16.7e \n", b[i__-1]);
    }
    n = 3;
    l = 1;
    ash3r_c(a, b, x, &n, &l, ir, r__, &ierr);

    for (i__ = 1; i__ <= 3; ++i__) {
         printf("\n  %16.7e \n", x[i__-1]);
    }
    printf("\n  %5i \n", ierr);
/* l2: */
    return 0;
} /* main */


Результаты:

      x  =   (1., 2., -1.) , 
      ierr  =  0