2014-06-08 74 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和更好地縮放事物,你可以做些什麼。