Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Funciones de gráfica

Representar una optimización durante la ejecución

Puede representar varias medidas de progreso mientras se ejecuta un solver. Utilice el argumento nombre-valor PlotFcn de optimoptions para especificar una o varias funciones de representación para que el solver las llame en cada iteración. Pase un identificador de función, un nombre de función o un arreglo de celdas de identificadores de función o de nombres de función como el valor de PlotFcn.

Cada solver tiene una variedad de funciones de gráfica predefinidas disponible. Para obtener más información, consulte la descripción de la opción PlotFcn en la página de referencia de la función de un solver.

También puede utilizar una función de gráfica personalizada, como se muestra en Crear una función de gráfica personalizada. Escriba un archivo de función con la misma estructura que una función de salida. Para obtener más información sobre esta estructura, consulte Sintaxis de función de salida y función de gráfica.

Utilizar funciones de gráfica predefinidas

Este ejemplo muestra cómo utilizar funciones de gráfica para visualizar el progreso del algoritmo fmincon "interior-point". El problema se ha tomado de Problema no lineal restringido utilizando la tarea Optimize de Live Editor o el solver.

Escriba la función objetivo no lineal y la función de restricción, incluyendo sus gradientes. La función objetivo es la función de Rosenbrock.

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

Guarde este archivo como rosenbrockwithgrad.m.

La función de restricción es que la solución cumpla 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

Guarde este archivo como unitdisk2.m.

Cree opciones para el solver que incluyan llamar a tres funciones de gráfica.

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

Cree el punto inicial x0 = [0,0] y establezca las entradas restantes en vacías ([]).

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

Llame a fmincon, incluyendo las opciones.

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

Figure Optimization Plot Function contains 3 axes objects. Axes object 1 with title Current Point, xlabel Variable number, ylabel Current point contains an object of type bar. Axes object 2 with title Current Function Value: 0.0456748, xlabel Iteration, ylabel Function value contains an object of type scatter. Axes object 3 with title First-order Optimality: 2.16246e-08, xlabel Iteration, ylabel First-order optimality contains an object of type scatter.

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

Crear una función de gráfica personalizada

Para crear una función de gráfica personalizada para un solver de Optimization Toolbox™, escriba una función utilizando la sintaxis

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

Los solvers de Global Optimization Toolbox utilizan sintaxis diferentes.

El software pasa los datos x, optimValues y state a la función de gráfica. Para obtener detalles completos de la sintaxis y una lista de los datos del argumento optimValues, consulte Sintaxis de función de salida y función de gráfica. El nombre de la función de gráfica se pasa al solver utilizando el argumento nombre-valor PlotFcn.

Por ejemplo, la función auxiliar plotfandgrad enumerada al final de este ejemplo representa el valor de la función objetivo y la norma del gradiente para una función objetivo de valor escalar. Utilice la función auxiliar ras enumerada al final de este ejemplo como función objetivo. La función ras incluye un cálculo de gradiente, por lo que, por motivos de eficiencia, establezca el argumento nombre-valor SpecifyObjectiveGradient en 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)

Figure Optimization Plot Function contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Objective, Norm(gradient).

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

La gráfica muestra que la norma del gradiente converge en cero, como se preveía para una optimización no restringida.

Funciones auxiliares

Este código crea la función auxiliar plotfandgrad.

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

Este código crea la función auxiliar ras.

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

Temas relacionados