Текст подпрограммы и версий
ask1r_c.zip , ask1d_c.zip , ask1c_c.zip
Тексты тестовых примеров
task1r_c.zip , task1d_c.zip , task1c_c.zip

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

Назначение

Решение вещественной системы линейных алгебраических уравненений Ax = b с клеточно - теплицевой матрицей A специального вида.

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

Матрица А состоит из Р нa Р клеток размера М на М. В силу клеточно - теплицевости А полностью определяется своими первой клеточной строкой и первым клеточным столбцом.

Обозначим SK, RK, 1 ≤ К ≤ Р соответственно К - ю клетку первой клеточной строки и К - ю клетку первого клеточного столбца матрицы А. В данном случае под специальным видом матрицы А понимается выполнение соотношений

     RK = L SK N ,   1 ≤ K ≤ P , 

где L и N - некоторые фиксированные симметричные матрицы перестановок.

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

С.Н.Воеводина, Решение системы уравнений с клеточно-теплицевыми матрицами. Сб. "Вычислительные методы и программирование", вып.24, Изд-во МГУ, 1975.

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

    int ask1r_c (real *a1, real *b, real *y, real *b3, integer *l,
            integer *n, real *c, integer *q, integer *m, integer *p)

Параметры

a1 - трехмерный m на m на p массив, в котором задается первая клеточная строка матрицы системы (тип: вещественный);
b - двумерный m на p массив, в котором задается вектор правой части исходной системы (тип: вещественный);
y - двумерный m на p массив, в котором запоминается вектор вычисленного решения (тип: вещественный);
b3 - трехмерный m на m на p массив, используемый подпрограммой как рабочий (тип: вещественный);
l, n - векторы длины m, в которых задаются две матрицы перестановок (тип: целый);
c - трехмерный m на m на 3 массив, используемый подпрограммой как рабочий (тип: вещественный);
q - вектор длины m, используемый как рабочий (тип: целый);
m - заданный порядок клетки (тип: целый);
p - заданное число клеток в клеточной строке или столбце (тип: целый).

Версии

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

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

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

  1. 

В массиве b3 по окончании работы подпрограммы запоминается последний клеточный столбец матрицы, являющейся обратной для матрицы исходной системы.

  2. 

Вектор l определяет симметричную матрицу перестановок следующим образом: k - я компонента вектора l есть номер строки, которая переставляется с k - ой. Аналогично, k - я компонента вектора n есть номер столбца, переставляемого с k - м столбцом.

  3. 

В подпрограмме ask1d_c массивы a1, b, y, b3, c имеют тип double.

  4.  В подпрограмме ask1c_c массивы a1, b, y, b3, c имеют тип complex.

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

1.
int main(void)
{
    /* Initialized data */
    static float a1[27] /* was [3][3][3] */ = { 1.f,1.f,0.f,0.f,1.f,1.f,1.f,
            0.f,1.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,
            0.f,1.f,0.f,0.f };
    static float b[9] /* was [3][3] */ = { 3.f,2.f,2.f,2.f,2.f,2.f,3.f,2.f,
                                           2.f };
    static int l[3] = { 1,3,2 };
    static int n[3] = { 3,2,1 };

    /* Local variables */
    extern int ask1r_c(float *, float *, float *, float *, int *,
                       int *, float *, int *, int *, int *);
    static float c__[27] /* was [3][3][3] */;
    static int m, p, q[3], i__;
    static float y[9] /* was [3][3] */, b3[27] /* was [3][3][3] */;

    m = 3;
    p = 3;
    ask1r_c(a1, b, y, b3, l, n, c__, q, &m, &p);

    for (i__ = 0; i__ <= 6; i__+= 3) {
         printf("\n  %13.5e %13.5e %13.5e \n",
                y[i__], y[i__+1], y[i__+2]);
    }
    for (i__ = 0; i__ <= 6; i__+= 3) {
         printf("\n  %13.5e %13.5e %13.5e \n",
                b[i__], b[i__+1], b[i__+2]);
    }
    for (i__ = 0; i__ <= 24; i__+= 3) {
         printf("\n  %13.5e %13.5e %13.5e \n",
                a1[i__], a1[i__+1], a1[i__+2]);
    }
    for (i__ = 0; i__ <= 24; i__+= 3) {
         printf("\n  %13.5e %13.5e %13.5e \n",
                b3[i__], b3[i__+1], b3[i__+2]);
    }
    return 0;
} /* main */


Результат:

       y  =   (1., 1., 1., 1., 1., 1., 1., 1., 1.)

2.
int main(void)
{
    /* Initialized data */
    static double a1[12] /* was [2][2][3] */ = { 2.,1.,3.,2.,4.,2.,6.,
                                                 4.,-2.,-1.,-3.,-2. };
    static double b[6] /* was [2][3] */ = { 10.,6.,25.,15.,10.,6. };
    static int l[2] = { 1,2 };
    static int n[2] = { 1,2 };

    /* Local variables */
    extern int ask1d_c(double *, double *, double *, double *, int *,
                       int *, double *, int *, int *, int *);
    static double c__[12] /* was [2][2][3] */;
    static int m, p, q[2], i__;
    static double y[6] /* was [2][3] */, b3[12] /* was [2][2][3] */;

    m = 2;
    p = 3;
    ask1d_c(a1, b, y, b3, l, n, c__, q, &m, &p);

    for (i__ = 0; i__ <= 3; i__+= 3) {
         printf("\n  %13.5e %13.5e %13.5e \n",
                y[i__], y[i__+1], y[i__+2]);
    }
    for (i__ = 0; i__ <= 3; i__+= 3) {
         printf("\n  %13.5e %13.5e %13.5e \n",
                b[i__], b[i__+1], b[i__+2]);
    }
    for (i__ = 0; i__ <= 8; i__+= 4) {
         printf("\n  %13.5e %13.5e %13.5e %13.5e \n",
                a1[i__], a1[i__+1], a1[i__+2], a1[i__+3]);
    }
    for (i__ = 0; i__ <= 8; i__+= 4) {
         printf("\n  %13.5e %13.5e %13.5e %13.5e \n",
                b3[i__], b3[i__+1], b3[i__+2], b3[i__+3]);
    }
    return 0;
} /* main */

Результат:

       y  =   (1., 1., 1., 1., 1., 1.)

3.
int main(void)
{
    /* Initialized data */
    static complex a1[12] /* was [2][2][3] */ = { {2.f,0.f},{1.f,0.f},
          {3.f,0.f},{2.f,0.f},{4.f,0.f},{2.f,0.f},{6.f,0.f},{4.f,0.f},
          {-2.f,0.f},{-1.f,0.f},{-3.f,0.f},{-2.f,0.f} };
    static complex b[6] /* was [2][3] */ = { {10.f,0.f},{6.f,0.f},
                       {25.f,0.f},{15.f,0.f},{10.f,0.f},{6.f,0.f} };
    static int l[2] = { 1,2 };
    static int n[2] = { 1,2 };

    /* Local variables */
    extern int ask1c_c(complex *, complex *, complex *, complex *,
                       int *, int *, complex *, int *, int *, int *);
    static complex c__[12] /* was [2][2][3] */;
    static int m, p, q[2], i__;
    static complex y[6] /* was [2][3] */, b3[12] /* was [2][2][3] */;

    p = 3;
    m = 2;
    ask1c_c(a1, b, y, b3, l, n, c__, q, &m, &p);

    for (i__ = 0; i__ <= 4; i__+= 2) {
         printf("\n %13.5e %13.5e  %13.5e %13.5e \n",
                y[i__].r, y[i__].i, y[i__+1].r, y[i__+1].i);
    }
    for (i__ = 0; i__ <= 4; i__+= 2) {
         printf("\n %13.5e %13.5e  %13.5e %13.5e \n",
                b[i__].r, b[i__].i, b[i__+1].r, b[i__+1].i);
    }
    for (i__ = 0; i__ <= 10; i__+= 2) {
         printf("\n %13.5e %13.5e  %13.5e %13.5e \n",
                a1[i__].r, a1[i__].i, a1[i__+1].r, a1[i__+1].i);
    }
    for (i__ = 0; i__ <= 10; i__+= 2) {
         printf("\n %13.5e %13.5e  %13.5e %13.5e \n",
                b3[i__].r, b3[i__].i, b3[i__+1].r, b3[i__+1].i);
    }
    return 0;
} /* main */

Результат:

       y  =  ( (1., 0.),  (1., 0.),  (1., 0.),  (1., 0.),  (1., 0.),  (1., 0.) )