Matlab Fmincon:设置具有依赖性的约束

时间:2013-12-05 17:23:19

标签: matlab optimization

对于MATLAB fmincon用户来说,这可能是一个非常简单的问题:

我有一个函数Y = AX,其中A是常量的向量1 x N,Y是标量常量,X是向量N x 1;我需要找到X的最佳值 Y - A*X = 0X的初始值来自N x 1向量X0。还

X0(1) < X0(2) < ... X0(N)

约束是:

0 <= X(1);
X(1) < X(2);
X(2) < X(3);
...
...
X(N-1) < X(N);
X(N) <= 1;

X0(1) <= X(1);
X0(2) <= X(2);
X0(3) <= X(3);
...
...
X0(N-1) <= X(N-1);

我对这个问题的尝试是:

[X, fval] = fmincon(@(X)Y - A*X, X0,[],[],[],[],X0,[X(2:end);1],[],options);

我不认为我得到的结果是正确的。 另一种尝试是:

[X, fval] = fmincon(@(X)Y - A*X, X0,AA,zeros(N-1,1),[],[],[],[],[],options);

,其中

AA = [1 -1 0 0 0 ... N;
      0 1 -1 0 0 ... N;
      .
      .
      0 0 0 0 0 ... 1 -1];  (N-1 Rows)

也有失败。

任何建议,提示都会非常受欢迎!我希望我已经提供了有关这个问题的足够信息。

根据Shai的建议,我试过这个:

[X, fval] = fmincon(@(X) abs(Y - A*X), X0,AA,eps(0)*ones(N-1,1),[],[],X0,[],[],options);

但没有成功。经过N次迭代后,解收敛到X0。 我使用abs将Y - AX最小化为0,并使用下限中的X0来满足条件X0(1) < X(1)等。

谢谢Shai,使用人工/虚拟目标函数,是一个好主意。但是当我以下列方式使用linprog时:

[X, fval] = linprog( -(1:N), AA, -eps(0)*ones(N-1,1), ...
                         A, Y, X0, [], X0, options ); 

我遇到的问题是Y是标量而A仍然是N x 1向量。而linprog也希望Y也是一个向量。这当然改变了问题。我将下限设置为X0,上限为空(因为不等式约束处理它),并将初始值设置为X0。所以仍然没有工作。如果出现任何解决方案,将更新。

1 个答案:

答案 0 :(得分:1)

我看不出为什么我们找不到X A*X = Y的确切原因(足够大N应该有足够的自由度)。因此,我建议不要将|A*X-Y|目标函数设置为最小化,而是将A*X=Y作为约束添加 此外,为了鼓励Xi < Xj i<j,我建议使用“人工”目标函数-(1:N),这会对Xj j更加重视{/ 1}}。

[X, fval] = fmincon( @(X) -(1:N)*X(:), X0, AA, -eps(0)*ones(N-1,1), ...
                                           A, Y, zeros(N,1), ones(N,1), [], options); 

虽然我们在这里,你为什么不使用linear programing - 这应该比通用目的fmincon更好,因为它是为线性情况量身定制的?

[X, fval] = linprog( -(1:N), AA, -eps(0)*ones(N-1,1), ...
                             A, Y, zeros(N,1), ones(N,1), X0, options );