Matlab:fmincon收敛到不可行点,不满足相等约束

时间:2018-07-11 14:30:24

标签: matlab optimization

我正在尝试使用fmincon优化x,以使R * x最小化,而x的值可以介于0和1.5之间,并且sum(x) = 3

R = transpose([6 6 6 6 6 6 6 9 9 9 9 13 13 13 13 9 9 9 9 6 6 6 6 6]);
x0 = zeros(24,1);
  f='0';
       for j=1:24
           s='%d*x(%d)';
           s=sprintf(s,R(j),j);
           g='%s+%s';
           f=sprintf(g,f,s);
       end

A = ones(2,24);
A(2,:) = -1;
b = [1.5; 0];    % Want x's to be between 0 and 1.5

Aeq = ones(1,24);
beq = [3];

%Bounds
lb = zeros(24,1);
ub = ones(24,1);

x = fmincon(f, x0, A, b,Aeq, beq,lb,ub);

我希望x的总和等于3(尝试用等价矩阵Aeq和beq展示这一点)。运行代码时显示以下错误:

  

收敛到不可能的点

应注意,此代码显示sum(x) = 2.25而不是sum(x) = 3

1 个答案:

答案 0 :(得分:1)

首先,您的函数定义可以简化为:

R = [6 6 6 6 6 6 6 9 9 9 9 13 13 13 13 9 9 9 9 6 6 6 6 6];
f = @(x)R*x;

第二,您的初始点x0不满足您的约束条件,因此我们将其更改为:

x0 = zeros(24,1)+3/24;

以使x的总和等于3。

接下来,由于您在x上具有恒定的上下边界,因此无需使用Ab矩阵,因此我们将其删除,并用空矩阵{ {1}}。我们将仅依靠[]lb

ub

最后,我们通过使用{p>

lb = zeros(24,1);
ub = 1.5*ones(24,1);