В чем польза использования SVD для решения Ax=b
У меня есть линейное уравнение, такое как
Ax=b
Где A
- полная ранговая матрица, размер которой равен 512x512
. b
- вектор 512x1
. x
- неизвестный вектор. Я хочу найти x
, следовательно, у меня есть несколько вариантов для этого
1.Используя обычный способ
inv(A)*b
2.Использование SVD (сингулярного разложения)
[U S V]=svd(A);
x = V*(diag(diag(S).^-1)*(U.'*b))
Оба метода дают один и тот же результат. Итак, в чем преимущество использования SVD для решения Ax=b
, особенно в случае, когда A
является двумерной матрицей?2 ответа:
Добро пожаловать в мир численных методов, позвольте мне быть вашим гидом.
Вы, как новый человек в этом мире, задаетесь вопросом: "Почему я должен делать что-то такое сложное с этим материалом SVD вместо так широко известного обратного?! Я собираюсь попробовать это в Matlab!"
И никакого ответа не было найдено. Это потому, что вы не смотрите на саму проблему! Проблемы возникают, когда у вас есть плохо обусловленная матрица. Тогда вычисление обратного не представляется возможным численно.Пример:
Попробуйте инвертировать эту матрицу, используяA=[1 1 -1; 1 -2 3; 2 -1 2];
inv(A)
. Вы получите бесконечность. То есть, потому что номер условия матрицы очень высок (cond(A)
). Однако, если вы попытаетесь решить ее с помощью метода SVD (b=[1;-2;3]
), вы получите результат. Это все еще острая исследовательская тема. Решение систем Ax=b с номерами плохих состояний.Как предположил @Stewie Griffin, лучший способ пойти-это
mldivide
, так как он делает пару вещей позади оно.(Да, мой пример не очень хорош, потому что единственное решение X-INF, но есть лучший пример В этом видео на youtube )
inv(A)*b
имеет несколько отрицательных сторон. Главный из них заключается в том, что он явно вычисляет обратную величинуA
, что требует много времени и может привести к неточностям, если значения изменяются на много порядков.Хотя это может быть лучше, чем
inv(A)*b
, использованиеsvd
здесь не является "правильным" подходом. MATLAB-способ сделать это с помощьюmldivide
,\
. Используя это, MATLAB выбирает наилучший алгоритм для решения линейной системы, основываясь на ее свойствах (герметичность, верхняя Гессенберг, действительная и положительная диагональ, симметричная, диагональная, разреженная и т. д.). Часто решением будет LU-триангуляция с частичной перестановкой, но она варьируется. Вам будет трудно превзойти реализацию matlabs mldivide, но использованиеsvd
может дать вам некоторое представление о свойствах системы, если вы действительно исследуетеU, S, V
. Если вы не хотите этого делать, Сделайте с mldivide.