Функции | |
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 | |||
) |
Решение трехдиагональной системы методом прогонки.
Решается трехдиагональная система порядка . Массивы
,
,
содержат коэффициенты системы, расположенные соответственно под главной диагональю, на ней и над ней. Элементы
и
не используются. Массив
содержит правую часть системы. Решение возвращается в массиве
.
Трудоемкость: