【问题标题】:How to solve linear equation using Matlab?Matlab如何求解线性方程组?
【发布时间】:2014-01-05 17:24:24
【问题描述】:

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。”

如何纠正?

【问题讨论】:

  • 这可能是解决这类问题的好地方math.stackexchange.com
  • 你的矩阵A是奇异的,因此有无限的解。
  • @LuisMendo 如何在不改变数据的情况下将奇异矩阵转换为非奇异矩阵
  • @user3148302 要使其非单数,您至少需要更改一项。你不能在不改变数据的情况下让它变得不规则
  • 试试X=A\B.... 或X=B/A

标签: matlab linear-algebra


【解决方案1】:

你不能做你想做的事:“在不改变数据的情况下将奇异矩阵转换为非奇异矩阵”,但你可以通过使用pseudoinversepinv 为你的系统找到一种解决方案Ax = B

答案与使用mldivide 时得到的相同。您使用mldivide(或\)得到的警告只是警告,而不是错误。检查this link,如果您需要使用奇异矩阵并且厌倦了警告,请查看如何抑制警告。

x = pinv(A)*B;
x =
  -5.0000e-01
   1.2490e-16
   5.0000e-01

这给出了:

A*x
ans =
   1.00000
   1.00000
   1.00000

Egons answersimilar question

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

【讨论】:

  • 关于mldividepinvthis可能会感兴趣。
  • 虽然在数学上是正确的,但通过先计算逆来求解方程并不是 matlab 的方法。即使在常规方法工作正常的情况下,这也可能导致精度问题。有关该问题,请参阅 this Blog by Loren
【解决方案2】:

三个向量[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 在这种情况下会处理它,但会警告您。铅笔和纸会让你得出同样的结论。没有唯一的答案。

【讨论】:

    【解决方案3】:

    假设您知道解决方案可能不存在,您可以简单地要求第二个输出参数。这将告诉 Matlat,您已经意识到问题所在,并且只想获得最佳解决方案。

    这是怎么做的:

    [X, R] = linsolve(A,B)
    

    当然在doc中提到了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多