# Passing a variable constraint to fmincon

2 views (last 30 days)
Rifat on 18 May 2023
Commented: Rifat on 18 May 2023
Hi!,
I am using the 'fmincon' solver for optimizing a function that takes array of inputs. The optimization function is FUN = @(x)((sqrt((x(1) - a)^2 + (x(2) - b)^2) + sqrt((x(1) - c)^2 + (x(2) - d)^2))^2 - (y(nn))^2)^2. Note that y(nn) changes with 'nn'.
Currently, I am defining 'FUN' in a for loop so I can pass a scalar 'y'. Similary, the constraint function for 'FUN', i.e. c = sqrt((x(1)- h).^2 + (x(2) - g).^2)- y(nn) also change with 'nn'. However, I cannot call c(x,y(nn)) inside fimincon and neither can I define c(x) inside the for loop with a fixed value of y(nn). So, I would like to ask:
1. Is there any efficient way to pass the vector input 'y' to fmincon without defining FUN in a for loop?
2. How do I pass a vector argument to c(x) in addition to 'x'?
Thank you.

Matt J on 18 May 2023
Edited: Matt J on 18 May 2023
I think this is what you mean,
for nn=1:N
ynn=y(nn);
FUN = @(x)((sqrt((x(1) - a)^2 + (x(2) - b)^2) + sqrt((x(1) - c)^2 + (x(2) - d)^2))^2 - (ynn)^2)^2
CON=@(x) nonlcon(x,ynn,h,g);
xopt=fmincon(FUN,x0,A,b,Aeq,beq,lb,ub,con);
end
function [c,ceq]=nonlcon(x,y,h,g)
c = sqrt((x(1)- h).^2 + (x(2) - g).^2)- y;
ceq=[];
end
Rifat on 18 May 2023
Thanks guys for the insights!