Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Incluir derivados en flujo de trabajo basado en problemas

¿Por qué incluir derivados?

El ejemplo muestra cómo incluir información derivada en la optimización no lineal basada en problemas. Incluir gradientes o un hessian en una optimización puede dar los siguientes beneficios:

  • Resultados más robustos. Los pasos de diferenciación finita a veces alcanzan puntos donde el objetivo o una función de restricción no lineal es indefinido, no finita o compleja.

  • Los degradados analíticos pueden ser más precisos que las estimaciones de diferencias finitas.

  • Incluir un Hessiano puede conducir a una convergencia más rápida, lo que significa menos iteraciones.

  • Los degradados analíticos pueden ser más rápidos de calcular que las estimaciones de diferencias finitas, especialmente para problemas con una estructura dispersa. Sin embargo, para las expresiones complicadas, los degradados analíticos pueden ser más lentos de calcular.

A pesar de estas ventajas, el enfoque basado en problemas actualmente no utiliza información derivada. Para utilizar derivados en la optimización basada en problemas, convierta el problema utilizando y edite las funciones objetivas y de restricción resultantes.prob2struct

Crear problema de optimización

Cree una optimización no lineal basada en problemas. Con las variables de control 2-D y, utilice la función objetivaxy

fun1=100(x2x12)2+(1x1)2fun2=exp((xiyi)2)exp(exp(y1))sech(y2)objective = fun1 fun2.

Incluya la restricción de que la suma de los cuadrados de y no es más de 4.xy

no es una función racional de sus argumentos.fun2 Por lo tanto, para incluirlo en un problema de optimización, debe convertirlo en una expresión de optimización mediante.fcn2optimexpr

prob = optimproblem; x = optimvar('x',2); y = optimvar('y',2); fun1 = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2; fun2 = @(x,y)-exp(-sum((x - y).^2))*exp(-exp(-y(1)))*sech(y(2)); prob.Objective = fun1 + fcn2optimexpr(fun2,x,y); prob.Constraints.cons = sum(x.^2 + y.^2) <= 4;

Convertir problema en formulario basado en Solver

Para incluir derivados, convierta el problema en una estructura utilizando.prob2struct

problem = prob2struct(prob);

Durante la conversión, crea archivos de función que representan las funciones de restricción objetiva y no lineal.prob2struct De forma predeterminada, estas funciones tienen los nombres y.'generatedObjective.m''generatedConstraints.m'

Calcular derivados y mantener un seguimiento de las variables

Calcule los derivados asociados con las funciones de restricción objetiva y no lineal. Si tiene una licencia, puede utilizar la función o para ayudar a calcular los derivados.Symbolic Math Toolbox™gradient (Symbolic Math Toolbox)jacobian (Symbolic Math Toolbox) Ver.Calcula gradientes y hessianosSymbolic Math Toolbox

El enfoque basado en solucionador tiene una variable de control. Cada variable de optimización (o, en este ejemplo) es una parte de la variable de control.xy

Puede encontrar la asignación entre las variables de optimización y la variable de control única en el archivo de función objetivo generado,.'generatedObjective.m' El principio del archivo contiene estas líneas de código:

%% Variable indices. idx_x = [1 2]; idx_y = [3 4];  %% Map solver-based variables to problem-based. x = inputVariables(idx_x); x = x(:); y = inputVariables(idx_y); y = y(:);

En este código, la variable de control tiene el nombre.inputVariables

Como alternativa, puede encontrar la asignación mediante.varindex

idx = varindex(prob); disp(idx.x)
     1     2
disp(idx.y)
     3     4

Una vez que conozca la correlación, puede utilizar el cálculo estándar para encontrar las siguientes expresiones para el degradado de la función objetiva con respecto a la variable de control.gradobjective = fun1 + fun2[x(:);y(:)]

gradfun2=[σ1σ2σ1+dexp(y1)σ2dtanh(y2)],

Dónde

d=fun2(x;y)σ1=2(x1y1)dσ2=2(x2y2)d.

Edite los archivos de objetivo y restricción

Para incluir los degradados calculados en el archivo de función objetivo, edite de la siguiente manera.'generatedObjective.m'

%% Insert gradient calculation here.
% If you include a gradient, notify the solver by setting the
% SpecifyObjectiveGradient option to true.
if nargout > 1     c = exp(-sum((x - y).^2));     d = c*exp(-exp(-y(1)))*sech(y(2));     sigma1 = 2*(x(1) - y(1))*d;     sigma2 = 2*(x(2) - y(2))*d;     grad = zeros(4,1);     grad(1) = 2*x(1) - 400*x(1)*(x(2) - x(1)^2) + sigma1 - 2;     grad(2) = 200*x(2) - 200*x(1)^2 + sigma2;     grad(3) = -sigma1 - d*exp(-y(1));     grad(4) = -sigma2 + d*tanh(y(2));
end

Recuerde que la restricción no lineal es.x(1)^2 + x(2)^2 + y(1)^2 + y(2)^2 <= 4 Claramente, el degradado de esta función de restricción es.2*[x;y] Para incluir los degradados calculados de la restricción no lineal, edite de la siguiente manera.'generatedConstraints.m'

%% Insert gradient calculation here.
% If you include a gradient, notify the solver by setting the
% SpecifyConstraintGradient option to true.
if nargout > 2     cineqGrad = 2*[x;y];
    ceqGrad = [];
end

Ejecute el problema con dos métodos

Ejecute el problema utilizando los métodos basados en problemas y en el solucionador para ver las diferencias. Para ejecutar el problema utilizando información derivada, cree las opciones apropiadas en la estructura del problema.

options = optimoptions('fmincon','SpecifyObjectiveGradient',true,...     'SpecifyConstraintGradient',true); problem.options = options;

Los problemas no lineales requieren un campo no vacío en la estructura del problema.x0

x0 = [-1;2;1;-1]; problem.x0 = x0;

Llame a la estructura del problema.fmincon

[xsolver,fvalsolver,exitflagsolver,outputsolver] = fmincon(problem)
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>  xsolver =      0.8671     0.7505     1.0433     0.5140   fvalsolver =     -0.5500   exitflagsolver =       1   outputsolver =     struct with fields:           iterations: 46           funcCount: 77     constrviolation: 0            stepsize: 7.4091e-06           algorithm: 'interior-point'       firstorderopt: 7.5203e-07        cgiterations: 9             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, 7.520304e-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.↵↵'

Compare esta solución con la obtenida de, que no utiliza información derivada.solve

init.x = x0(1:2); init.y = x0(3:4); [xproblem,fvalproblem,exitflagproblem,outputproblem] = solve(prob,init)
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>  xproblem =     struct with fields:      x: [2×1 double]     y: [2×1 double]   fvalproblem =     -0.5500   exitflagproblem =       OptimalSolution   outputproblem =     struct with fields:           iterations: 48           funcCount: 276     constrviolation: 0            stepsize: 7.9340e-07           algorithm: 'interior-point'       firstorderopt: 6.5496e-07        cgiterations: 9             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.549635e-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.↵↵'              solver: 'fmincon'

Ambas soluciones informan el mismo valor de función para mostrar la precisión, y ambos requieren aproximadamente el mismo número de iteraciones (46 usando información de gradiente, 48 sin). Sin embargo, la solución que utiliza degradados solo requiere 77 evaluaciones de función, en comparación con 276 para la solución sin degradados.

Consulte también

|

Temas relacionados