Текст подпрограммы и версий 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