# Optimize Function with two sums using fmincon

18 views (last 30 days)
Meikel Vollmers on 11 May 2021
Edited: Matt J on 17 May 2021
Hey everybody,
i have to calculate the a(i) to optimize the following function k = [5,7,11,13]
p = [1:6]
the a(i) have to be between [0,pi/4]. I want to use the fmincon function, but i dont know how to programm the function d. My first try was the following:
k = [5,7,11,13];
p = [1:4];
a0 = [pi/10, pi/8, pi/7, pi/5];
f1 = sum(1./k.^4)*(1.+2.*sum((-1).^p.*cos(k.*a(p)))).^2;
f2 = sum(1./k.^4);
obj = sqrt(f1./f2);
A = [];
B = [];
Aeq = [];
Beq = [];
lb = [0,0,0,0];
ub = [pi/4,pi/4,pi/4,pi/4];
x = fmincon(Sum, a0, A, B, Aeq, Beq, lb, ub);
But this is not working at all. "Error using optimfcnchk (line 117) FUN must be a function, a valid character vector expression, or an inline function object."
Furthermore the code does not provide an overall combination of the parameters, so i tried it this way
Sum = 0;
a = [pi/8, pi/7, pi/6, pi/5];
for k = [5,7,11]
for p = [1:4]
Sum = Sum + sqrt(((1/k.^4) * (1+2*(-1).^p .*cos(k*a(p)).^2) / (1/k^4)));
end
end
A = [];
B = [];
Aeq = [];
Beq = [];
lb = [0,0,0,0];
ub = [pi/4,pi/4,pi/4,pi/4];
x = fmincon(Sum, a, A, B, Aeq, Beq, lb, ub);
But now the function cant be used in fmincon.
Can somebody help me how i can implement the desired funnktion to be optimized with fmincon?
Regards

Matt J on 11 May 2021
Edited: Matt J on 12 May 2021
k = [5,7,11,13];
p = [1:4];
a0 = [pi/10, pi/8, pi/7, pi/5];
weights=(1./k.^4);
weights=weights/sum(weights);
fun = @(a) sum( weights(:).*( 1 + 2*sum( (-1).^p.*cos(k(:).*a) ,2) ).^2 );
A = [];
B = [];
Aeq = [];
Beq = [];
lb = [0,0,0,0];
ub = [pi/4,pi/4,pi/4,pi/4];
x = fmincon(fun, a0, A, B, Aeq, Beq, lb, ub)
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
x = 1×4
0.1841 0.2809 0.5394 0.5736
Matt J on 17 May 2021
It needs to be,
nlcon = @(a) modindex(a,p);