2014-06-08 57 views
1
当我的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) 
+3

好吧,你的矩阵接近单数。如果你想根据它来解决,那么这是一个问题。没有任何进一步的背景,建议解决方案是不可能的。 –

+0

你需要给我们更多的代码。你究竟计算什么?你如何计算进入'mY,mA,...等的值?奇异矩阵**不好**。简而言之,如果你想依靠他们获得具体的结果,你不能。对于接近单数的矩阵,条目中的小改变会导致输出变化很大。请参阅:http://en.wikipedia.org/wiki/Condition_number – rayryeng

+0

Ive编辑我的文章 – user3699907

回答

1

当您使用\运营商矩阵,MATLAB会尝试解决最小二乘问题的方程式y = A*x在估算x给出y。根据A的大小和形状,在没有附加信息的情况下解决这个等式可能很容易,困难或不可能。这取决于你的特殊问题。

正如Oli提到的评论,这是因为你的矩阵接近单数或其奇异值接近于零。 MATLAB正在适当地告诉你,MATRIX可能有未知的信息将会弄糟答案,或者MATRIX中的一些信息与其他小块相比非常小,以至于小部分将要求解决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 

有不同的方法,开始试图解决这一问题,通常是由重整问题和/或增加某种正则项。不过,首先尝试一下,就是添加一个简单的Tikhonov正则化,将所有小值颠倒成MATLAB可以使用的合理值。这可能会搞乱你的数据,但你可以用它来制作。

粗略地说,试试这个:

tikk = 1e-12; 
x_est2 = (A + tikk * eye(n)) \ y 

对于更大或更小的tikk值,你会看到错误消失,但解决的办法是在一定程度上是错误的。你可能会发现这可以接受或不可以。

请注意,在我的例子中,答案是错误的,因为我使用了n=3。当你增加问题的大小n你会得到更好的结果。


最后,开始探索什么是错的矩阵A(-mA*(vIs-mG(:,:,i)*vVs))),你可能会考虑在s=svd(A)衰减看到如何快速的价值s。其中一些应该非常接近于零。另外,你可以看看Tihkonov正则化,以及通过实际将矩阵分解为SVD和更好地缩放事物,你可以做些什么。