## Plot Functions

### Plot Optimization During Execution

You can plot various measures of progress during the execution of a solver. Use the
`PlotFcn`

name-value argument of `optimoptions`

to specify one or more plotting functions for the
solver to call at each iteration. Pass a function handle, function name, or cell
array of function handles or function names as the `PlotFcn`

value.

Each solver has a variety of predefined plot functions available. For more information, see
the `PlotFcn`

option description on the function reference page for
a solver.

You can also use a custom plot function, as shown in Create Custom Plot Function. Write a function file using the same structure as an output function. For more information on this structure, see Output Function and Plot Function Syntax.

### Use Predefined Plot Functions

This example shows how to use plot functions to view the progress of the `fmincon`

"`interior-point"`

algorithm. The problem is taken from Constrained Nonlinear Problem Using Optimize Live Editor Task or Solver.

Write the nonlinear objective and constraint functions, including their gradients. The objective function is Rosenbrock's function.

`type rosenbrockwithgrad`

function [f,g] = rosenbrockwithgrad(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2; if nargout > 1 % gradient required g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); 200*(x(2)-x(1)^2)]; end

Save this file as `rosenbrockwithgrad.m`

.

The constraint function is that the solution satisfies `norm(x)^2 <= 1`

.

`type unitdisk2`

function [c,ceq,gc,gceq] = unitdisk2(x) c = x(1)^2 + x(2)^2 - 1; ceq = [ ]; if nargout > 2 gc = [2*x(1);2*x(2)]; gceq = []; end

Save this file as `unitdisk2.m`

.

Create options for the solver that include calling three plot functions.

options = optimoptions(@fmincon,Algorithm="interior-point",... SpecifyObjectiveGradient=true,SpecifyConstraintGradient=true,... PlotFcn={@optimplotx,@optimplotfval,@optimplotfirstorderopt});

Create the initial point `x0 = [0,0]`

, and set the remaining inputs to empty (`[]`

).

x0 = [0,0]; A = []; b = []; Aeq = []; beq = []; lb = []; ub = [];

Call `fmincon`

, including the options.

fun = @rosenbrockwithgrad; nonlcon = @unitdisk2; x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

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×2*
0.7864 0.6177

### Create Custom Plot Function

To create a custom plot function for an Optimization Toolbox™ solver, write a function using the syntax

function stop = plotfun(x,optimValues,state) stop = false; switch state case "init" % Set up plot case "iter" % Plot points case "done" % Clean up plots % Some solvers also use case "interrupt" end end

Global Optimization Toolbox solvers use different syntaxes.

The software passes the `x`

, `optimValues`

, and `state`

data to your plot function. For complete syntax details and a list of the data in the `optimValues`

argument, see Output Function and Plot Function Syntax. You pass the plot function name to the solver using the `PlotFcn`

name-value argument.

For example, the `plotfandgrad`

helper function listed at the end of this example plots the objective function value and norm of the gradient for a scalar-valued objective function. Use the `ras`

helper function listed at the end of this example as the objective function. The `ras`

function includes a gradient calculation, so for efficiency, set the `SpecifyObjectiveGradient`

name-value argument to `true`

.

fun = @ras; rng(1) % For reproducibility x0 = 10*randn(2,1); % Random initial point opts = optimoptions(@fminunc,SpecifyObjectiveGradient=true,PlotFcn=@plotfandgrad); [x,fval] = fminunc(fun,x0,opts)

Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.

`x = `*2×1*
1.9949
1.9949

fval = 17.9798

The plot shows that the norm of the gradient converges to zero, as expected for an unconstrained optimization.

**Helper Functions**

This code creates the `plotfandgrad`

helper function.

function stop = plotfandgrad(x,optimValues,state) persistent iters fvals grads % Retain these values throughout the optimization stop = false; switch state case "init" iters = []; fvals = []; grads = []; case "iter" iters = [iters optimValues.iteration]; fvals = [fvals optimValues.fval]; grads = [grads norm(optimValues.gradient)]; plot(iters,fvals,"o",iters,grads,"x"); legend("Objective","Norm(gradient)") case "done" end end

This code creates the `ras`

helper function.

function [f,g] = ras(x) f = 20 + x(1)^2 + x(2)^2 - 10*cos(2*pi*x(1) + 2*pi*x(2)); if nargout > 1 g(2) = 2*x(2) + 20*pi*sin(2*pi*x(1) + 2*pi*x(2)); g(1) = 2*x(1) + 20*pi*sin(2*pi*x(1) + 2*pi*x(2)); end end