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