如何从此 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' 的大小为 1x30
而 A
的大小为 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
我正在研究反问题,我试图对矩阵 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' 的大小为 1x30
而 A
的大小为 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