求解形式为 Ax = B ==> 错误的矩阵:矩阵接近奇异或缩放不良



我在解决Ax=B形式的系统时遇到了麻烦

系统的解决方案应该是

x = inv(A)*B

但是,这行不通。

当我尝试上面的代码行时,我得到以下错误消息:

Warning: Matrix is close to singular or badly scaled.
     Results may be inaccurate. RCOND = 1.156482e-018. 

它似乎是有麻烦的matlab反演矩阵,我已经指定。我试图通过输入inv(A)*A

来验证逆函数是否正常工作。

这应该给出单位矩阵,但是我得到了相同的错误和一些垃圾数字。

这是我正在使用的A矩阵:

A = [5/2   1/2  -1     0     0    -1/2  -1/2   0     0
     1/2   1/2   0     0     0    -1/2  -1/2   0     0 
    -1     0     5/2  -1/2  -1     0     0    -1/2   1/2
     0     0    -1/2   1/2   0     0     0     1/2  -1/2
     0     0    -1     0     3/2  -1/2   1/2   0     0
    -1/2  -1/2   0     0    -1/2   2     0    -1     0  
    -1/2  -1/2   0     0     1/2   0     1     0     0 
     0     0    -1/2   1/2   0    -1     0     2     0 
     0     0     1/2  -1/2   0     0     0     0     1]

你知道为什么这不起作用吗?我还尝试将A转换为稀疏矩阵(sparse(A)),然后运行逆命令。不行。

问题确实出在你的数学上。你给出的矩阵不是满秩的,所以它不是可逆的。您可以手动验证(没有花时间这样做),但是MATLAB已经通过显示警告指出了这一点。

由于您正在处理浮点数,这有时会导致其他微妙的问题,其中一个问题可以在det(A)的结果中看到,它的顺序是1e-16,即机器精度或实际中的0。

通过执行rank函数可以看出这个矩阵不是满秩的:rank(A) = 8。对于9x9矩阵,这确实意味着该矩阵对于双精度是不可逆的(因为rank函数说明了机器精度)。

如果您想使用MATLAB来获得与手动计算相对应的结果,您可以使用符号工具箱及其vpa(可变精度算术)来解决可能的数值问题,但代价是计算速度较慢。

B = [5  1 -2  0  0 -1 -1  0  0;
     1  1  0  0  0 -1 -1  0  0;
    -2  0  5 -1 -2  0  0 -1  1;
     0  0 -1  1  0  0  0  1 -1;
     0  0 -2  0  3 -1  1  0  0;
    -1 -1  0  0 -1  4  0 -2  0;
    -1 -1  0  0  1  0  2  0  0;
     0  0 -1  1  0 -2  0  4  0;
     0  0  1 -1  0  0  0  0  2];
A = B/2;
size(A)    % = [9 9]
det(A)     % = -1.38777878078145e-17
rank(A)    % = 8
C = vpa(A);
det(C)     % = 0.0
rank(C)    % = 8

对于VPA和浮点数,您将得到秩为8,大小为[9 9],行列式几乎为0,即奇异或不可逆。更改几个条目可能会使您的矩阵正则(非奇异),但不能保证工作,它将解决不同的问题。

要解决A*x=bx的实际问题,您可以尝试使用mldivide(也称为反斜杠运算符)或Moore-Penrose伪逆:

x1 = Ab;
x2 = pinv(A)*b;

但是请记住,这样的系统没有唯一的解决方案,因此伪逆运算符和反斜杠运算符可能(在这种情况下将)返回非常不同的解决方案,它们中的任何一个是否可以接受实际上取决于您的应用程序。

言之有理。这个矩阵是奇异的,也就是说它不可能被反转。不是所有的矩阵都可以。

在几何术语中,你有一个矩阵,它将一个9维物体转换成另一个,但将一个维度完全平坦化。这是无法挽回的;没有办法知道在那个方向上拉多远

矩阵奇异,考虑下面的B=2*A:

B = [5  1 -2  0  0 -1 -1  0  0;
     1  1  0  0  0 -1 -1  0  0;
    -2  0  5 -1 -2  0  0 -1  1;
     0  0 -1  1  0  0  0  1 -1;
     0  0 -2  0  3 -1  1  0  0;
    -1 -1  0  0 -1  4  0 -2  0;
    -1 -1  0  0  1  0  2  0  0;
     0  0 -1  1  0 -2  0  4  0;
     0  0  1 -1  0  0  0  0  2]
det(B)
0

迭代求解器bicgstab(A,b,tol,maxit)能够求解奇异矩阵a的奇异线性系统a *x=b:

size(A)=[162, 162] 
rank(A)=14 
cond(A)=4.1813e+132 

我用了:

tol=1e-10; 
maxit=100;

上述(包括svd, , inv, pinv, gmres)都不适合我,但bicgstab做得很好。bicgstab在第4次迭代时收敛到一个相对残差为1.1e-11的解。对于稀疏矩阵,它工作得很快。

查看这里的文档:https://uk.mathworks.com/help/matlab/ref/bicgstab.html

相关内容

  • 没有找到相关文章

最新更新