MATLAB - 奇点警告

时间:2014-06-08 16:03:32

标签: matlab

当我的matlab代码到达该行时:

        vE(:,:,i)=(mY(:,:,i))\(-mA*(vIs-mG(:,:,i)*vVs));

出现以下警告:

    Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
    RCOND = 1.682710e-16. 

怎么了?

完整代码:

function [ vE, vV_node, vI_node ] = ...
node_analysis( vIs, vVs, mA, mG, mY )

[A,B,N]=size(mY);
vE=zeros(4,1,N);

for i=1:N
    vE(:,:,i)=(mY(:,:,i))\(-mA*(vIs-mG(:,:,i)*vVs));
    vV_node(:,:,i)=mA'*vE(:,:,i);
    vI_node(:,:,i)=mG(:,:,i)*vV_node(:,:,i)+(vIs-mG(:,:,i)*vVs);
end
end

vE=mY^-1 * (-mA*(cIs-mG*vVs))
vE is (4x1xN) size
mY(4x4xN)
mA(4x9)
vIs(9x1)
mG(9x9xN)
vVs(9x1) 

1 个答案:

答案 0 :(得分:1)

当您将\运算符与矩阵一起使用时,MATLAB将尝试求解最小二乘问题,以估算等式x中给定y的{​​{1}}。根据A的大小和形状,如果没有其他信息,解决这个等式可能很容易,很难或不可能。这取决于你的具体问题。

正如Oli提到的评论,这是因为你的矩阵接近于奇异或其奇异值接近于零。 MATLAB正确告知您MATRIX可能有未知的信息会搞砸答案,或者MATRIX中的某些信息与小部分要解决的其他部分相比是如此之小{{1几乎不可能且容易出错。

根据您的数学背景,您可能会考虑我创建的以下cod创建一个非常小的值的矩阵。这将重现您的错误:

y = A*x

有多种方法可以开始尝试解决这个问题,通常是通过重新制定问题和/或添加某种正规化术语。不过,一个好的第一次尝试是添加一个简单的Tikhonov正则化,它将所有小值加到MATLAB可以使用的合理范围内。这可能会弄乱您的数据,但您可以使用它。

粗略地说,试试这个:

x

对于较大或较小的%% Make some data: randn('seed', 1982); n = 3; A = zeros(n); for ind = 1:n-1 v = randn(n,1); A = A + v*v'; end % Last bit is very tiny compared to the others: A = A + 1e-14*randn(n,1)*randn(1,n); %% Try and solve Ax=y for x= 1,2,3... x = (1:n)'; y = A*x x_est = A \ y 值,您会看到错误消失,但解决方案在某种程度上是错误的。您可能会发现这是否可以接受。

请注意,在我的示例中,答案是错误的,因为我使用了tikk = 1e-12; x_est2 = (A + tikk * eye(n)) \ y 。当您增加问题大小tikk时,您将获得更好的结果。


最后,要开始探索矩阵n=3n)的错误,您可以考虑查看A(-mA*(vIs-mG(:,:,i)*vVs))值的衰减速度。其中一些应该非常接近于零。此外,您可以看看Tihkonov正则化以及通过将矩阵实际分解为SVD并更好地扩展事物可以做些什么。