This example shows how to minimize an objective function subject to nonlinear inequality constraints and bounds using pattern search.
We want to minimize a simple objective function of two variables x1
and x2
min f(x) = (4 - 2.1*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-4 + 4*x2^2)*x2^2; x
such that the following nonlinear constraints and bounds are satisfied
x1*x2 + x1 - x2 + 1.5 <=0, (nonlinear constraint) 10 - x1*x2 <=0, (nonlinear constraint) 0 <= x1 <= 1, and (bound) 0 <= x2 <= 13 (bound)
The above objective function is known as 'cam' as described in L.C.W. Dixon and G.P. Szego (eds.), Towards Global Optimisation 2, North-Holland, Amsterdam, 1978.
We create a MATLAB file named simple_objective.m with the following code in it:
function y = simple_objective(x) y = (4 - 2.1*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + ... (-4 + 4*x(2)^2)*x(2)^2;
The Pattern Search solver assumes the objective function will take one input x
where x
has as many elements as number of variables in the problem. The objective function computes the value of the function and returns that scalar value in its one return argument y
.
We create a MATLAB file named simple_constraint.m
with the following code in it:
function [c, ceq] = simple_constraint(x) c = [1.5 + x(1)*x(2) + x(1) - x(2); -x(1)*x(2) + 10]; ceq = [];
The Pattern Search solver assumes the constraint function will take one input x
where x
has as many elements as number of variables in the problem. The constraint function computes the values of all the inequality and equality constraints and returns two vectors c
and ceq
respectively.
To minimize our objective function using the patternsearch
function, we need to pass in a function handle to the objective function as well as specifying a start point as the second argument. Lower and upper bounds are provided as LB
and UB
respectively. In addition, we also need to pass in a function handle to the nonlinear constraint function.
ObjectiveFunction = @simple_objective; X0 = [0 0]; % Starting point LB = [0 0]; % Lower bound UB = [1 13]; % Upper bound ConstraintFunction = @simple_constraint; [x,fval] = patternsearch(ObjectiveFunction,X0,[],[],[],[],LB,UB, ... ConstraintFunction)
Optimization terminated: mesh size less than options.MeshTolerance and constraint violation is less than options.ConstraintTolerance.
x = 1×2
0.8122 12.3122
fval = 9.1324e+04
Next we create options using optimoptions
that select two plot functions. The first plot function psplotbestf
plots the best objective function value at every iterations, and the second plot function psplotmaxconstr
plots maximum constraint violation at every iterations. We can also visualize the progress of the algorithm by displaying information to the command window using the Display
option.
options = optimoptions(@patternsearch,'PlotFcn',{@psplotbestf,@psplotmaxconstr}, ... 'Display','iter'); % Next we run the PATTERNSEARCH solver. [x,fval] = patternsearch(ObjectiveFunction,X0,[],[],[],[],LB,UB, ... ConstraintFunction,options)
Max Iter Func-count f(x) Constraint MeshSize Method 0 1 0 10 0.8919 1 28 113580 0 0.001 Increase penalty 2 105 91324 1.776e-07 1e-05 Increase penalty 3 192 91324 1.185e-11 1e-07 Increase penalty Optimization terminated: mesh size less than options.MeshTolerance and constraint violation is less than options.ConstraintTolerance.
x = 1×2
0.8122 12.3122
fval = 9.1324e+04