|
Текст подпрограммы и версий ast2r_c.zip , ast2d_c.zip , ast2c_c.zip |
Тексты тестовых примеров tast2r_c.zip , tast2d_c.zip , tast2c_c.zip |
Решение вещественной системы линейных алгебраических уравнений Ax = b с трехдиагональной матрицей A.
Для заданной в компактной фopмe вещественной трехдиагональной матрицы А порядка N выполняется треугольная факторизация Гаусса L- 1А = U, где U - верхняя треугольная ленточная матрица, и затем решается система Ux = L- 1b.
Дж.Форсайт, М.Малькольм, К.Моулер. Машинные методы математических вычислений. М.: Мир, 1980.
int ast2r_c (real *a, integer *m, integer *n, real *b,
integer *ierr)
Параметры
| a - | вещественный двумерный массив размера m на 3, в котором задается в компактном виде исходная трехдиагональная матрица порядка n; на выходе содержит в компактном виде верхнюю треугольную ленточную матрицу U; |
| m - | первая размерность массива a в вызывающей программе (тип: целый); |
| n - | порядок матрицы A (тип: целый); |
| b - | вещественный вектор длины n, в котором задается правая часть системы; на выходе содержит вычисленное решение системы (см. замечания по использованию); |
| ierr - | целая переменная, содержащая на выходе информацию о прохождении счета, при этом: |
| ierr=65 - | если m ≤ 0 или n ≤ 0; |
| ierr=66 - | если в процессе работы произошло переполнение (это говорит о том, что некоторые элементы матрицы U, либо некоторые компоненты решения системы превосходят по абсолютной величине максимальное представимое на данной машине число); |
| ierr=-k - | если в результате факторизации в k - ой строке матрицы U диагональный элемент равен нулю (это свидетельствует о вырожденности матрицы A); если таких строк у матрицы U несколько, то значение k полагается равным номеру последней из них (см. замечания по использованию); |
| ierr=67 - | если система несовместна. |
Версии
| ast2d_c - | решение системы линейных алгебраических уравнений Ax = b с трехдиагональной матрицей A, заданной в компактной форме, для вещественных a и b, заданных с удвоенной точностью. |
| ast2c_c - | решение системы линейных алгебраических уравнений Ax = b с трехдиагональной матрицей A, заданной в компактной форме, для комплексных a и b. |
Вызываемые подпрограммы
| utafsi_c - | подпрограмма выдачи диагностических сообщений. |
Замечания по использованию
| 1. |
В подпрограмме ast2d_c массивы a и b имеют тип double. | |
| 2. |
В подпрограмме ast2c_c массивы a и b имеют тип complex. | |
| 3. | Если вырабатывается значение переменной ierr, отличное от нуля, то выдается соответствующее диагностическое сообщение, и если ierr > 0, то происходит выход из подпрограммы. Если система совместна, но матрица A вырождена, т.е. для некоторых номеров k существуют U (k, k) = 0., то полагается b (k) = 1. |
int main(void)
{
/* System generated locals */
int i__1, i__2, i__3;
/* Local variables */
static int ierr;
extern int ast2r_c(float *, int *, int *, float *, int *);
static float a[15] /* was [5][3] */, b[5];
static int i__, j, k, m, n;
static float z__[5];
static int j0, j1;
#define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6]
m = 5;
n = 5;
i__1 = m;
for (i__ = 1; i__ <= i__1; ++i__) {
z__[i__ - 1] = (float) i__;
/* Computing max */
i__2 = 1, i__3 = i__ - 1;
j0 = max(i__2,i__3);
/* Computing min */
i__2 = n, i__3 = i__ + 1;
j1 = min(i__2,i__3);
i__2 = j1;
for (j = j0; j <= i__2; ++j) {
k = j - i__ + 2;
a_ref(i__, k) = (float) (i__ * 10 + j);
/* l3: */
}
/* l4: */
}
a_ref(1, 1) = 0.f;
a_ref(5, 3) = 0.f;
i__1 = m;
for (i__ = 1; i__ <= i__1; ++i__) {
b[i__ - 1] = 0.f;
for (k = 1; k <= 3; ++k) {
j = k + i__ - 2;
b[i__ - 1] += a_ref(i__, k) * z__[j - 1];
/* l5: */
}
/* l6: */
}
for (i__ = 1; i__ <= 5; ++i__) {
printf("\n %12.4e %12.4e %12.4e \n",
a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3));
}
printf("\n %12.4e %12.4e %12.4e %12.4e %12.4e \n",
z__[0], z__[1], z__[2], z__[3], z__[4]);
printf("\n %12.4e %12.4e %12.4e %12.4e %12.4e \n",
b[0], b[1], b[2], b[3], b[4]);
ast2r_c(a, &m, &n, b, &ierr);
printf("\n %12.4e %12.4e %12.4e %12.4e %12.4e \n",
b[0], b[1], b[2], b[3], b[4]);
printf("\n %5i \n", ierr);
return 0;
} /* main */
Результат:
b = ( 1., 2., 3., 4., 5. )