A= [1 2 3;3 4 5;5 6 7]
, B=[1;1;1]
.我需要求解方程 AX=B。这里使用的是像X=linsolve(A,B)
这样的 Matlab 代码。但是,使用它会发生警告...
"警告:矩阵接近单数或缩放不良。结果可能不准确。RCOND = 1.541976e-18."
如何纠正?
你不能做你想做的事:"在不改变数据的情况下将奇异矩阵转换为非奇异矩阵",但你可以通过使用伪逆找到一个系统解决方案,Ax = B
,pinv
。
答案与您在使用时得到的相同 mldivide
.您使用mldivide
(或)得到的警告只是一个警告,而不是错误。查看此链接,了解如果您需要使用奇异矩阵并厌倦了警告,如何抑制警告。
x = pinv(A)*B;
x =
-5.0000e-01
1.2490e-16
5.0000e-01
这给了:
A*x
ans =
1.00000
1.00000
1.00000
从Egons对类似问题的回答:
但请记住,这样的系统没有唯一的解决方案,所以 伪逆斜杠和反斜杠运算符都可以(并且在此 案例将)返回非常不同的解决方案,无论其中任何一个是 可接受实际上取决于您的应用程序。
三个向量[1,2,3],[3,4,5],[5,6,7]
位于一个平面上。我怎么知道?因为我能看到[3,4,5]-[1,2,3]=[2,2,2]
,[3,4,5]+[2,2,2]=[5,6,7]
.
因此,当问题是"这三个向量的线性组合让我达到这一点"时,如果点在平面中,则有无限多个这样的解决方案,如果不是,则没有。 只需检查即可看到
[1,1,1] = ( [3,4,5]-[1,2,3] ) / 2
这意味着解决方案是[-0.5 0.5 0]
或
[1,1,1] = ( [5,6,7] - [3,4,5] ) / 2
这意味着解决方案是[0 -0.5 0.5]
等。
你不能把一个问题变成它不是的东西——在这种情况下,它是病态的,所以有无限多的解决方案。在这种情况下,Matlab 会处理它,但会警告您。铅笔和纸会引导你得出同样的结论。没有唯一的答案。
假设您知道 THE 解决方案可能不存在,您可以简单地请求第二个输出参数。这将告诉Matlat您已经意识到问题,只是想获得最佳解决方案。
这是如何完成的:
[X, R] = linsolve(A,B)
当然在文档中提到过。