我在解决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转换为稀疏矩阵(稀疏(A)),然后运行inverse命令。没有骰子。
答案 0 :(得分:20)
问题确实存在于你的数学中。您提供的矩阵不是完全排名,因此它不可逆。 您可以手动验证(没有花时间这样做),但MATLAB已经通过显示警告来指出这一点。
由于您正在处理浮点数,这有时会导致其他细微问题,其中一个问题可以在det(A)
的结果中看到,其大小为1e-16
,即机器精度或者在实践中为0。
通过执行rank
功能rank(A) = 8
,您可以看到此Matrix未达到满级。对于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=b
的实际问题x
,您可以尝试使用mldivide
(a.k.a。反斜杠运算符)或Moore-Penrose伪逆:
x1 = A\b;
x2 = pinv(A)*b;
但请记住,这样的系统没有唯一的解决方案,因此伪逆和反斜杠操作符可能(在这种情况下)将返回非常不同的解决方案,无论其中任何一个是否可接受真的取决于您的应用
答案 1 :(得分:11)
这正是它所说的。矩阵是singular, which means it can't really be inverted。并非所有矩阵都可以。
在几何术语中,您有一个矩阵可以将一个9维对象转换为另一个9维对象,但会完全展平一个维度。这无法撤消;没有办法知道在这个方向上拉出多远。
答案 2 :(得分:2)
矩阵是单数,考虑下面的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
答案 3 :(得分:1)
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