我有一个线性方程,如
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
是二维矩阵的情况下,有什么好处呢?
欢迎来到数值方法的世界,让我做你的向导。
你,作为这个世界上的一个新人,想知道,"为什么我要用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.