Matlab中的二次约束可行性

时间:2013-09-30 04:45:14

标签: matlab matrix

假设A是n×n矩阵,并且我已经观察到A的一些条目,例如,A_S对于{1,...,n} x {1,...,n}中的某个子集S.我想知道A是否有可能排名第一。

因此,可以将其重新表述为以下问题:是否存在向量x和y,使得在S上限制的xy ^ T等于观察值A_S?

通过连接x和y,比如说,让z = [x; y],我们可以将这个约束写成z中的二次形式。如何在Matlab中测试约束是否可行?

1 个答案:

答案 0 :(得分:2)

我认为您会发现fmincon对您的案件有帮助 保留目标函数为零,并将非线性等式约束编码为二次约束。

编辑:(定义二次约束函数的例子)

写一个m函数:

function err = myQuadEqCon( z, n, S, A_s )
% given z ( a concatanation of x and y n-vectors ) and a set of entries S
% checks (x*y')(S) == A_s
x = z( 1:n );
y = z( (n+1):end );
xy = x*y.';
err = sum( abs( xy(S) - A_s ) );

现在,在“主要”功能/脚本中,确保您有n(问题的维度),SA_s已正确定义,然后

>> z = fmincon( @(z) 0, ... % objective function plays no role
                z0, ... % your initial guess for x and y
                [], [], [], [], [], [], ... % linear constraints are empty
                @( z ) deal( 0, ... % first output nonlinear inequalities
                             myQuadEqCon( z, n, S, A_s ) ) );