|
Текст подпрограммы и версий ask2c_c.zip |
Тексты тестовых примеров task2c_c.zip |
Решение комплексной системы линейных алгебраических уравнений A*x = b с клеточно - теплицевой матрицей a специального вида.
Матрица А состоит из Р нa Р клеток размера М на М. Обозначим SK, RK, 1 ≤ К ≤ Р, соответственно К - ю клетку первой клеточной cтроки и К - ю клетку первого клеточного столбцa матрицы А. В данном случае под специальным видом клеточно - теплицевой матрицы А понимается выполнение соотношений
RK = ( LSKN )* , 1 ≤ K ≤ P ,
где L и N - фиксированные симметрические матрицы престановок (" * " означает комплексное сопряжение).
В подпрограмме реализован алгорифм, который является видоизменением вычислительной схемы алгорифма для решения системы уравнений с клеточно - теплицевой матрицей общего вида. Это видоизменение обеспечивает значительную экономию памяти ЭВМ.
С.Н.Воеводина, Решение системы уравнений с клеточно - теплицевыми матрицами. Сб. "Вычислительные методы и программирование", вып.24, Изд-во МГУ, 1975.
int ask2c_c (complex *a1, complex *b, complex *y, complex *b3,
integer *l, integer *n, complex *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 - | заданное число клеток в клеточной строке или столбце (тип: целый). |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
| 1. |
В массиве b3 по окончании работы подпрограммы запоминается последний клеточный столбец матрицы, являющейся обратной для матрицы исходной системы. | |
| 2. | Вектор l определяет симметрическую матрицу перестановок следующим образом: k - я компонента вектора l есть номер строки, которая переставляется с k - й. Аналогично, k - я компонента вектора n есть номер столбца переставляемого с k - м столбцом. |
int main(void)
{
/* Initialized data */
static complex a1[12] /* was [2][2][3] */ = { {1.f,0.f},{0.f,0.f},
{0.f,0.f},{1.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,0.f},{0.f,1.f},{1.f,0.f} };
static complex b[6] /* was [2][3] */ = { {2.f,1.f},{2.f,0.f},{1.f,0.f},
{1.f,0.f},{2.f,0.f},{2.f,-1.f} };
static int l[2] = { 2,1 };
static int n[2] = { 2,1 };
/* Local variables */
extern int ask2c_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;
ask2c_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.) )