В чем польза использования 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 4

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.