我正在尝试使用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
没有任何错误就可以满足它们。同样,当我检查我的不平等约束是肯定的,这必须是我的负面。
我是否定义了我的约束错误?
最诚挚的问候,
答案 0 :(得分:0)
在最小化过程中,fmincon假定约束向量的大小不会改变。这是因为为了进行最小化,它必须计算成本函数的梯度,以及约束的梯度,并且它不能看到一些元素从一个函数调用消失到另一个。
也许有可能用约束向量重新定义你的问题,约束向量总是设置为最大大小(在你的情况下为18),并且当只需要一半时,将最新组件设置为-1。但是,请注意,使用此解决方案,您将失去一些问题的规律性。