Подпрограмма: afb1r_c
Назначение
Треугольное разложение ленточной матрицы, заданной в
компактной форме, с выбором ведущего элемента по столбцу.
Математическое описание
Заданная в компактной формe лeнтoчная матрица А приводится к
ленточной верхней треугольной матрице U при помощи
элементарного преобразования L так, что LU = А.
Матрица L является ленточной нижней треугольной с единичными
диагональными элементами.
Дж.Х.Уилкинсон, Алгебраическая проблема собственных
значений, "Наука", М., 1970.
Использование
int afb1r_c (real *a, integer *n, integer *nlc, integer *nuc,
real *r, integer *ierr)
Параметры
a -
|
вещественный двумерный массив размера
n *(nlc + nuc + 1), в котором
содержится заданная матрица, записанная в компактной форме; по
окончании работы подпрограммы в массиве a запоминается
также в компактной форме ленточная верхняя
треугольная матрица U (в первых nuc + 1 столбцах);
|
n -
|
порядок матрицы (тип: целый);
|
nlc -
|
число ненулевых диагоналей, расположенных под
главной диагональю (тип: целый);
|
nuc -
|
число ненулевых диагоналей, расположенных над
главной диагональю (тип:целый);
|
r -
|
вещественный двумерный массив размера
n * (nlc + 1), используемый как рабочий;
по окончании работы подпрограммы в первых n*nlc
компонентах массива r содержится нижняя треугольная
ленточная матрица L;
|
ierr -
|
целая переменная, служащая для сообщения об
ошибках, обнаруженных в ходе работы подпрограммы; при этом:
|
ierr=65 -
|
если заданная матрица является алгоритмически сингулярной.
|
Версии
afb1d_c -
|
треугольное разложение ленточной матрицы,
заданной в компактной форме с удвоенной точностью
(выбор ведущего элемента по столбцу).
|
Вызываемые подпрограммы
utbf10_c -
|
подпрограмма выдачи диагностических сообщений
при работе подпрограммы afb1r_c.
|
utbf11_c -
|
подпрограмма выдачи диагностических сообщений
при работе подпрограммы afb1d_c.
|
Замечания по использованию
|
Для подпрограммы afb1d_c параметры a и r должны иметь тип
double.
|
Пример использования
int main(void)
{
/* Initialized data */
static float a[9] /* was [3][3] */ = { 0.f,2.f,1.f,1.f,5.f,17.f,2.f,1.f,
0.f };
/* Local variables */
static int ierr;
extern int afb1r_c(float *, int *, int *, int *, float *, int *);
static int i__, j;
static float r__[6] /* was [3][2] */;
#define r___ref(a_1,a_2) r__[(a_2)*3 + a_1 - 4]
for (i__ = 1; i__ <= 3; ++i__) {
for (j = 1; j <= 2; ++j) {
/* l8: */
r___ref(i__, j) = 0.f;
}
}
for (i__ = 0; i__ <= 6; i__+= 3) {
printf("\n %12.4e %12.4e %12.4e \n",
a[i__], a[i__ + 1], a[i__ + 2]);
}
afb1r_c(a, &c__3, &c__1, &c__1, r__, &ierr);
for (i__ = 0; i__ <= 6; i__+= 3) {
printf("\n %12.4e %12.4e %12.4e \n",
a[i__], a[i__ + 1], a[i__ + 2]);
}
for (i__ = 0; i__ <= 3; i__+= 3) {
printf("\n %12.4e %12.4e %12.4e \n",
r__[i__], r__[i__ + 1], r__[i__ + 2]);
}
printf("\n %5i \n", ierr);
return 0;
} /* main */
Результаты:
a = (1., 25., 16., 3., 5., 0., 0., 0., 0.),
r__ = (0., -1., 0.4, 1., 2., 3.),
ierr = 0