无法在MATLAB中求解以下方程式

时间:2012-11-08 10:04:09

标签: matlab linear

以下是我在matlab编写的代码的一部分,这里我想执行以下简单的数学运算[A] [X] = [B],其中[X]是未知的。在我的情况下,我的长度大约为1600000.所以我想要的是获得数组上每个元素的g1,g2和g3的值。我试过以下

k31 = omega3./(d)      
k32 = omega3_2./(d)    
A   = [2,1,5;-2,-1,-5];    
X   = [g1;g2;g3];

for ii = 1:length(k31)    
    B = [k31(ii); k32(ii)];    
    X = pinv(A).*B;    
end

display(g1,g2,g3)

我正在使用伪逆,所以基本上我可以得到每个X的解决方案,我在那里进行了一些编辑....并且x是未知的,数学上它可以完成,但我无法编码

另外,我如何用x和y绘制g1 g2 g3的值,如下所示:scatter(x(1:end-1),y(1:end-1),5,g1); scatter(x(1:end-1),y(1:end-1),5,g2)和scatter(x(1:end-1),y(1:end-1),5,g3)< / p>

2 个答案:

答案 0 :(得分:1)

我必须在这里做一些假设,所以请耐心等待。

我怀疑你想这样做:

k31 = omega3./(d)      
k32 = omega3_2./(d)    
A   = [2,1,5;-2,-1,-5];    

X = cell(length(k31),1);
for ii = 1:length(k31)            
    X{ii} = A\[k31(ii); k32(ii)];    
end

使用反斜杠运算符代替invpinv。输入help slash以获取更多信息。

反斜杠运算符通常比invpinv更快,更准确。它也更灵活 - 你的情况是不确定的(你只能明确解决1个等式),在这种情况下,反斜杠运算符会找到最小二乘解。

请注意我如何将所有结果保存在cell-array X中。这意味着可以通过

访问 n th 解决方案
X{n}    % == [g1(n) g2(n) g3(n)]

答案 1 :(得分:0)

在我看来,你最好从奇异值分解中创建一个伪逆。 Moore-Penrose伪逆会起作用,但我认为它有时会产生一些奇怪的结果。最小二乘可能不稳定,尤其是因为示例矩阵的等级未满。

也;不要计算每次迭代的倒数!

这是一个例子,其中A的等级缺陷被处理:

A   = [2,1,5;-2,-1,-5];

% pseudo inverse of A
[m,n]   = size(A);
% get SVD
[U,S,V] = svd(A);
% check rank
r       = rank(S);
SR      = S(1:r,1:r);
% make complete if rank is not full
SRc     = [SR^-1 zeros(r,m-r);zeros(n-r,r) zeros(n-r,m-r)];
% create inverse
A_inv   = V*SRc*U.';

X=[];    
for i = 1:1600
    % this actually takes most of the time
    k31 = rand(1000, 1);
    k32 = rand(1000, 1);
    B   = [k31';k32'];
    % X is overwritten on every loop...
    X   = [X A_inv*B];
end

N_xy = 1000;
x    = rand(N_xy,1);
y    = rand(N_xy,1);
g1   = X(1,1:N_xy);

figure(1), clf
scatter(x,y,5,g1)

我没有绘制所有1600000点,因为那不是你想要的