Текст подпрограммы и версий aib1r_c.zip aib1d_c.zip |
Тексты тестовых примеров taib1r_c.zip taib1d_c.zip |
Обращение ленточной матрицы, заданной в компактной форме, с выбором ведущего элемента по столбцу.
Подпрограмма aib1r_c вычисляет матрицу B, такую что А*В = Е, где А - исходная ленточная, а Е - единичная матрицы. Обращение осуществляется с выбором главного элемента по столбцу.
Дж.Х.Уилкинсон, Алгебраическая проблема собственных значений. "Наука", М., 1970.
int aib1r_c (real *a, real *ainv, integer *n, integer *nlc, integer *nuc, real *r__, integer *ierr)
Параметры
a - | вещественный двумерный массив размера n на (nlc+nuc+1), в котором содержится заданная матрица, записанная в компактной форме; |
b - | вещественный двумерный массив размера n на n, в котором записывается вычисленная обратная матрица; |
n - | порядок матрицы (тип: целый); |
nlc - | число ненулевых диагоналей матрицы, расположенных под главной диагональю (тип: целый); |
nuc - | число ненулевых диагоналей матрицы, расположенных над главной диагональю (тип: целый); |
r - | вещественный двумерный массив размера n на (nlc+1), используемый как рабочий; |
ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
ierr=65 - | если заданная матрица является алгоритмически сингулярной. |
Версии
aib1d_c - | обращение ленточной матрицы, заданной в компактной форме с удвоенной точностью. Используется выбор ведущего элемента по столбцу. |
Вызываемые подпрограммы
utbf10_c - | подпрограмма печати диагностических сообщений при работе подпрограммы aib1r_c; |
utbf11_c - | подпрограмма печати диагностических сообщений при работе подпрограммы aib1d_c. |
Замечания по использованию
При работе подпрограммы исходная матрица не сохраняется. На место вектора a помещается его треугольное разложение. Для подпрограммы aib1d_c параметры a, b, r должны иметь тип double. |
int main(void) { /* Initialized data */ static float a[9] /* was [3][3] */ = { 0.f,1.f,2.f,1.f,3.f,3.f,-1.f, -2.f,0.f }; /* Local variables */ static int ierr, i__; extern int aib1r_c(float *, float *, int *, int *, int *, float *, int *); static float b[9] /* was [3][3] */, r__[6] /* was [3][2] */; for (i__ = 0; i__ <= 6; i__+=3) { printf("\n %10.4f %10.4f %10.4f \n", a[i__], a[i__+1], a[i__+2]); } aib1r_c(a, b, &c__3, &c__1, &c__1, r__, &ierr); for (i__ = 0; i__ <= 6; i__+=3) { printf("\n %10.4f %10.4f %10.4f \n", b[i__], b[i__+1], b[i__+2]); } printf("\n %5i \n", ierr); return 0; } /* main */ Результаты: b = (0.8125, -0.1875, 0.125, 0.1875, 0.1875, -0.125, 0.125, 0.125, 0.25), ierr = 0