Текст подпрограммы и версий asb1r_c.zip , asb1d_c.zip |
Тексты тестовых примеров tasb1r_c.zip , tasb1d_c.zip |
Решение системы линейных алгебраических уравнений с ленточной матрицей, заданной в компактной форме, c выбором ведущего элемента по столбцу.
Подпрограмма asb1r_c вычисляет решение системы N линейных алгебраических уравнений А*x = b, где А - ленточная матрица, заданная в компактной форме, b - вектор правой части. Решение вычисляется с выбором главного элемента по столбцу.
Дж.Х.Уилкинсон, Алгебраическая проблема собственных значений, "Наука", М., 1970.
int asb1r_c (real *a, real *b, real *x, integer *n, integer * nlc, integer *nuc, integer *l, real *r, integer *ierr)
Параметры
a - | вещественный двумерный массив размера n на (nlc + nuc + 1), в котором содержится заданная матрица, записанная в компактной форме; |
b - | вещественный вектор длины n, в котором содержится правая часть исходной системы; |
x - | вещественный вектор длины n, в котором содержится искомое решение исходной системы; |
n - | заданный порядок матрицы (тип: целый); |
nlc - | число ненулевых диагоналей, расположенных под главной диагональю (тип: целый); |
nuc - | число ненулевых диагоналей, расположенных над главной диагональю (тип: целый); |
l - | задает режим работы подпрограммы (тип: целый); при этом: |
l = 1 - | если система с данной матрицей решается впервые; |
l ≠ 1 - | если система с данной матpицей pешается повторно; |
r - | вещественный двумерный массив размера n на (nlc + 1), используемый как рабочий; |
ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
ierr=65 - | если заданная матрица является сингулярной. |
Версии
asb1d_c - | решение системы линейных алгебраических уравнений с ленточной матрицей, заданной в компактной форме, с удвоенной точностью (выбор ведущего элемента по столбцу). |
Вызываемые подпрограммы
utbf10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы asb1r_c; |
utbf11_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы asb1d_c; |
afb1r_c - | треугольное разложение ленточной матрицы, заданной в компактной форме, с выбором ведущего элемента по столбцу; |
afb1d_c - | треугольное разложение ленточной матрицы, заданной в компактной форме, с удвоенной точностью (выбор ведущего элемента по столбцу). |
Замечания по использованию
При работе подпрограммы исходная матрица не сохраняется. На месте матрицы a помещается ее треугольное разложение, полученное подпрограммами afb1r_c или afb1d_c. Подпрограммы asb1r_c и asb1d_c позволяют использовать вместо параметра x параметр b. При использовании подпрограмм asb1r_c и asb1d_c в цикле значение параметра r должно оставаться неизменным (см. описание подпрограммы afb1r_c). Для подпрограммы asb1d_c параметры a, b, x и r должны иметь тип double. |
int main(void) { /* Initialized data */ static float b[3] = { 7.f,38.f,2.f }; static float a[9] /* was [3][3] */ = { 0.f,-1.f,10.f,1.f,22.f,18.f,3.f, 5.f,0.f }; /* Local variables */ static int ierr, i__; extern int asb1r_c(float *, float *, float *, int *, int *, int *, int *, float *, int *); static float r__[6] /* was [3][2] */, x[3]; for (i__ = 1; i__ <= 9; ++i__) { printf("\n %16.7e \n", a[i__-1]); } for (i__ = 1; i__ <= 3; ++i__) { printf("\n %16.7e \n", b[i__-1]); } asb1r_c(a, b, x, &c__3, &c__1, &c__1, &c__1, r__, &ierr); printf("\n %5i \n", ierr); for (i__ = 1; i__ <= 3; ++i__) { printf("\n %16.7e \n", x[i__-1]); } return 0; } /* main */ Результаты: x = (1., 2., -1.), ierr = 0