1.函数表达
需要说明的是,这类分段函数需要是连续函数,下面将对其进行线性化。
因为该函数有四个分段点,为-2,-1,2,5,所有需要四个连续变量和三个0-1变量才能实现转换。 其中实现函数的线性化,对进行限定,使其在的取值范围内。
,其中为四个分段点。
且需要约束如下:,,,
2.yalmip调用Cplex求解
代码如下
clc;
x=4;
d=binvar(1,3);
w=sdpvar(1,4);
st=[];
st=[st,
sum(d)==1,
sum(w)==1,
w(1)<=d(1),
w(2)<=d(1)+d(2),
w(3)<=d(2)+d(3),
w(4)<=d(3),
x==-2*w(1)-w(2)+2*w(3)+5*w(4),
w>=0,
];
y=w(1)+3*w(2)+6*w(3)+18*w(4);
ops=sdpsettings('solver', 'cplex');%参数指定程序用cplex求解器
optimize(st,y,ops)
outcome=['y=',num2str(double(y))];
验证结果如下 :设定可得
3.多个x同时求解
上面的代码只能单个求解,效率较低,下面更正代码如下,进行循环求解。
x=[250 60 90 120 150];
jw=250;
%增长率
jx=0.25;
%区间长度
L=100;
st=[];
z=binvar(6,5);
w=sdpvar(7,5);
for t=1:length(x)
st=[st,
z(1,t)+z(2,t)+z(3,t)+z(4,t)+z(5,t)+z(6,t)==1,
w(1,t)+w(2,t)+w(3,t)+w(4,t)+w(5,t)+w(6,t)+w(7,t)==1,
w(1,t)>=0,
w(2,t)>=0,
w(3,t)>=0,
w(4,t)>=0,
w(5,t)>=0,
w(6,t)>=0,
w(7,t)>=0,
x(t)==-200*w(1,t)-100*w(2,t)+100*w(4,t)+200*w(5,t)+300*w(6,t)+400*w(7,t),
w(1,t)<=z(1,t),
w(2,t)<=z(1,t)+z(2,t),
w(3,t)<=z(2,t)+z(3,t),
w(4,t)<=z(3,t)+z(4,t),
w(5,t)<=z(4,t)+z(5,t),
w(6,t)<=z(5,t)+z(6,t),
w(7,t)<=z(6,t),
];
end
y=(jw*(1+2*jx)*(-2*L)-jw*(1+jx)*L)*w(1,:)-(jw*(1+jx)*(-L))*w(2,:)+(jw*L)*w(4,:)+(jw*(1+jx)*L+jw*L)*w(5,:)...
+(jw*(1+2*jx)*L+jw*L*(2+jw))*w(6,:)+(jw*(1+3*jx)*L+jw*(3+3*jx)*L)*w(7,:);
ops=sdpsettings('solver', 'cplex');%参数指定程序用cplex求解器
optimize(st,y,ops)