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)
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)
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