Convert Nonlinear Constraints Between
surrogateopt Form and Other
Why Convert Constraint Forms?
To try various solvers including
surrogateopt on a problem that has
nonlinear inequality constraints, you must convert between the form required by
surrogateopt and the form required by other solvers.
surrogateopt Structure Form to Other Solvers
The objective function
surrogateopt returns a structure. The
contains the objective function value, a scalar. The
Ineq field contains
a vector of constraint function values. The solver attempts to make all values in the
Ineq field be less than or equal to zero. Positive values indicate a
Other solvers expect the objective function to return a scalar value, not a structure.
Other solvers also expect the nonlinear constraint function to return two outputs,
ceq(x), not a structure containing
To convert the
objconstr(x) for use in other solvers:
Set the objective function to
Set the nonlinear constraint function to
function ff = objconstr(x) ff.Fval = norm(x)^2; ff.Ineq = norm(x - [5,8])^2 - 25; end
To solve a constrained minimization problem using
lb = [-10,-20]; ub = [20,10]; sol = surrogateopt(@objconstr,lb,ub)
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'. sol = 2.3504 3.7598
To solve the same problem using
fmincon, split the objective and
constraint into separate functions. Include the nonlinear equality constraint as
 by using the
objfcn = @(x)objconstr(x).Fval; nlcon = @(x)deal(objconstr(x).Ineq,);
fmincon with the objective function
and nonlinear constraint function
[solf,fvalf,eflag,output] = ... fmincon(objfcn,[0,0],,,,,lb,ub,nlcon)
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. solf = 2.3500 3.7600 fvalf = 19.6602 eflag = 1 output = struct with fields: iterations: 7 funcCount: 24 constrviolation: 0 stepsize: 2.0397e-05 algorithm: 'interior-point' firstorderopt: 4.8151e-06 cgiterations: 0 message: '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.↵↵<stopping criteria details>↵↵Optimization completed: The relative first-order optimality measure, 6.403047e-07,↵is less than options.OptimalityTolerance = 1.000000e-06, and the relative maximum constraint↵violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-06.' bestfeasible: [1×1 struct]
You can also use
ga to solve
the problem using the same conversion.
Convert from Other Solvers to
surrogateopt Structure Form
If you have a problem written in the form for other solvers, use the
packfcn function to
convert the objective and nonlinear constraints to the structure form for
surrogateopt. If the objective function is a function handle
@obj and the nonlinear constraint function is
@nlconst, then use the objective function
objconstr = packfcn(@obj,@nlconst);
In this example, the objective function is Rosenbrock's function.
ros = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
Specify the constraint function to restrict the solution to lie inside a disk of radius 1/3 centered at the point [1/3,1/3].
function [c,ceq] = circlecon(x) c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2; ceq = ;
Set bounds of –2 and 2 on each component.
lb = [-2,-2]; ub = [2,2];
Solve the problem using
patternsearch starting from [0,0].
x0 = [0,0]; x = patternsearch(ros,x0,,,,,lb,ub,@circlecon)
Optimization finished: mesh size less than options.MeshTolerance and constraint violation is less than options.ConstraintTolerance. x = 0.6523 0.4258
Convert the problem for solution by
objconstr = packfcn(ros,@circlecon); xs = surrogateopt(objconstr,lb,ub)
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'. xs = 0.6543 0.4286