C ++: Решите недоопределенную линейную систему с помощью Lapack

Скажем проще: у меня есть недоопределенная линейная система уравнений

Ax = b

и я хочу получить одно верное решение, независимо от того, какое из бесконечных решений для системы. И я хочу получить это максимально эффективно.

Я проверил общие процедуры LAPACK, и мне кажется, что они не могут справиться с недоопределенным случаем. Например, dgesv(), чья документация находится

person enanone    schedule 25.10.2017    source источник
comment
В чем проблема с обратной заменой? Этот вопрос больше подходит для scicomp.stackexchange.com   -  person The Quantum Physicist    schedule 25.10.2017
comment
Вы можете запускать gelsd, gelsy также из Lapack, но вам нужно расширить матрицу B.   -  person percusse    schedule 26.10.2017


Ответы (1)


Для недоопределенной системы уравнений:

Правильный подход - использовать разложение по сингулярным числам (SVD). Lapack предлагает разложение по сингулярным значениям в форме dgesvd.

Чтобы выполнить SVD, вам необходимо усреднить вашу проблему, чтобы превратить ее в матричную задачу вида: My = 0. Это легко сделать, введя другую степень свободы (другую переменную). Это преобразует вектор x -> y и матрицу A -> M. При выполнении SVD на матрице M наименьший сингулярный вектор будет решением вашей недоопределенной задачи наименьших квадратов.

Я бы порекомендовал поэкспериментировать с matlab или octave, прежде чем тратить время на кодирование чего-либо.

person keith    schedule 25.10.2017