如何从此 Ax=b 中检索 x?

How can I retrieve x from this Ax=b?

我正在研究反问题,我试图对矩阵 A 求逆,但它有 'rank deficient'。 矩阵A也是非方阵。 所以,我尝试了 b 次 pinv(A),但它产生了不正确的解决方案。

我想知道可以解决这个问题的方法或函数。

这是 MATLAB 代码

vertical = eye(20);
A=zeros(10,200);
for j=0:9;
    A(j+1,1+20*j:20*j+20)=1;
end

for j=0:9;
    A(11:30,1+20*j:20*j+20)=vertical;
    
end

b=[0 4 4 4 10 10 4 4 4 0 0 2 2 2 2 2 2 2 2 0 0 2 2 2 8 8 2 2 2 0];
x=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
   0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0;
   0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0;
   0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0;
   0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0;
   0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0;
   0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0;
   0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0;
   0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0;
   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];

您的矩阵和向量尺寸不正确,因此无法运行。 pinv(A) 在 Matlab 中有一个名为 tolerance 的参数,它会在一些 epsilon 之后截断奇异值。您可以通过这种方式使用截断的 SVD 来求解,您将得到一个近似值。条件数是 inf,因此首先更正您的脚本,然后将公差设置为 10^(-13) 或其他内容。

我觉得你应该有的是

x = pinv(A)*b'

因为 'b' 的大小为 1x30A 的大小为 30x200


验证结果,你可以试试

>> A*(pinv(A)*b')-b'
ans =

  -9.4369e-16
   1.7764e-15
  -3.5527e-15
            0
  -8.8818e-15
   3.5527e-15
   8.8818e-16
   3.5527e-15
  -2.6645e-15
  -2.2204e-16
  -6.6613e-16
   8.8818e-16
            0
   4.4409e-16
   8.8818e-16
  -2.4425e-15
   1.3323e-15
  -8.8818e-16
   2.2204e-15
  -1.4988e-15
  -3.3029e-15
  -4.4409e-16
            0
   3.5527e-15
            0
            0
  -3.7748e-15
  -2.4425e-15
  -8.8818e-16
   3.0531e-16