使用 SVD 求解 Ax=b 有什么好处
What is benefit to use SVD for solving Ax=b
我有一个线性方程,例如
Ax=b
其中 A
是满秩矩阵,其大小为 512x512
。 b
是 512x1
的向量。 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)
我有一个线性方程,例如
Ax=b
其中 A
是满秩矩阵,其大小为 512x512
。 b
是 512x1
的向量。 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)