43 lines
998 B
Matlab
Executable File
43 lines
998 B
Matlab
Executable File
function [Ax,Ay,b,K] = convexhullConcave(varargin)
|
|
|
|
%function [Ax,Ay,b] = convexhullConcave(xL,xU,fL,fU,dfL,dfU)
|
|
% Two lower bounds from tangents
|
|
% y < f(xL) + (x-xL)*df(xL)
|
|
% y < f(xU) + (x-xL)*df(xU)
|
|
% Upper bound from conneting extreme points
|
|
% y > f(xU)(x-xL)/(xU-xL) + f(xL)(xU-x)/(xU-xL)
|
|
% can be wrtitten as
|
|
% Ax*x + Ay*y < b
|
|
|
|
if rem(nargin,3)
|
|
error('The convex hull generator assumes n triplets (x,f,df).')
|
|
end
|
|
m = nargin/3;
|
|
x = [varargin{(1:m)}]';
|
|
f = [varargin{(1:m)+m}]';
|
|
df = [varargin{(1:m)+2*m}]';
|
|
|
|
if all(diff(x)>0)
|
|
Ay = -[-ones(m,1);1];
|
|
b = [f - x.*df; f(end)*x(1)/(x(end)-x(1)) - f(1)*x(end)/(x(end)-x(1))];
|
|
Ax = [-df;f(end)/(x(end)-x(1)) - f(1)/(x(end)-x(1))];
|
|
|
|
% Don't use ill-conditioned cuts
|
|
if df(1)>1000
|
|
Ax(1)=[];
|
|
Ay(1) = [];
|
|
b(1) = [];
|
|
end
|
|
if df(end)<-1000
|
|
Ax(end)=[];
|
|
Ay(end) = [];
|
|
b(end) = [];
|
|
end
|
|
|
|
else
|
|
Ax = [];
|
|
Ay = [];
|
|
b = [];
|
|
end
|
|
K.f = 0;
|
|
K.l = length(b); |