|
Текст подпрограммы и версий aih2r_c.zip aih2d_c.zip |
Тексты тестовых примеров taih2r_c.zip taih2d_c.zip |
Обращение положительно определенной симметричной ленточной матрицы с компактной формой представления с использованием метода квадратного корня (метода Холецкого).
Подпрограмма aih2r_c вычисляет матрицу В (симметричная, в компактной форме), такую, что А*В = Е, где А - исходная симметричная ленточная положительно определенная заданная в компактной форме, а Е - единичная матрицы. Используется метод квадратного корня (метод Холецкого).
В.В.Воеводин, Численные методы алгебры (теория и алгорифмы), Наука, М., 1966 г.
int aih2r_c (real *a, real *ainv, integer *n, integer *nc,
integer *ierr)
Параметры
| a - | вещественный двумерный массив размера n на (nc+1), в котором содержится заданная матрица, записанная в компактной форме; |
| ainv - | вещественный вектор размерности n на (n+1)/2, в котором запоминается вычисленная обратная матрица в компактной форме; |
| n - | порядок матрицы (тип: целый); |
| nc - | число ненулевых диагоналей заданной матрицы по одну сторону от главной диагонали (тип: целый); |
| ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
| ierr=65 - | если заданная матрица не является положительно определенной. |
Версии
| aih2d_c - | обращение положительно определенной симметричной ленточной матрицы с компактной формой представления с использованием метода квадратного корня (метод Холецкого) с повышенной точностью. |
Вызываемые подпрограммы
| utai10_c - | подпрограмма печати диагностических сообщений при работе подпрограммы aih2r_c; |
| utai11_c - | подпрограмма печати диагностических сообщений при работе подпрограммы aih2d_c; |
Замечания по использованию
|
При работе подпрограммы исходная матрица не сохраняется. На место вектора a помещается ее треугольное разложение, полученное методом квадратного корня (методом Холецкого). Для подпрограммы aih2d_c параметры a, ainv должны иметь тип double. |
int main(void)
{
/* Initialized data */
static float a[6] /* was [3][2] */ = { 0.f,-1.f,-1.f,2.f,2.f,2.f };
/* Local variables */
static int ierr, i__;
extern int aih2r_c(float *, float *, int *, int *, int *);
static float b[6];
for (i__ = 1; i__ <= 6; ++i__) {
printf("\n %10.2f \n", a[i__-1]);
}
aih2r_c(a, b, &c__3, &c__1, &ierr);
for (i__ = 1; i__ <= 6; ++i__) {
printf("\n %12.4f \n", b[i__-1]);
}
printf("\n %5i \n", ierr);
return 0;
} /* main */
Результаты: ainv = (0.75, 0.5, 1., 0.25, 0.5, 0.75),
ierr = 0