线性方程的解是错误的,或者为什么A *(A \ B)不等于B?

时间:2012-10-07 19:48:23

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

以下A*(A\D)的结果如何不等于D

enter image description here

它应该产生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产生完全相同的结果。

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

2 个答案:

答案 0 :(得分:7)

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

一旦你做了

x = A\D;

你得到最小二乘解决方案。

 0.8333
-1.5000
 1.6667

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

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

这意味着您将无法找到任何xsum(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

答案 1 :(得分:2)

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

  

矩形矩阵   如果A是矩形,则mldivide返回最小二乘解。 MATLAB通过QR分解求解超定系统(参见qr)。对于欠定系统,MATLAB返回最大零元素数的解。