使用 SVD 求解 Ax=b 有什么好处

What is benefit to use SVD for solving Ax=b

我有一个线性方程,例如

Ax=b

其中 A 是满秩矩阵,其大小为 512x512b512x1 的向量。 x 是未知向量。我想找到 x,因此,我有一些选择

1.Using正常方式

inv(A)*b

2.Using SVD(奇异值分解)

[U S V]=svd(A);

x = V*(diag(diag(S).^-1)*(U.'*b))

两种方法给出的结果相同。那么,使用 SVD 求解 Ax=b 有什么好处,尤其是在 A 是二维矩阵的情况下?

inv(A)*b 有几个消极的方面。最主要的是它显式地计算 A 的倒数,这既需要时间,又可能在值相差很多数量级时导致不准确。

虽然它可能比 inv(A)*b 更好,但使用 svd 并不是这里的 "correct" 方法。执行此操作的 MATLAB 方法是使用 mldivide\。使用它,MATLAB 根据其属性(Hermation、上 Hessenberg、实数和正对角线、对称、对角线、稀疏等)选择最佳算法来求解线性系统。通常,解决方案将是具有部分排列的 LU 三角剖分,但它会有所不同。您将很难击败 mldivide 的 MATLAB 实现,但如果您实际研究 U, S, V,使用 svd 可能会让您更深入地了解系统的属性。如果您不想这样做,请使用 mldivide。

欢迎来到数值方法的世界,让我做你的向导。

你,作为这个世界上一个新人的奇迹,"Why would I do something this difficult with this SVD stuff instead of the so commonly known inverse?! Im going to try it in Matlab!"

没有找到答案。那是因为你没有看问题本身!当你有一个病态矩阵时,问题就出现了。那么逆计算在数值上是不可能的。

示例:

A=[1    1  -1;
   1   -2   3;
   2   -1   2];

尝试使用 inv(A) 反转此矩阵。你会得到无限的。 也就是因为矩阵的condition number很高(cond(A)).

但是,如果您尝试使用 SVD 方法 (b=[1;-2;3]) 求解它,您将得到一个结果。这仍然是一个热门的研究课题。求解具有病态数的 Ax=b 系统。

正如@Stewie Griffin 所建议的那样,最好的方法是 mldivide,就像它后面的 a couple of things 一样。

(是的,我的例子不是很好,因为 X 的唯一解决方案是 INF,但有更好的例子 in this youtube video