📄 addevalvariablecuts.m
字号:
function pcut = addEvalVariableCuts(p)
temp = p.F_struc(1:p.K.f,:);
p.F_struc(1:p.K.f,:) = [];
pcut = p;
for i = 1:length(p.evalMap)
y = p.evalVariables(i);
x = p.evalMap{i}.variableIndex;
xL = p.lb(x);
xU = p.ub(x);
% Generate a convex hull polytope
switch p.evalMap{i}.fcn
case 'exp'
[Ax, Ay, b] = bound_exp(xL,xU);
case {'sqrtm','sqrtm_internal'}
[Ax, Ay, b] = bound_sqrtm(xL,xU);
otherwise
% sample function
z = linspace(xL,xU,100);
if isequal(p.evalMap{i}.fcn,'sdpfun')
fz = feval(p.evalMap{i}.arg{2},z);
else
fz = feval(p.evalMap{i}.fcn,z);
end
% create 4 bounding planes
% f(z) < k1*(x-XL) + f(xL)
% f(z) > k2*(x-XL) + f(xL)
% f(z) < k3*(x-XU) + f(xU)
% f(z) > k4*(x-XU) + f(xU)
k1 = max((fz(2:end)-fz(1))./(z(2:end)-xL))+1e-3;
k2 = min((fz(2:end)-fz(1))./(z(2:end)-xL))-1e-3;
k3 = min((fz(1:end-1)-fz(end))./(z(1:end-1)-xU))+1e-3;
k4 = max((fz(1:end-1)-fz(end))./(z(1:end-1)-xU))-1e-3;
Ax = [-k1;k2;-k3;k4];
Ay = [1;-1;1;-1];
b = [k1*(-z(1)) + fz(1);-(k2*(-z(1)) + fz(1));k3*(-z(end)) + fz(end);-(k4*(-z(end)) + fz(end))];
if 0
hold on
plot(z,fz)
plot(z,fz(1) + k1*(z-z(1)))
plot(z,fz(1) + k2*(z-z(1)))
plot(z,fz(end) + k3*(z-z(end)))
plot(z,fz(end) + k4*(z-z(end)))
end
% Ax = zeros(0,1);
% Ay = zeros(0,1);
% b = zeros(0,1);
end
F_structemp = zeros(size(b,1),length(p.c)+1);
F_structemp(:,1+y) = -Ay;
F_structemp(:,1+x) = -Ax;
F_structemp(:,1) = b;
pcut.F_struc = [F_structemp; pcut.F_struc];
pcut.K.l = pcut.K.l + length(b);
end
pcut.F_struc = [temp;pcut.F_struc];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -