Подпрограмма: afh1r_c
Назначение
Треугольное разложение положительно определенной
симметричной матрицы методом квадратного корня (методом Холецкого) с
компактной формой представления симметричной и треугольной
матриц.
Математическое описание
Заданная положительно опpeдeлeнная симметричная матрица А
приводится к действительной невырожденной нижней треугольной
матрице L, такой, что LLT = А,
методом квадратного корня (методом Холецкого).
В.В.Воеводин, Численные методы алгебры (теория и алгорифмы),
"Наука", М., 1966 г.
Использование
int afh1r_c (real *a, integer *n, integer *ierr)
Параметры
a -
|
вектор длины n * (n + 1) / 2,
в котором содержится заданная матрица, записанная в компактной форме;
по окончании работы подпрограммы в массиве a
запоминается также в компактной форме нижняя
треугольная матрица L (тип: вещественный);
|
n -
|
порядок матрицы (тип: целый);
|
ierr -
|
целая переменная, служащая для сообщения об
ошибках, обнаруженных в ходе работы подпрограммы; при этом:
|
ierr=65 -
|
если исходная матрица не является
положительно определенной.
|
Версии
afh1d_c -
|
треугольное разложение положительно
определенной симметричной матрицы методом квадратного
корня с компактной формой представления
симметричной и треугольной матриц с повышенной точностью.
|
afh1c_c -
|
треугольное разложение положительно
определенной эрмитовой матрицы методом квадратного корня
с компактной формой представления матриц.
|
Вызываемые подпрограммы
utaf10_c -
|
подпрограмма выдачи диагностических сообщений
при работе подпрограмм afh1r_c, afh1c_c .
|
utaf11_c -
|
подпрограмма выдачи диагностических сообщений
при работе подпрограмм afh1d_c, afh1p_c .
|
Замечания по использованию
|
Для подпрограммы afh1d_c параметр a должен тиметь тип
double, а для afh1c_c - тип complex.
|
Пример использования
int main(void)
{
/* Initialized data */
static float a[6] = { 1.f,2.f,20.f,3.f,26.f,70.f };
/* Local variables */
static int ierr, i__;
extern int afh1r_c(float *, int *, int *);
for (i__ = 0; i__ <= 3; i__+=3) {
printf("\n %6.2f %6.2f %6.2f \n",
a[i__], a[i__+1], a[i__+2]);
}
afh1r_c(a, &c__3, &ierr);
for (i__ = 0; i__ <= 3; i__+=3) {
printf("\n %6.2f %6.2f %6.2f \n",
a[i__], a[i__+1], a[i__+2]);
}
printf("\n %5i \n", ierr);
return 0;
} /* main */
Результаты: a = (1., 2., 4., 3., 5., 6.), ierr = 0