用SVD求解Ax=b的好处是什么?



我有一个线性方程,如

Ax=b

,其中A为满秩矩阵,其大小为512x512b512x1的向量。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是二维矩阵的情况下,有什么好处呢?

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

你,作为这个世界上的一个新人,想知道,"为什么我要用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根据线性系统的性质(Hermation、upper Hessenberg、实正对角、对称、对角、稀疏等)选择最佳算法进行求解。通常,解决方案将是具有部分排列的u -三角剖分,但它是不同的。您将很难击败matlab的mldivide实现,但是如果您实际研究U, S, V,使用svd可能会让您对系统的属性有更多的了解。如果你不想这样做,可以使用mldivide.

相关内容

  • 没有找到相关文章

最新更新