如何在MATLAB中添加fmincon中的约束

时间:2014-06-23 08:22:21

标签: matlab constraints mathematical-optimization

我正在尝试使用fmincon,我遇到了约束问题。我的约束在输入的情况下改变,在一种情况下我有9,在另一种情况下我有18个约束。我定义约束的方式如下:

if Input(1+(i-1)*3600*Tpred/Nu/60,3) == 0
  %Tamb
  ineq1(i,1)=(-y1(i,1)+16);
  ineq1(i,2)=(-y2(i,1)+16);
  ineq1(i,3)=(-y3(i,1)+16);
  %Tamb+1     
  ineq1(i,4)=(-y12(i,1)+16);
  ineq1(i,5)=(-y22(i,1)+16);
  ineq1(i,6)=(-y32(i,1)+16);
  %Tamb-1     
  ineq1(i,7)=(-y13(i,1)+16);
  ineq1(i,8)=(-y23(i,1)+16);
  ineq1(i,9)=(-y33(i,1)+16);
else
  %Tamb
  ineq1(i,1)=(y1(i,1)-25);
  ineq1(i,2)=(-y1(i,1)+21);
  eq1(i,1)=(y1(i,1)-23)^2;

  ineq1(i,3)=(y2(i,1)-25);
  ineq1(i,4)=(-y2(i,1)+21);
  eq1(i,2)=(y2(i,1)-23)^2;

  ineq1(i,5)=(y3(i,1)-25);
  ineq1(i,6)=(-y3(i,1)+21);
  eq1(i,3)=(y3(i,1)-23)^2;
  %Tamb+1
  ineq1(i,7)=(y12(i,1)-25);
  ineq1(i,8)=(-y12(i,1)+21);
  eq1(i,4)=(y12(i,1)-23)^2;

  ineq1(i,9)=(y22(i,1)-25);
  ineq1(i,10)=(-y22(i,1)+21);
  eq1(i,5)=(y22(i,1)-23)^2;

  ineq1(i,11)=(y32(i,1)-25);
  ineq1(i,12)=(-y32(i,1)+21);
  eq1(i,6)=(y32(i,1)-23)^2;
  %Tamb-1
  ineq1(i,13)=(y13(i,1)-25);
  ineq1(i,14)=(-y13(i,1)+21);
  eq1(i,7)=(y13(i,1)-23)^2;

  ineq1(i,15)=(y23(i,1)-25);
  ineq1(i,16)=(-y23(i,1)+21);
  eq1(i,8)=(y23(i,1)-23)^2;

  ineq1(i,17)=(y33(i,1)-25);
  ineq1(i,18)=(-y33(i,1)+21);
  eq1(i,9)=(y33(i,1)-23)^2;
end

我一步一步地运行它,它进入if-condition并在两种情况下计算约束。但我不知道为什么fmincon无法满足约束条件。我知道如果输入发生变化,我的模型可以满足它们,但是fmincon没有任何错误就可以满足它们。同样,当我检查我的不平等约束是肯定的,这必须是我的负面。

我是否定义了我的约束错误?

最诚挚的问候,

1 个答案:

答案 0 :(得分:0)

在最小化过程中,fmincon假定约束向量的大小不会改变。这是因为为了进行最小化,它必须计算成本函数的梯度,以及约束的梯度,并且它不能看到一些元素从一个函数调用消失到另一个。

也许有可能用约束向量重新定义你的问题,约束向量总是设置为最大大小(在你的情况下为18),并且当只需要一半时,将最新组件设置为-1。但是,请注意,使用此解决方案,您将失去一些问题的规律性。