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

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

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

enter image description here

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

Systems of linear equations are ubiquitous in numerical analysis. To solve the set of linear equations Ax = b, use the left division operator, ‘\’: 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有一个独特的解决方案” 是绝对错误的!顺便说一句,上面显示的文档非常令人不安。

最佳答案

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

一旦你这样做了

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

关于matlab - 线性方程的错误解,或者为什么 A*(A\B) 不等于 B?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12772281/

相关文章:

python - Python 函数中多个输出的括号

image - MATLAB 图标题被截断

卸载已使用 CUDA 内存的 mex 文件时,MATLAB 崩溃

algorithm - 有没有快速的矩阵求幂方法?

arrays - 用值填充二进制向量中的奇数序列

matlab - 如何使用 Octave 对信号进行下采样?

octave - 无法在 Windows 10 下使用 Octave 4.0.0 图形工具包功能

matlab - Octave:用于将绘图打印为 eps 的动态文件名

r - 矩阵的特征值,假设对称

python - 给定一个用给定基向量构建的函数,逼近矩阵的值