Функции | |
void | eig_tridiag_reduction (double **A, size_t n, int matq, double *d, double *a) |
Приведение симметричной матрицы к трехдиагональному виду. | |
void | eig_tridiag (double *d, double *a, size_t n, int matq, double **Q, size_t *rc) |
Собственные числа симметричной трехдиагональной системы. | |
void | eig_jacobi (double **A, size_t n, double *w, int matq, double **Q, int *nrot, int *rc) |
Метод Якоби решения симметричной проблемы собственных значений. | |
void | eig_balance (double **A, size_t n, size_t *low, size_t *high, double *scal) |
Балансирование вещественной матрицы. | |
void | eig_hess_reduction (double **A, size_t n, size_t low, size_t high, size_t *perm) |
Приведение матрицы к верхней форме Хессенберга. | |
void | eig_hess_transform_matrix (double **A, size_t n, size_t low, size_t high, size_t *perm, double **Q) |
Трансформирующая матрица к верхней форме Хессенберга. | |
void | eig_hess (double **A, size_t n, size_t low, size_t high, double *wr, double *wi, int matq, double **Q, size_t *iter, size_t *rc) |
Собственные числа и векторы матрицы Хессенберга. | |
void | eig_balance_inverse (double **Q, size_t n, size_t low, size_t high, double *scal) |
Обратное балансирование. | |
void | eig_norm_Inf (double **Q, size_t n, double *wi) |
Нормирование собственных векторов. | |
void | eig_vectors (double **A, size_t n, size_t low, size_t high, double *wr, double *wi, double **Q) |
Вычисление собственных векторов по методу обратной итерации. |
Пусть --- квадратная матрица. Собственным вектором называется такой ненулевой вектор
, что
для некоторого числа
. При этом
называется собственным значением (или собственным числом). Проблема собственных значений заключается в нахождении части (или всех) собственных значений и (если требуется) соответствующих им собственных векторов.
В библиотеке реализованы следующие алгоритмы решения проблемы собственных значений:
void eig_balance | ( | double ** | A, | |
size_t | n, | |||
size_t * | low, | |||
size_t * | high, | |||
double * | scal | |||
) |
Балансирование вещественной матрицы.
Балансирование вещественной матрицы перед приведением ее к форме Хессенберга для дальнейшего нахождения собственных чисел. Собственные числа исходной и сбалансированной матрицы одни и те же. Определяются строки с нулями вне диагонали. Остальные строки и столбцы домножаются на скаляры с тем, чтобы их норма была близка к
. Строки с нулями вне диагонали имеют номера с
по
и
по
. Элементы вектора
на этих позициях равны соответствующим собственным векторам, на остальных позициях --- соответствующим масштабным множителям.
void eig_balance_inverse | ( | double ** | Q, | |
size_t | n, | |||
size_t | low, | |||
size_t | high, | |||
double * | scal | |||
) |
Обратное балансирование.
По собственным векторам , найденным для сбалансированной матрицы
, находит собственные векторы исходной матрицы.
void eig_hess | ( | double ** | A, | |
size_t | n, | |||
size_t | low, | |||
size_t | high, | |||
double * | wr, | |||
double * | wi, | |||
int | matq, | |||
double ** | Q, | |||
size_t * | iter, | |||
size_t * | rc | |||
) |
Собственные числа и векторы матрицы Хессенберга.
Для матрицы Хессенберга находит собственные числа и, если
, - собственные векторы. Действительные части собственных чисел возвращаются в векторе
, мнимые ---
. Для вещественных собственных чисел (
) столбец
содержит соответствующий собственный вектор. Для пары комплексно сопряженных собственных чисел (
,
)
-й столбец матрицы
содержит действительную часть
-го собственного вектора, а
-й - его мнимую часть.
-й собственный вектор комплексно сопряжен к нему. В векторе
возвращается число итераций, используемых для нахождения каждого собственного числа.
Если , то на место матрицы
ничего не записывается и можно задать
.
На выходе, если все прошло успешно, то . В противном случае число итераций превысило 30 и в
возвращается количество верно найденных собственных чисел.
void eig_hess_reduction | ( | double ** | A, | |
size_t | n, | |||
size_t | low, | |||
size_t | high, | |||
size_t * | perm | |||
) |
Приведение матрицы к верхней форме Хессенберга.
Квадратная вещественная матрица порядка
методом вращений Хаусхолдера приводится к верхней форме Хессенберга. На выходе элементы верхнего треугольника и поддиагонали матрицы
хранят соответствующие элементы матрицы Хессенберга. Остальные элементы хранят дополнительную информацию. На выходе
--- вектор перестановок --- в дальнейшем используется функцией elmtrans
void eig_hess_transform_matrix | ( | double ** | A, | |
size_t | n, | |||
size_t | low, | |||
size_t | high, | |||
size_t * | perm, | |||
double ** | Q | |||
) |
Трансформирующая матрица к верхней форме Хессенберга.
Для квадратной вещественной матрицы порядка
строит трансформирующую матрицу
, приводящую к верхней форме Хессенберга. На входе параметры
,
--- из функции eig_balance,
,
--- из eig_hess
void eig_jacobi | ( | double ** | A, | |
size_t | n, | |||
double * | w, | |||
int | matq, | |||
double ** | Q, | |||
int * | nrot, | |||
int * | rc | |||
) |
Метод Якоби решения симметричной проблемы собственных значений.
Функция вычисляет все собственные числа и собственные векторы вещественной симметричной матрицы , элементы верхнетреугольной части которой хранятся в соответствующих позициях в массиве
. На выходе элемены выше диагонали испорчены. В векторе
возвращаются собственные числа. Если на входе
, то на выходе
содержит нормализованные собственные векторы.
возвращает число использованных вращений Якоби.
Если , то на место матрицы
ничего не записывается и можно задать
.
На выходе, если все прошло успешно, то . В противном случае число итераций превысило 50 и в
возвращается
.
void eig_norm_Inf | ( | double ** | Q, | |
size_t | n, | |||
double * | wi | |||
) |
Нормирование собственных векторов.
Нормировка собственных векторов по их чебышевой (Inf) норме.
void eig_tridiag | ( | double * | d, | |
double * | a, | |||
size_t | n, | |||
int | matq, | |||
double ** | Q, | |||
size_t * | rc | |||
) |
Собственные числа симметричной трехдиагональной системы.
-алгоритм с неявными сдвигами для нахождения собственных векторов и собственных чисел действительной симметричной трехдиагональной матрицы
. Матрица
может быть получена с помощью функции eig_tridiag_reduction. На входе
содержит диагональ матрицы
, на выходе - собственные числа Вектор
на входе содержит поддиагональ матрицы
, на выходе вектор теряет свои значения.
Если , то ищутся также собственные векторы. Если необходимы собственные векторы трехдиагональной матрицы, то матрица
на входе должна быть единичной. Если нужно найти собственные векторы матрицы, к которой уже применяли функцию eig_tridiag_reduction, то
должна быть матрицей, возвращаемой функцией eig_tridiag_reduction. В обоих случаях
-й столбец возвращаемой матрицы
есть нормированный собственный вектор, соответствующий собственному числу
. Если собственные векторы не нужны, то нужно положить
. В этом случае
не используется и может быть равной
.
Если , то вычисление успешное, иначе на вычисление одного из собственных чисел было потрачено более
итераций. В этом случае
возвращает количество верно найденных собственных чисел (и векторов).
void eig_tridiag_reduction | ( | double ** | A, | |
size_t | n, | |||
int | matq, | |||
double * | d, | |||
double * | a | |||
) |
Приведение симметричной матрицы к трехдиагональному виду.
Приведение преобразованиями Хаусхолдера вещественной симметричной матрицы к трехдиагональному виду
.
возвращает диагональные элементы,
--- поддиагональные элементы,
. Если
, то на выходе матрица
заменяется на ортогональную матрицу
, в противном случае в
- ``случайные'' значения.
void eig_vectors | ( | double ** | A, | |
size_t | n, | |||
size_t | low, | |||
size_t | high, | |||
double * | wr, | |||
double * | wi, | |||
double ** | Q | |||
) |
Вычисление собственных векторов по методу обратной итерации.
Вычисление собственных векторов матрицы Хессенберга по собственным числам. Автоматически вызывается функцией eig_hess, если vec == 1