I have a convex function that would be written in matlab as

f(x) = sum( a.*exp(b.*x) );

where a is a vector of non-negative reals, b is a vector of reals (more often than not negative), and x is a vector of reals. From the composition rules, this is convex, as it is the sum of positive scalars times convex functions.

I would like to minimize f subject to the constraint

c(x) - C <= 0

c(x) = c_0 * sum( exp( x) );

where c_0 and C are specified positive constants. My question is related to syntax, how can I write element wise multiplication like I have for f?

I have been using fmincon for this, but would like to move away from requiring the optimization toolbox, both because I have convexity I should be able to exploit and because I want something open source.

I have a minimal working example, which shows fmincon beating CVX, and given the problem is convex, I don’t think this should be the case, thus I suspect I have gotten something wrong syntactically.

One note: this is a toy version, in practice x is much larger, and I don’t know its length in advance, I only receive a and b which are of the same length and obey the rules I mentioned previously. So for any final solution i could not write something like

sum( a(1)*exp(b(1)*x(1)) + a(2)*exp(b(2)*x(2)) )

# CODE:

% CVX

a = 1.0e-04 * [0.9, 0.05, 0.04];

b = [ -11.1 -5.11 -5.05 ];

n = numel(a);

c_0 = 2; C = 2;

cvx_begin

variables x(n)

minimize sum( a*exp(b*x) )

subject to

c_0 * sum(exp(x)) - C <= 0

cvx_end

x_cvx = x’;

% FMINCON

f = @(x) fM(x,a,b);

c = @(x) cM(x,c_0,C);

[x,fval] = fmincon( f, zeros(size(a)),[],[],[],[],[],[],c);

x_fmincon = x;

f(x_cvx) % This gives 0.153158

f(x_fmincon) % This gives 0.05774

% functions for passing anonymously to fmincon

function [f,fx] = fM(x,a,b)

f = sum( a.* exp(b.*x) );

if nargout >1

fx = a .*b .* exp( b.*x);

end

end

function [c,ceq] = cM(x,c0,C)

c = c0 * sum( exp( x) ) - C;

ceq = [];

end