2011-02-04 174 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。只需将残差向量的范数与容差进行比较即可。如果规范太大,则不存在解决方案。