Matlab 使用SVD解决Ax=b有什么好处
我有一个线性方程,比如Matlab 使用SVD解决Ax=b有什么好处,matlab,image-processing,linear-algebra,svd,Matlab,Image Processing,Linear Algebra,Svd,我有一个线性方程,比如 Ax=b 其中A是满秩矩阵,其大小为512x512b是512x1的向量x是未知向量。我想找到x,因此,我有一些选项可以选择 1.使用正常方式 inv(A)*b 2.使用SVD(奇异值分解) 两种方法得出的结果相同。那么,使用奇异值分解来求解Ax=b,特别是在A是二维矩阵的情况下,有什么好处呢?inv(A)*b有几个负面影响。主要的一点是,它显式计算A的倒数,这既需要时间,而且如果值变化了许多数量级,可能会导致不准确 虽然它可能比inv(A)*b更好,但在这里使用svd
Ax=b
其中A
是满秩矩阵,其大小为512x512
b
是512x1
的向量<代码>x是未知向量。我想找到x
,因此,我有一些选项可以选择
1.使用正常方式
inv(A)*b
2.使用SVD(奇异值分解)
两种方法得出的结果相同。那么,使用奇异值分解来求解Ax=b
,特别是在A
是二维矩阵的情况下,有什么好处呢?inv(A)*b
有几个负面影响。主要的一点是,它显式计算A
的倒数,这既需要时间,而且如果值变化了许多数量级,可能会导致不准确
虽然它可能比
inv(A)*b更好,但在这里使用svd
并不是“正确”的方法。MATLAB实现这一点的方法是使用,\
。利用这一点,MATLAB根据线性系统的性质(Hermation、upper Hessenberg、实对角和正对角、对称、对角、稀疏等)选择最佳算法来求解线性系统。通常,解决方案是局部置换的LU三角剖分,但它是不同的。您将很难击败MATLABs的mldivide实现,但是如果您实际调查U,S,V
,使用svd
可能会让您更深入地了解系统的属性。如果你不想这样做,就用mldivide吧。欢迎来到数值方法的世界,让我来做你的向导
作为这个世界上的一个新人,你会想,“为什么我要用这个奇异值分解(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,但有一个更好的例子)SVD让您更好地了解解决方案的准确性,并很好地处理奇异和近似奇异的情况。一个很好的替代方法是完全或部分旋转的高斯消去法。谢谢Stewie Griffin。作为我的实验结果,我发现SVD与inv(A)*b方法相比往往给出最佳解。我无法解释原因。你能给我一些关于SVD与inv(A)*b比较的好处的参考吗?让我来做你的向导。洛芒+1.
A=[1 1 -1;
1 -2 3;
2 -1 2];