Функции | |
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