【问题标题】:Wrong solution of a linear equation, or why does A*(A\B) not equal B?线性方程的错误解,或者为什么 A*(A\B) 不等于 B?
【发布时间】:2012-10-07 19:48:23
【问题描述】:

下面A*(A\D)的结果怎么可能不等于D

它应该产生 D - 这是 Octave 文档的摘录:

线性方程组在数值分析中无处不在。到 求解线性方程组 Ax = b,使用左除法 运算符,'\':x = A \ b

下面是代码供想尝试的人使用:

A = [1,1,1;0,0,0;2,1,2;2,1,2;3,5,6]
D = [1;2;3;4;5]
% A is of rank 3:
rank(A)
% therefore the system Ax=D has a unique solution
x = A\D
% but Octave has not given the good solution:
A*x

有人说我用 Matlab 得出的结果完全相同。

编辑 2012 年 10 月 10 日: 阅读完答案后,让我指出我犯了一个严重错误的地方:声明 “A 排名第 3,因此系统 Ax=D有一个独特的解决方案” 是绝对错误的!顺便说一句,上面显示的文档非常令人不安。

【问题讨论】:

  • 为什么A*(A\D) 应该和D 一样?
  • @phimuemue 因为这正是左除法运算符的目标。我已经编辑了我的帖子以添加有关此运算符的文档内容。

标签: matlab octave linear-algebra numerical-methods least-squares


【解决方案1】:

A 有 5 行,D 也是如此。它们都有 3 列。因此,您有一个包含 3 个变量的 5 个方程的超定系统。在大多数情况下,这意味着您无法准确求解方程,因为您有太多约束。

一旦你这样做了

x = A\D;

你得到最小二乘解。

 0.8333
-1.5000
 1.6667

这个解决方案是什么?这是一种最小化误差平方和的解决方案。让我们计算一下误差:

  r = A*x-D;
  totalError = sum( r.^2);

这意味着您将无法找到任何x,因此sum(sqr(A*x-D)) 的错误更小。

小备注:在您的情况下,您还有一行零 - 这导致实际的方程数变为 4

我们再来看看A*(A\D)

>> A* (A\D)

ans =

    1.0000
         0
    3.5000
    3.5000
    5.0000

看起来很眼熟!非常接近 [1;2;3;4;5]。第一行和最后一行是相同的。第二个是零,因为你放了一行零。在第 3 行和第 4 行中,A 中的行完全相同,但 B 中的值不同,对应于

2*x+ 1*y + 2*z  = 3;
2*x+ 1*y + 2*z  = 4;

你已经得到了他们的平均水平!这是有道理的,因为平均值是将距离总和最小化为 3 和 4 的值。


这是一个更简单的例子,假设你想求解以下方程组:

   x = 1;
   x = 2;

显然,x 不能同时是 12。最小化误差平方和的解决方案是1.5

   A = [1;1];
   b = [1;2];
   A\b
   ans =
    1.5000

【讨论】:

  • 赞成,但我注意到x = A\D 应该返回[0.833; -1.5; 1.9997]
  • 我意识到我的评论也有错误,但是您似乎已经注意到并纠正了它:)
  • 谢谢!我在想 Octave 在这种情况下会返回警告。
【解决方案2】:

您的系统A 是超定的(A 是矩形),因此您是do not solve your system exactly

矩形矩阵 如果 A 是矩形,则 mldivide 返回最小二乘解。 MATLAB 使用 QR 分解解决超定系统(请参阅 qr)。对于欠定系统,MATLAB 返回具有最大数量的零元素的解。

【讨论】:

猜你喜欢
  • 2010-12-08
  • 2014-03-29
  • 2021-09-10
  • 1970-01-01
  • 2021-10-06
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
相关资源
最近更新 更多