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.

Resuelva la optimización no lineal restringida, basada en problemas

En este ejemplo se muestra cómo encontrar el mínimo de una función objetiva no lineal con una restricción no lineal mediante el enfoque basado en problemas. Para ver un vídeo que muestra la solución a un problema similar, consulte.Progamming no lineal basado en problemas

Para encontrar el valor mínimo de una función objetiva no lineal utilizando el enfoque basado en problemas, primero escriba la función objetivo como un archivo o una función anónima. La función objetiva de este ejemplo es

<math display="block">
<mrow>
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo>,</mo>
<mi>y</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<msup>
<mrow>
<mi>e</mi>
</mrow>
<mrow>
<mi>x</mi>
</mrow>
</msup>
<mrow>
<mo>(</mo>
<mn>4</mn>
<msup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>+</mo>
<mn>2</mn>
<msup>
<mrow>
<mi>y</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>+</mo>
<mn>4</mn>
<mi>x</mi>
<mi>y</mi>
<mo>+</mo>
<mn>2</mn>
<mi>y</mi>
<mo>-</mo>
<mn>1</mn>
<mo>)</mo>
</mrow>
<mo>.</mo>
</mrow>
</math>

type objfunx
function f = objfunx(x,y) f = exp(x).*(4*x.^2 + 2*y.^2 + 4*x.*y + 2*y - 1); end 

Cree las variables de problema de optimización y.xy

x = optimvar('x'); y = optimvar('y');

Convierta la función objetiva en una expresión de optimización utilizando.fcn2optimexpr Pase las variables y en la llamada para indicar qué variable de optimización corresponde a cada entrada.xyfcn2optimexprobjfunx

obj = fcn2optimexpr(@objfunx,x,y);

Cree un problema de optimización con la función objetiva.obj

prob = optimproblem('Objective',obj);

Cree una restricción no lineal que la solución se encuentra en una elipse inclinada, especificada como

<math display="block">
<mrow>
<mfrac>
<mrow>
<mi>x</mi>
<mi>y</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</mfrac>
<mo>+</mo>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo>+</mo>
<mn>2</mn>
<msup>
<mrow>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>+</mo>
<mfrac>
<mrow>
<mo stretchy="false">(</mo>
<mi>y</mi>
<mo>-</mo>
<mn>2</mn>
<msup>
<mrow>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</mfrac>
<mo></mo>
<mn>2</mn>
<mo>.</mo>
</mrow>
</math>

No es necesario crear y convertir la restricción como una función independiente porque es una función racional de las variables de optimización.

TiltEllipse = x.*y/2 + (x+2).^2 + (y-2).^2/2 <= 2;

Incluya la restricción en el problema.

prob.Constraints.constr = TiltEllipse;

Cree una estructura que represente el punto inicial como,.x = –3y = 3

x0.x = -3; x0.y = 3;

Revisa el problema.

showproblem(prob)
  OptimizationProblem :    minimize :        objfunx(x, y)   subject to constr:        ((((x .* y) ./ 2) + (x + 2).^2) + ((y - 2).^2 ./ 2)) <= 2       

Resuelve el problema.

[sol,fval] = solve(prob,x0)
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: -5.2813
    y: 4.6815

fval = 0.3299 

Pruebe un punto de inicio diferente.

x0.x = -1; x0.y = 1; [sol2,fval2] = solve(prob,x0)
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. 
sol2 = struct with fields:
    x: -0.8210
    y: 0.6696

fval2 = 0.7626 

Trace la elipse, los contornos de la función objetiva y las dos soluciones.

f = @objfunx; g = @(x,y) x.*y/2+(x+2).^2+(y-2).^2/2-2; rnge = [-5.5 -0.25 -0.25 7]; fimplicit(g,'k-') axis(rnge); hold on fcontour(f,rnge,'LevelList',logspace(-1,1)) plot(sol.x,sol.y,'ro','LineWidth',2) plot(sol2.x,sol2.y,'ko','LineWidth',2) legend('Constraint','f Contours','Global Solution','Local Solution','Location','northeast'); hold off

Las soluciones están en el límite de restricción no lineal. La trama del contorno muestra que estos son los únicos minima locales. La trama también muestra que hay un punto estacionario cerca de [– 2, 3/2], y el maxima local cerca de [– 2, 0] y [– 1, 4].

Consulte también

Temas relacionados