2011-02-04 106 views
0

我有一個[8x4]矩陣,'A'和一個[8x1]矩陣,'B'。我如何檢查是否存在[4x1]矩陣'x',使得A * X = B線性規劃 - MATLAB

這可以使用MATLAB中的linprog來完成,但我不確定如何給出約束條件。我試過x = linprog([],[],[],A,B);,但這似乎不起作用。

如何指定條件x>=0並將其優化爲A*X-B,以便如果返回0,則知道存在X

更新:

在MATLAB pinv不會在所有情況下工作。請看下面的例子:

A= [1  0  0  0 
    0  1 -1 -1 
    -1 -1  1 -1 
    -1 -1 -1  1 
    0  0  0  0 
    0  0  0  0 
    0  0  0  0 
    1  1  1  1] 
B = [0 
    0 
    0 
    -1 
    0 
    0 
    0 
    1] 

使用pinv給出x的值:

X = [-2.7756e-017 
    0.5000 
    0.5000 
     0] 

但當線性規劃使用我得到X爲:

X = [ 0 
    0.5000 
    0.5000 
     0] 

這是之所以我選擇MATLAB中的linprog工具。我剛剛以前面提到的方式使用了它,但它引發了很多警告。我仍然認爲有更好的方法來正確使用這個功能。它沒有拋出這個矩陣,但通常當我循環了很多矩陣我的命令窗口溢出與警告。

回答

2

爲什麼使用線性規劃?你可以只解決系統A*x=B直接:

A =[ 1 -1 -1 -1  1  0  0  1 
    -1  1 -1  0  0  1  0  0 
    -1 -1  1  0  1  0  0  0 
    -1 -1 -1  1  1  1  0  0]'; %'# 

B = [-1 -1  0  0  0  0  1  1]'; %'# 

x = A\B 
x = 
     0.16327 
    0.097959 
     0.46531 
     0.11837 

你可能面臨的問題是,A可以秩虧的,但在這種情況下,你會爲​​x獲得無限多的解決方案。

+0

這是主要問題。我現在所做的是如果((A * pinv(A)* B)== B)那麼存在一個解決方案。其中pinv是matlab中的僞逆函數。我認爲線性編程很好地處理了這種情況。這就是爲什麼我正在尋找一種方法來做到這一點。 – 2011-02-04 03:04:53

+0

+1用於記住我以前的問題。謝謝 – 2011-02-04 03:06:33

+1

不,你不知道這是真的。在浮點運算中應用這種EXACT相等的測試將是真實的。使用linprog來嘗試做這個測試是愚蠢的。 – 2011-02-04 04:28:19

0

不幸的是,你不能使用數組除法。這不是一個矩陣分工。但是,可以使用矩陣A的逆與矩陣B相乘以得到x x =(A-1)B,但我不確定對於非方陣A(8x4)是否可能有逆。因此,您可能無法使用linprog工作

2

但是,爲什麼要使用代碼來完成比解決問題所需的更多工作?只要使用僞逆。如果A滿秩,那麼反斜槓就足夠了。

計算解決方案。如果殘差的標準小於某個容差,那麼你有一個解決方案。請注意,基本上沒有解決方案可以確保爲您提供真正的零殘差,因此您必須應用容差。因此

x = A\B; 
if norm(B - A*x) < tol 
    disp('Eureeka!') 
end 

或者使用x=pinv(A)*B如果你擔心A.

試圖在這個問題拋出linprog肯定不會比直接的解決方案本身更有效的排名。

編輯:由於結果的非負性現在已作爲要求添加,請改用lsqnonneg。只需將殘差向量的範數與容差進行比較即可。如果規範太大,則不存在解決方案。