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

Jam*_*ame 8 matlab image-processing linear-algebra svd

我有一个线性方程,如

Ax=b
Run Code Online (Sandbox Code Playgroud)

其中A是满级矩阵,其大小是512x512.b是一个矢量512x1.x是未知的矢量.我想找到x,因此,我有一些选择这样做

1.使用正常的方式

inv(A)*b
Run Code Online (Sandbox Code Playgroud)

2.使用SVD(奇异值分解)

[U S V]=svd(A);

x = V*(diag(diag(S).^-1)*(U.'*b))
Run Code Online (Sandbox Code Playgroud)

两种方法都给出了相同的结果.那么,使用SVD解决的好处是什么Ax=b,特别是在A2D矩阵的情况下呢?

And*_*uri 13

欢迎来到数值方法的世界,让我成为您的向导.

作为这个世界上的新人,你想知道,"为什么我会用这个SVD的东西做一些困难而不是那么常见的逆转?我会在Matlab中尝试一下!"

并没有找到答案.也就是说,因为你不是在看问题本身!当你有一个病态的矩阵时会出现问题.然后在数值上不可能计算逆.

例:

A=[1    1  -1;
   1   -2   3;
   2   -1   2];
Run Code Online (Sandbox Code Playgroud)

尝试使用反转此矩阵inv(A).你会变得无限.也就是说,因为矩阵的条件数非常高(cond(A)).

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

正如@Stewie Griffin所说,最好的方法是mldivide,它背后有几件事情.

(是的,我的例子不是很好,因为X的唯一解决方案是INF,但在这个YouTube视频中有更好的例子)

  • 让我给您当向导吧.LMAO.+1. (4认同)

Ste*_*fin 7

inv(A)*b有几个负面的.主要的一点是它明确地计算了倒数A,这对时间要求很高,如果值变化很多个数量级,可能会导致不准确.

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