matlab - 求解 Ax = B ==> 错误 : Matrix is close to singular or badly scaled 形式的矩阵

标签 matlab linear-algebra

我在求解 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 已经通过显示该警告指出了这一点。

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

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

如果您想使用 MATLAB 获得与手动计算相对应的结果,您可以使用 Symbolic Toolbox 及其 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 还是 float ,您都会得到秩为 8,大小为 [9 9] 并且行列式几乎为 0,即奇异或不可逆。更改一些条目可能会使您的矩阵规则(非奇异),但不能保证它会工作并且它会解决不同的问题。

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

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

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

关于matlab - 求解 Ax = B ==> 错误 : Matrix is close to singular or badly scaled 形式的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7975244/

相关文章:

python - 计算矩阵的零空间

c++ - 从一组最接近直线的点中找到点的最快算法是什么?

python - 在 numpy/scipy 中求解最小二乘?

c++ - 分离轴定理快把我逼疯了!

arrays - 什么时候在 Matlab 中使用元胞数组和结构体比较合适?

MATLAB:重新排列特征矩阵

Matlab将图像数据写入二进制文件

c++ - 如何在 OpenCV 中访问多维 Mat 中的二维矩阵

c++ - 如何实现 Matlab 的 mldivide(又名反斜杠运算符 "\")

matlab - 在matlab中生成所有可能的列向量