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.

Minimización no lineal basada en problemas con restricciones lineales

En este ejemplo se muestra cómo minimizar una función no lineal sujeta a restricciones de igualdad lineales mediante el enfoque basado en problemas, donde se formulan las restricciones en términos de variables de optimización. En este ejemplo también se muestra cómo convertir un archivo de función objetivo en una expresión de optimización mediante el uso de.fcn2optimexpr

El ejemplo utiliza un enfoque basado en solucionador que involucra el degradado y hessian.Minimización con restricciones de igualdad lineales Resolver el mismo problema utilizando el enfoque basado en problemas es sencillo, pero toma más tiempo de solución porque el enfoque basado en problemas actualmente no utiliza información de gradiente o hessian.

Crear problema y objetivo

El problema es minimizar

<math display="block">
<mrow>
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<munderover>
<mrow>
<mo></mo>
</mrow>
<mrow>
<mi>i</mi>
<mo>=</mo>
<mn>1</mn>
</mrow>
<mrow>
<mi>n</mi>
<mo>-</mo>
<mn>1</mn>
</mrow>
</munderover>
<mrow>
<mrow>
<mo>(</mo>
<mrow>
<mrow>
<msup>
<mrow>
<mrow>
<mo>(</mo>
<mrow>
<msubsup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mi>i</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
</mrow>
<mo>)</mo>
</mrow>
</mrow>
<mrow>
<mrow>
<mo>(</mo>
<mrow>
<msubsup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mi>i</mi>
<mo>+</mo>
<mn>1</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<mo>+</mo>
<mn>1</mn>
</mrow>
<mo>)</mo>
</mrow>
</mrow>
</msup>
</mrow>
<mo>+</mo>
<mrow>
<msup>
<mrow>
<mrow>
<mo>(</mo>
<mrow>
<msubsup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mi>i</mi>
<mo>+</mo>
<mn>1</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
</mrow>
<mo>)</mo>
</mrow>
</mrow>
<mrow>
<mrow>
<mo>(</mo>
<mrow>
<msubsup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mi>i</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<mo>+</mo>
<mn>1</mn>
</mrow>
<mo>)</mo>
</mrow>
</mrow>
</msup>
</mrow>
</mrow>
<mo>)</mo>
</mrow>
</mrow>
<mo>,</mo>
</mrow>
</math>

sujeto a un conjunto de restricciones de igualdad lineales.Aeq*x = beq Empiece por crear un problema de optimización y variables.

prob = optimproblem; N = 1000; x = optimvar('x',N);

La función objetivo está en el archivo incluido en la instalación de Optimization Toolbox™.brownfgh.m Convierta la función en una expresión de optimización mediante.fcn2optimexpr

prob.Objective = fcn2optimexpr(@brownfgh,x,'OutputSize',[1,1]);

Incluir restricciones

Para obtener las matrices y en el área de trabajo, ejecute este comando.Aeqbeq

load browneq

Incluya las restricciones lineales en el problema.

prob.Constraints = Aeq*x == beq;

Revise y resuelva el problema

Revise el objetivo del problema.

showexpr(prob.Objective)
  brownfgh(x) 

El problema tiene 100 restricciones de igualdad lineales, por lo que la expresión de restricción resultante es demasiado larga para incluirlo en el ejemplo. Para mostrar las restricciones, quite el comentario y ejecute la siguiente línea.

% showconstr(prob.Constraints)

Establezca un punto inicial como una estructura con campo.x

x0.x = -ones(N,1); x0.x(2:2:N) = 1;

Resuelva el problema llamando.solve

[sol,fval,exitflag,output] = solve(prob,x0)
Solver stopped prematurely.  fmincon stopped because it exceeded the function evaluation limit, options.MaxFunctionEvaluations = 3.000000e+03. 
sol = struct with fields:
    x: [1000x1 double]

fval = 207.5463 
exitflag =      SolverLimitExceeded  
output = struct with fields:
         iterations: 2
          funcCount: 3007
    constrviolation: 2.4336e-13
           stepsize: 1.9303
          algorithm: 'interior-point'
      firstorderopt: 2.6432
       cgiterations: 0
            message: '...'
             solver: 'fmincon'

El solucionador se detiene prematuramente porque excede el límite de evaluación de la función. Para continuar con la optimización, reinicie la optimización desde el punto final y permita más evaluaciones de funciones.

options = optimoptions(prob,'MaxFunctionEvaluations',1e5); [sol,fval,exitflag,output] = solve(prob,sol,'Options',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. 
sol = struct with fields:
    x: [1000x1 double]

fval = 205.9313 
exitflag =      OptimalSolution  
output = struct with fields:
         iterations: 35
          funcCount: 36073
    constrviolation: 2.4869e-14
           stepsize: 1.0699e-05
          algorithm: 'interior-point'
      firstorderopt: 4.6142e-06
       cgiterations: 5
            message: '...'
             solver: 'fmincon'

Compare con la solución basada en Solver

Para resolver el problema utilizando el enfoque basado en Solver como se muestra en, convierta el punto inicial en un vector.Minimización con restricciones de igualdad lineales A continuación, configure las opciones para usar el degradado y la información de hessian proporcionada.brownfgh

xstart = x0.x; fun = @brownfgh; opts = optimoptions('fmincon','SpecifyObjectiveGradient',true,'HessianFcn','objective',...     'Algorithm','trust-region-reflective'); [x,fval,exitflag,output] = ...    fmincon(fun,xstart,[],[],Aeq,beq,[],[],[],opts);
Local minimum possible.  fmincon stopped because the final change in function value relative to  its initial value is less than the value of the function tolerance. 
fprintf("Fval = %g\nNumber of iterations = %g\nNumber of function evals = %g.\n",...     fval,output.iterations,output.funcCount)
Fval = 205.931 Number of iterations = 22 Number of function evals = 23. 

La solución basada en el solucionador utiliza los degradados y hessian proporcionados en la función objetiva.Minimización con restricciones de igualdad lineales Mediante el uso de esa información derivada, el solucionador converge a la solución en 22 iteraciones, utilizando sólo 23 evaluaciones de función.fmincon La solución basada en solucionador tiene el mismo valor de función objetivo final que esta solución basada en problemas.

Sin embargo, construir el gradiente y las funciones de Hessian sin usar matemáticas simbólicas es difícil y propenso a errores. Para ver un ejemplo que muestra cómo utilizar cálculos simbólicos para calcular derivados, consulte.Calcula gradientes y hessianosSymbolic Math Toolbox

Consulte también

Temas relacionados