|
Текст подпрограммы и версий ask3c_c.zip |
Тексты тестовых примеров task3c_c.zip |
Решение системы линейных алгебраических уравнений с клеточно - циркулянтной матрицей.
Решается система А*x = b с клеточно - циркулянтной матрицей А (см. [1]), состоящей из L на L клеток общего вида размера М на М. В основе алгорифма лежит подобное преобразование матрицы А к клеточно - диагональной матрице тех же размеров. Тем самым решение исходной системы порядка М на L сводится к решению L систем порядка М (см. [2]).
1. В.В.Воеводин. Вычислительные основы линейной алгебры. М., Наука, 1977.
2. С.Н.Воеводина. Решение системы уравнений с клеточно - теплицевыми матрицами. В сб. "Вычислительные методы и программирование", вып. 24, Изд-во МГУ, 1975.
int ask3c_c (complex *a, complex *x, complex *r, integer *m,
integer *l)
Параметры
| a - | комплексный одномерный массив длины m2*l, в котором задается матрица системы следующим образом. Массив a делится на l кусков длины m2. В i - ом куске, i = 1, ..., l, записывается по столбцам i - ая клетка первой клеточной строки исходной матрицы; |
| x - | комплексный одномерный массив длины m на l, в котором задается правая часть; на выходе из подпрограммы в x получается решение; |
| r - | комплексный одномерный рабочий массив длины max (z, l), где z - целая часть числа (m + 1)/2; |
| m - | порядок клетки (тип: целый); |
| l - | клеточный порядок исходной матрицы (тип: целый). |
Версии: нет
Вызываемые подпрограммы
| asg1c_c - | решение комплексной системы линейных алгебраических уравнений методом Гаусса с выбором по столбцу. |
Замечания по использованию
| В подпрограмме ask3c_c используются служебные подпрограммы ar01c_c, ar02c_c. |
int main(void)
{
/* Initialized data */
static complex a[8] = { {1.f,1.f},{2.f,2.f},{2.f,2.f},{1.f,1.f},{2.f,2.f},
{4.f,4.f},{4.f,4.f},{2.f,2.f} };
static complex x[4] = { {9.f,9.f},{9.f,9.f},{9.f,9.f},{9.f,9.f} };
/* Local variables */
extern int ask3c_c(complex *, complex *, complex *, int *, int *);
static int l, m, i__;
static complex r__[2];
m = 2;
l = 2;
ask3c_c(a, x, r__, &m, &l);
for (i__ = 0; i__ <= 2; i__+= 2) {
printf("\n %16.8e %16.8e %16.8e %16.8e \n",
x[i__].r, x[i__].i, x[i__+1].r, x[i__+1].i);
}
return 0;
} /* main */
Результаты:
x = ( (1., 0.), (1., 0.), (1., 0.), (1., 0.) )