Функции | |
void | svd_decomp (double **A, size_t m, size_t n, double *w, int matu, double **U, int matv, double **V, size_t *ierr) |
Сингулярное разложение матрицы. | |
void | svd_correct (double *w, size_t n, double rel_err) |
Автоматическое корректирование вычисленных сингулярных чисел. | |
double | svd_cond (double *w, size_t n) |
Вычисление спектрального числа обусловленности на основе сингулярного разложения. | |
void | svd_least_squares (double **U, double *w, double **V, size_t m, size_t n, double *b, double *x) |
Нахождение нормального псевдорешения системы линейных уравнений на основе сингулярного разложения. |
Файл содержит функции, строящие и использующие сингулярное разложение матрицы.
Cингулярным разложением прямоугольной матрицы размера , называется ее представление , где
Отношение максимального сингулярного числа к минимальному есть спектральное число обусловленности квадратной матрицы. Число ненулевых сингулярных чисел указывает ранг матрицы. При вычислениях на компьютере вместо нулевых сингулярных чисел могут быть получены ненулевые, поэтому вычисленные сингулярные числа необходимо отредактировать с учетом погрешности вычислений.
Сингулярное разложение используется для нахождения нормального псевдорешения прямоугольной системы . Вектор x называется псевдорешением системы , если на нем достигается минимум . Псевдорешение называется нормальным, если среди всех псевдорешений оно имеет минимальную длину. Для любой системы нормальное псевдорешение единственно.
Пусть , , , где , имеют по столбцов каждая. Нормальное псевдорешение можно найти по формуле .
double svd_cond | ( | double * | w, | |
size_t | n | |||
) |
Вычисление спектрального числа обусловленности на основе сингулярного разложения.
Функция вычисляет спектральное число обусловленности матрицы на основе найденного функцией svd_decomp сингулярного разложения . Матрица A имеет размеры , . Спектральное число обусловленности равно отношению максимального сингулярного значения к минимальному.
Трудоемкость:
void svd_correct | ( | double * | w, | |
size_t | n, | |||
double | rel_err | |||
) |
Автоматическое корректирование вычисленных сингулярных чисел.
Функция зануляет близкие к нулю сингулярные числа матрицы , вычисленные функцией svd_decomp, с учетом задаваемой относительной погрешности . Матрица A имеет размеры , . Величина должна отражать ошибку в исходных данных (в матрице ). Если данные рассматриваются как точные, то необходимо задать . В этом случае функция установит значение , отражающее ошибку при вычислениях в самой функции svd_decomp, а именно, , где - расстояние между и следующим за ним числом в арифметике двойной точности. Зануляются сингулярные значения, не превосходящие , где - максимальное сингулярное значение.
void svd_decomp | ( | double ** | A, | |
size_t | m, | |||
size_t | n, | |||
double * | w, | |||
int | matu, | |||
double ** | U, | |||
int | matv, | |||
double ** | V, | |||
size_t * | ierr | |||
) |
Сингулярное разложение матрицы.
Функция находит сингулярное разложение вещественной матрицы A размера , .
Алгоритм состоит из двух частей. На первом этапе отражениями Хаусхолдера матрица приводится к двухдиагональному виду. На втором этапе вариантом -алгоритма двухдиагональная матрица приводится к диагональному виду .
Функция является переводом фортрановской программы svd из книги [FMM].
Трудоемкость:
Дополнительная память: O(n)
void svd_least_squares | ( | double ** | U, | |
double * | w, | |||
double ** | V, | |||
size_t | m, | |||
size_t | n, | |||
double * | b, | |||
double * | x | |||
) |
Нахождение нормального псевдорешения системы линейных уравнений на основе сингулярного разложения.
Функция находит нормальное псевдорешение системы линейных уравнений на основе вычисленного функцией svd_decomp сингулярного разложения . Матрица A имеет размеры , . При вычислении псевдорешения используются только ненулевые сингулярные значения. Перед вызовом функции рекомендуется занулить близкие к нулю сингулярные значения (например, с помощью функции svd_correct).
Трудоемкость: