Функции | |
void | band_tridiag (double *a, double *d, double *c, double *b, double *x, size_t n) |
Решение трехдиагональной системы методом прогонки. | |
void | band_mult_col (double **A, size_t n, size_t m1, size_t m2, double *b, double *c) |
Умножение ленточной матрицы на плотный столбец. | |
void | band_decomp (double **A, size_t n, size_t m1, size_t m2, double **L, size_t *p, int *sgn) |
-разложение ленточной системы. | |
void | band_solve (double **A, size_t n, size_t m1, size_t m2, double **L, size_t *p, double *b) |
Решение ленточной системы на основе ее -разложения. |
Файл содержит функции для работы с ленточными матрицами.
Матрица с элементами при или называется ленточной. Величина называется шириной ленты, а и - шириной нижней полуленты и шириной верхней полуленты соответственно. При получаем трехдиагональную матрицу. Элементы называются -й поддиагональю, а - -й наддиагональю.
Для хранения элементов ленточной матрицы используется компактная схема. Ленточной матрице поставим в соответствие матрицу размера с элементами , которую и будем хранить в двумерном массиве. Итак, каждому столбцу матрицы соответствует (под/над)диагональ матрицы .
Подробности и примеры см. в [BelovZolotykh]
void band_decomp | ( | double ** | A, | |
size_t | n, | |||
size_t | m1, | |||
size_t | m2, | |||
double ** | L, | |||
size_t * | p, | |||
int * | sgn | |||
) |
-разложение ленточной системы.
Функция находит -разложение ленточной квадратной матрицы порядка с шириной нижней полуленты и шириной верхней полуленты . Для хранения матрицы используется компактная схема. Элементы матрицы хранятся в массиве размера . Используется схема выбора главного элемента по столбцу. Элементы множителя возвращаются в компактной форме в массиве . Поддиагональные элементы множителя в компактной форме возвращаются в массиве размера . Диагональные элементы матрицы равны . Матрица перестановок представлена вектором перестановок : на -й итерации -я строка была переставлена с -й. На выходе - определитель матрицы .
Трудоемкость:
void band_mult_col | ( | double ** | A, | |
size_t | n, | |||
size_t | m1, | |||
size_t | m2, | |||
double * | b, | |||
double * | c | |||
) |
Умножение ленточной матрицы на плотный столбец.
Ленточная матрица , представленная схемой, описанной в описании band_decomp, умножается на вектор-столбец . Результат возвращается в массиве .
Трудоемкость:
void band_solve | ( | double ** | A, | |
size_t | n, | |||
size_t | m1, | |||
size_t | m2, | |||
double ** | L, | |||
size_t * | p, | |||
double * | b | |||
) |
Решение ленточной системы на основе ее -разложения.
Функция находит решение ленточной системы b на основе полученного функцией band_decomp -разложения матрицы . На входе:
Решение записывается на месте вектора , остальные массивы не меняются и могут использоваться в дальнейшем для решения системы с другой правой частью.
Трудоемкость:
void band_tridiag | ( | double * | a, | |
double * | d, | |||
double * | c, | |||
double * | b, | |||
double * | x, | |||
size_t | n | |||
) |
Решение трехдиагональной системы методом прогонки.
Решается трехдиагональная система порядка . Массивы , , содержат коэффициенты системы, расположенные соответственно под главной диагональю, на ней и над ней. Элементы и не используются. Массив содержит правую часть системы. Решение возвращается в массиве .
Трудоемкость: